xm_api.c revision 298be2b028263b2c343a707662c6fbfa18293cb2
1693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
2693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Mesa 3-D graphics library
3fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian * Version:  7.1
45e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
5fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian * Copyright (C) 1999-2007  Brian Paul   All Rights Reserved.
65e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
7693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Permission is hereby granted, free of charge, to any person obtaining a
8693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * copy of this software and associated documentation files (the "Software"),
9693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * to deal in the Software without restriction, including without limitation
10693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * and/or sell copies of the Software, and to permit persons to whom the
12693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Software is furnished to do so, subject to the following conditions:
135e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
14693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * The above copyright notice and this permission notice shall be included
15693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * in all copies or substantial portions of the Software.
165e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
17693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
21693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
24693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
25d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul/**
26d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul * \file xm_api.c
27d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul *
28d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul * All the XMesa* API functions.
29693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *
30693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *
31693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * NOTES:
32693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *
33693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * The window coordinate system origin (0,0) is in the lower-left corner
34693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * of the window.  X11's window coordinate origin is in the upper-left
35693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * corner of the window.  Therefore, most drawing functions in this
36693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * file have to flip Y coordinates.
37693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *
38693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Define USE_XSHM in the Makefile with -DUSE_XSHM if you want to compile
39693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * in support for the MIT Shared Memory extension.  If enabled, when you
40693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * use an Ximage for the back buffer in double buffered mode, the "swap"
41693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * operation will be faster.  You must also link with -lXext.
42693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *
43693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Byte swapping:  If the Mesa host and the X display use a different
44693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * byte order then there's some trickiness to be aware of when using
45693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * XImages.  The byte ordering used for the XImage is that of the X
46693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * display, not the Mesa host.
47693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * The color-to-pixel encoding for True/DirectColor must be done
48693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * according to the display's visual red_mask, green_mask, and blue_mask.
49693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * If XPutPixel is used to put a pixel into an XImage then XPutPixel will
50693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * do byte swapping if needed.  If one wants to directly "poke" the pixel
51693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * into the XImage's buffer then the pixel must be byte swapped first.  In
52693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Mesa, when byte swapping is needed we use the PF_TRUECOLOR pixel format
53693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * and use XPutPixel everywhere except in the implementation of
54693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * glClear(GL_COLOR_BUFFER_BIT).  We want this function to be fast so
55693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * instead of using XPutPixel we "poke" our values after byte-swapping
56693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * the clear pixel value if needed.
57693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *
58693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
59693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
60693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef __CYGWIN__
61693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#undef WIN32
62693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#undef __WIN32__
63693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
64693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
65693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#include "glxheader.h"
66693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#include "xmesaP.h"
67bf5e573926b2b007cb238afae86207e075603f1eBrian Paul#include "main/context.h"
68bf5e573926b2b007cb238afae86207e075603f1eBrian Paul#include "main/extensions.h"
69bf5e573926b2b007cb238afae86207e075603f1eBrian Paul#include "main/framebuffer.h"
70bf5e573926b2b007cb238afae86207e075603f1eBrian Paul#include "main/imports.h"
71bf5e573926b2b007cb238afae86207e075603f1eBrian Paul#include "main/macros.h"
72bf5e573926b2b007cb238afae86207e075603f1eBrian Paul#include "main/renderbuffer.h"
73bf5e573926b2b007cb238afae86207e075603f1eBrian Paul#include "main/teximage.h"
74374e7fd6cc95d3d91629a6e1c951d77e8a29c31cBrian Paul#include "glapi/glthread.h"
75724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/swrast.h"
76ec0585883a85a495d94e24970d64e5d6fc889147Keith Whitwell#include "swrast_setup/swrast_setup.h"
7748f5deab94be832a782a440f55a7bc742d50a62fKeith Whitwell#include "vbo/vbo.h"
7823caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell#include "tnl/tnl.h"
79d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul#include "tnl/t_context.h"
80d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul#include "tnl/t_pipeline.h"
81d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul#include "drivers/common/driverfuncs.h"
82da9d8f192431b0142e65bceb5ca8a2e52e21ac90Brian Paul#include "drivers/common/meta.h"
83d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul
84d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul/**
85693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Global X driver lock
86693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
87693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul_glthread_Mutex _xmesa_lock;
88693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
89693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
90693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
91d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul/**
92693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Lookup tables for HPCR pixel format:
93693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
94693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic short hpcr_rgbTbl[3][256] = {
95693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
96693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 16,  16,  17,  17,  18,  18,  19,  19,  20,  20,  21,  21,  22,  22,  23,  23,
97693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 24,  24,  25,  25,  26,  26,  27,  27,  28,  28,  29,  29,  30,  30,  31,  31,
98693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 32,  32,  33,  33,  34,  34,  35,  35,  36,  36,  37,  37,  38,  38,  39,  39,
99693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,
100693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,
101693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
102693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95,
103693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 96,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
104693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127,
105693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143,
106693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
107693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175,
108693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
109693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207,
110693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223,
111693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239
112693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul},
113693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
114693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 16,  16,  17,  17,  18,  18,  19,  19,  20,  20,  21,  21,  22,  22,  23,  23,
115693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 24,  24,  25,  25,  26,  26,  27,  27,  28,  28,  29,  29,  30,  30,  31,  31,
116693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 32,  32,  33,  33,  34,  34,  35,  35,  36,  36,  37,  37,  38,  38,  39,  39,
117693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,
118693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,
119693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
120693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95,
121693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 96,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
122693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127,
123693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143,
124693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
125693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175,
126693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
127693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207,
128693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223,
129693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239
130693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul},
131693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
132693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 32,  32,  33,  33,  34,  34,  35,  35,  36,  36,  37,  37,  38,  38,  39,  39,
133693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 40,  40,  41,  41,  42,  42,  43,  43,  44,  44,  45,  45,  46,  46,  47,  47,
134693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 48,  48,  49,  49,  50,  50,  51,  51,  52,  52,  53,  53,  54,  54,  55,  55,
135693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 56,  56,  57,  57,  58,  58,  59,  59,  60,  60,  61,  61,  62,  62,  63,  63,
136693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 64,  64,  65,  65,  66,  66,  67,  67,  68,  68,  69,  69,  70,  70,  71,  71,
137693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 72,  72,  73,  73,  74,  74,  75,  75,  76,  76,  77,  77,  78,  78,  79,  79,
138693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 80,  80,  81,  81,  82,  82,  83,  83,  84,  84,  85,  85,  86,  86,  87,  87,
139693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95,
140693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 96,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
141693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127,
142693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143,
143693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
144693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175,
145693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
146693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207,
147693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223
1485e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen}
149693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul};
150693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
151693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
152693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
153693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/**********************************************************************/
154693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*****                     X Utility Functions                    *****/
155693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/**********************************************************************/
156693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
157693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
158d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul/**
159693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return the host's byte order as LSBFirst or MSBFirst ala X.
160693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
161693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifndef XFree86Server
162693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic int host_byte_order( void )
163693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
164693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   int i = 1;
165693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   char *cptr = (char *) &i;
166693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return (*cptr==1) ? LSBFirst : MSBFirst;
167693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
168693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
169693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
170693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
171d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul/**
172693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Check if the X Shared Memory extension is available.
173693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return:  0 = not available
174693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *          1 = shared XImage support available
175693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *          2 = shared Pixmap support available also
176693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
177693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic int check_for_xshm( XMesaDisplay *display )
178693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1797439a36785b6a2783e80a40a96c09db8f56dc2bcGeorge Sapountzis#if defined(USE_XSHM) && !defined(XFree86Server)
180693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   int major, minor, ignore;
181693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   Bool pixmaps;
182693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
183693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (XQueryExtension( display, "MIT-SHM", &ignore, &ignore, &ignore )) {
184693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (XShmQueryVersion( display, &major, &minor, &pixmaps )==True) {
185693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 return (pixmaps==True) ? 2 : 1;
186693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
187693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      else {
188693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 return 0;
189693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
190693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
191693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
192693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return 0;
193693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
194693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
195692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul   /* No  XSHM support */
196693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return 0;
197693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
198693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
199693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
200693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
201d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul/**
202693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Apply gamma correction to an intensity value in [0..max].  Return the
203693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * new intensity value.
204693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
205d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paulstatic GLint
206d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paulgamma_adjust( GLfloat gamma, GLint value, GLint max )
207693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
208693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (gamma == 1.0) {
209693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return value;
210693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
211693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
212693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      double x = (double) value / (double) max;
213367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul      return IROUND_POS((GLfloat) max * _mesa_pow(x, 1.0F/gamma));
214693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
215693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
216693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
217693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
218693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
219d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul/**
220693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return the true number of bits per pixel for XImages.
221693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * For example, if we request a 24-bit deep visual we may actually need/get
222693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * 32bpp XImages.  This function returns the appropriate bpp.
223693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Input:  dpy - the X display
224693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         visinfo - desribes the visual to be used for XImages
225693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return:  true number of bits per pixel for XImages
226693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
227d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paulstatic int
228d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paulbits_per_pixel( XMesaVisual xmv )
229693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
230d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul#ifdef XFree86Server
231304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick   const int depth = xmv->nplanes;
232693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   int i;
2331814d6541b1fb4bad67fb6277a6fcbe518453230Brian Paul   assert(depth > 0);
234693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   for (i = 0; i < screenInfo.numPixmapFormats; i++) {
235693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (screenInfo.formats[i].depth == depth)
236693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return screenInfo.formats[i].bitsPerPixel;
237693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
238693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return depth;  /* should never get here, but this should be safe */
239693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
240693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaDisplay *dpy = xmv->display;
241693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaVisualInfo visinfo = xmv->visinfo;
242693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaImage *img;
243693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   int bitsPerPixel;
244693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Create a temporary XImage */
245693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   img = XCreateImage( dpy, visinfo->visual, visinfo->depth,
246693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		       ZPixmap, 0,           /*format, offset*/
247693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		       (char*) MALLOC(8),    /*data*/
248693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		       1, 1,                 /*width, height*/
249693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		       32,                   /*bitmap_pad*/
250693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		       0                     /*bytes_per_line*/
251693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                     );
252693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   assert(img);
253693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* grab the bits/pixel value */
254693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   bitsPerPixel = img->bits_per_pixel;
255693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* free the XImage */
25632f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg   free( img->data );
257693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   img->data = NULL;
258693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaDestroyImage( img );
259693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return bitsPerPixel;
260693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
261d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul}
262693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
263693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
264693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
265693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
266693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Determine if a given X window ID is valid (window exists).
267693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Do this by calling XGetWindowAttributes() for the window and
268693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * checking if we catch an X error.
269693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Input:  dpy - the display
270693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         win - the window to check for existance
271693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return:  GL_TRUE - window exists
272693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *          GL_FALSE - window doesn't exist
273693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
274693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifndef XFree86Server
275693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic GLboolean WindowExistsFlag;
276693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
277693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic int window_exists_err_handler( XMesaDisplay* dpy, XErrorEvent* xerr )
278693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
279693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   (void) dpy;
280693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (xerr->error_code == BadWindow) {
281693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      WindowExistsFlag = GL_FALSE;
282693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
283693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return 0;
284693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
285693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
286693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic GLboolean window_exists( XMesaDisplay *dpy, Window win )
287693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
288693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XWindowAttributes wa;
289693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   int (*old_handler)( XMesaDisplay*, XErrorEvent* );
290693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   WindowExistsFlag = GL_TRUE;
291693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   old_handler = XSetErrorHandler(window_exists_err_handler);
292693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XGetWindowAttributes( dpy, win, &wa ); /* dummy request */
293693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XSetErrorHandler(old_handler);
294693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return WindowExistsFlag;
295693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
296693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
297fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrianstatic Status
29824d965fab52f790188e5de6e67e7387809b1f145Michel Dänzerget_drawable_size( XMesaDisplay *dpy, Drawable d, GLuint *width, GLuint *height )
299fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian{
300fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   Window root;
301fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   Status stat;
302fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   int xpos, ypos;
303fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   unsigned int w, h, bw, depth;
304fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   stat = XGetGeometry(dpy, d, &root, &xpos, &ypos, &w, &h, &bw, &depth);
305fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   *width = w;
306fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   *height = h;
307fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   return stat;
308fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian}
30924d965fab52f790188e5de6e67e7387809b1f145Michel Dänzer#endif
310fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian
311693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
312d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul/**
313d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul * Return the size of the window (or pixmap) that corresponds to the
314d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul * given XMesaBuffer.
315d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul * \param width  returns width in pixels
316d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul * \param height  returns height in pixels
317d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul */
318d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paulvoid
319d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paulxmesa_get_window_size(XMesaDisplay *dpy, XMesaBuffer b,
320d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul                      GLuint *width, GLuint *height)
321d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul{
322d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul#ifdef XFree86Server
323d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   *width = MIN2(b->frontxrb->drawable->width, MAX_WIDTH);
324d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   *height = MIN2(b->frontxrb->drawable->height, MAX_HEIGHT);
325d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul#else
326d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   Status stat;
327d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul
328d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   _glthread_LOCK_MUTEX(_xmesa_lock);
329d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   XSync(b->xm_visual->display, 0); /* added for Chromium */
330fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   stat = get_drawable_size(dpy, b->frontxrb->pixmap, width, height);
331d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   _glthread_UNLOCK_MUTEX(_xmesa_lock);
332d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul
333fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   if (!stat) {
334d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul      /* probably querying a window that's recently been destroyed */
335d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul      _mesa_warning(NULL, "XGetGeometry failed!\n");
336d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul      *width = *height = 1;
337d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   }
338d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul#endif
339d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul}
340d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul
341d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul
342d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul
343693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/**********************************************************************/
344693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*****                Linked list of XMesaBuffers                 *****/
345693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/**********************************************************************/
346693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
347928a70e4354d4884e2918ec67ddc6d8baf942c8aBrianXMesaBuffer XMesaBufferList = NULL;
348693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
349693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
3508d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul/**
351d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul * Allocate a new XMesaBuffer object which corresponds to the given drawable.
352d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul * Note that XMesaBuffer is derived from GLframebuffer.
353d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul * The new XMesaBuffer will not have any size (Width=Height=0).
354d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul *
355d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul * \param d  the corresponding X drawable (window or pixmap)
356d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul * \param type  either WINDOW, PIXMAP or PBUFFER, describing d
357d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul * \param vis  the buffer's visual
358d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul * \param cmap  the window's colormap, if known.
359d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul * \return new XMesaBuffer or NULL if any problem
3608d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul */
3618d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paulstatic XMesaBuffer
362d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paulcreate_xmesa_buffer(XMesaDrawable d, BufferType type,
363d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul                    XMesaVisual vis, XMesaColormap cmap)
364693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
365d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   XMesaBuffer b;
366e5fce1694cdfca615022bf7b987835384902acebBrian Paul
367d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   ASSERT(type == WINDOW || type == PIXMAP || type == PBUFFER);
3688d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul
369d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   b = (XMesaBuffer) CALLOC_STRUCT(xmesa_buffer);
370d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   if (!b)
371d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul      return NULL;
372d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul
373d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   b->display = vis->display;
374d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   b->xm_visual = vis;
375d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   b->type = type;
376d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   b->cmap = cmap;
3778d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul
3782ec50d256d49ff3b987459ed42a5dc66f02a6b9dFrancisco Jerez   _mesa_initialize_window_framebuffer(&b->mesa_buffer, &vis->mesa_visual);
379928a70e4354d4884e2918ec67ddc6d8baf942c8aBrian   b->mesa_buffer.Delete = xmesa_delete_framebuffer;
380e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
381d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   /*
382d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul    * Front renderbuffer
383d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul    */
38437fd6be41134df46cb9dad7f9201188ff9707629Brian   b->frontxrb = xmesa_new_renderbuffer(NULL, 0, &vis->mesa_visual, GL_FALSE);
385d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   if (!b->frontxrb) {
38632f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free(b);
387d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul      return NULL;
388d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   }
389d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   b->frontxrb->Parent = b;
390d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   b->frontxrb->drawable = d;
391d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   b->frontxrb->pixmap = (XMesaPixmap) d;
392d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   _mesa_add_renderbuffer(&b->mesa_buffer, BUFFER_FRONT_LEFT,
393d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul                          &b->frontxrb->Base);
394e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
395d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   /*
396d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul    * Back renderbuffer
397d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul    */
398d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   if (vis->mesa_visual.doubleBufferMode) {
39937fd6be41134df46cb9dad7f9201188ff9707629Brian      b->backxrb = xmesa_new_renderbuffer(NULL, 0, &vis->mesa_visual, GL_TRUE);
400d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul      if (!b->backxrb) {
401d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul         /* XXX free front xrb too */
40232f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg         free(b);
403d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul         return NULL;
404e5fce1694cdfca615022bf7b987835384902acebBrian Paul      }
405d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul      b->backxrb->Parent = b;
406d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul      /* determine back buffer implementation */
407d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul      b->db_mode = vis->ximage_flag ? BACK_XIMAGE : BACK_PIXMAP;
408d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul
409d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul      _mesa_add_renderbuffer(&b->mesa_buffer, BUFFER_BACK_LEFT,
410d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul                             &b->backxrb->Base);
411d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   }
412e5fce1694cdfca615022bf7b987835384902acebBrian Paul
413d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   /*
414d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul    * Software alpha planes
415d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul    */
416d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   if (vis->mesa_visual.alphaBits > 0
417d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul       && vis->undithered_pf != PF_8A8B8G8R
418d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul       && vis->undithered_pf != PF_8A8R8G8B) {
419d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul      /* Visual has alpha, but pixel format doesn't support it.
420d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul       * We'll use an alpha renderbuffer wrapper.
421d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul       */
4228e1c3bd0b4c599bae5b64cd51cec1d74266f30fbBrian      b->swAlpha = GL_TRUE;
423d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   }
424d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   else {
4258e1c3bd0b4c599bae5b64cd51cec1d74266f30fbBrian      b->swAlpha = GL_FALSE;
426693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
427d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul
428d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   /*
429d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul    * Other renderbuffer (depth, stencil, etc)
430d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul    */
431d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   _mesa_add_soft_renderbuffers(&b->mesa_buffer,
432d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul                                GL_FALSE,  /* color */
433d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul                                vis->mesa_visual.haveDepthBuffer,
434d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul                                vis->mesa_visual.haveStencilBuffer,
435d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul                                vis->mesa_visual.haveAccumBuffer,
4368e1c3bd0b4c599bae5b64cd51cec1d74266f30fbBrian                                b->swAlpha,
437d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul                                vis->mesa_visual.numAuxBuffers > 0 );
4388e1c3bd0b4c599bae5b64cd51cec1d74266f30fbBrian
439fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   /* GLX_EXT_texture_from_pixmap */
440fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   b->TextureTarget = 0;
441fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   b->TextureFormat = GLX_TEXTURE_FORMAT_NONE_EXT;
442fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   b->TextureMipmap = 0;
443fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian
444d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   /* insert buffer into linked list */
445d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   b->Next = XMesaBufferList;
446d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   XMesaBufferList = b;
447d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul
448693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return b;
449693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
450693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
451693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
452d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul/**
453693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Find an XMesaBuffer by matching X display and colormap but NOT matching
454693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * the notThis buffer.
455693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
456928a70e4354d4884e2918ec67ddc6d8baf942c8aBrianXMesaBuffer
457928a70e4354d4884e2918ec67ddc6d8baf942c8aBrianxmesa_find_buffer(XMesaDisplay *dpy, XMesaColormap cmap, XMesaBuffer notThis)
458693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
459693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaBuffer b;
460693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   for (b=XMesaBufferList; b; b=b->Next) {
461693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (b->display==dpy && b->cmap==cmap && b!=notThis) {
462693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return b;
463693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
464693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
465693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return NULL;
466693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
467693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
468693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
469d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul/**
470928a70e4354d4884e2918ec67ddc6d8baf942c8aBrian * Remove buffer from linked list, delete if no longer referenced.
471693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
472d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paulstatic void
473928a70e4354d4884e2918ec67ddc6d8baf942c8aBrianxmesa_free_buffer(XMesaBuffer buffer)
474693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
475693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaBuffer prev = NULL, b;
476928a70e4354d4884e2918ec67ddc6d8baf942c8aBrian
477928a70e4354d4884e2918ec67ddc6d8baf942c8aBrian   for (b = XMesaBufferList; b; b = b->Next) {
478928a70e4354d4884e2918ec67ddc6d8baf942c8aBrian      if (b == buffer) {
479928a70e4354d4884e2918ec67ddc6d8baf942c8aBrian         struct gl_framebuffer *fb = &buffer->mesa_buffer;
480928a70e4354d4884e2918ec67ddc6d8baf942c8aBrian
481928a70e4354d4884e2918ec67ddc6d8baf942c8aBrian         /* unlink buffer from list */
482693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         if (prev)
483693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            prev->Next = buffer->Next;
484693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         else
485693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            XMesaBufferList = buffer->Next;
4861832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul
487928a70e4354d4884e2918ec67ddc6d8baf942c8aBrian         /* mark as delete pending */
488928a70e4354d4884e2918ec67ddc6d8baf942c8aBrian         fb->DeletePending = GL_TRUE;
4893049946fa742b654afa9b24f8bc79f387f01aea9Brian
4903049946fa742b654afa9b24f8bc79f387f01aea9Brian         /* Since the X window for the XMesaBuffer is going away, we don't
4913049946fa742b654afa9b24f8bc79f387f01aea9Brian          * want to dereference this pointer in the future.
4923049946fa742b654afa9b24f8bc79f387f01aea9Brian          */
4933049946fa742b654afa9b24f8bc79f387f01aea9Brian         b->frontxrb->drawable = 0;
4943049946fa742b654afa9b24f8bc79f387f01aea9Brian
495a510bc3ee1a696da120c09ee4ec33dc033f671acBrian         /* Unreference.  If count = zero we'll really delete the buffer */
4967eb5a2892d3d89f4b1800311babb40af1ec7d4e5Brian Paul         _mesa_reference_framebuffer(&fb, NULL);
4971832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul
498693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return;
499693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
500693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* continue search */
501693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      prev = b;
502693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
503693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* buffer not found in XMesaBufferList */
504928a70e4354d4884e2918ec67ddc6d8baf942c8aBrian   _mesa_problem(NULL,"xmesa_free_buffer() - buffer not found\n");
505693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
506693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
507693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
508d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul/**
509d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul * Copy X color table stuff from one XMesaBuffer to another.
510d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul */
511d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paulstatic void
512d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paulcopy_colortable_info(XMesaBuffer dst, const XMesaBuffer src)
513693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
514e197de56cdb86835f1437688a9161cd909792d80Brian Paul   memcpy(dst->color_table, src->color_table, sizeof(src->color_table));
515e197de56cdb86835f1437688a9161cd909792d80Brian Paul   memcpy(dst->pixel_to_r, src->pixel_to_r, sizeof(src->pixel_to_r));
516e197de56cdb86835f1437688a9161cd909792d80Brian Paul   memcpy(dst->pixel_to_g, src->pixel_to_g, sizeof(src->pixel_to_g));
517e197de56cdb86835f1437688a9161cd909792d80Brian Paul   memcpy(dst->pixel_to_b, src->pixel_to_b, sizeof(src->pixel_to_b));
518693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   dst->num_alloced = src->num_alloced;
519e197de56cdb86835f1437688a9161cd909792d80Brian Paul   memcpy(dst->alloced_colors, src->alloced_colors,
520693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul          sizeof(src->alloced_colors));
521693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
522693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
523693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
524693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
525693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/**********************************************************************/
526693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*****                   Misc Private Functions                   *****/
527693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/**********************************************************************/
528693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
529693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
530e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul/**
531693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * A replacement for XAllocColor.  This function should never
532693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * fail to allocate a color.  When XAllocColor fails, we return
533693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * the nearest matching color.  If we have to allocate many colors
534693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * this function isn't too efficient; the XQueryColors() could be
535693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * done just once.
536693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Written by Michael Pichler, Brian Paul, Mark Kilgard
537693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Input:  dpy - X display
538693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         cmap - X colormap
539693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         cmapSize - size of colormap
540693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * In/Out: color - the XColor struct
541693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Output:  exact - 1=exact color match, 0=closest match
542693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *          alloced - 1=XAlloc worked, 0=XAlloc failed
543693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
544693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic void
545693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulnoFaultXAllocColor( int client,
546693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                    XMesaDisplay *dpy,
547693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                    XMesaColormap cmap,
548693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                    int cmapSize,
549693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                    XMesaColor *color,
550693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                    int *exact, int *alloced )
551693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
552693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
553693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   Pixel *ppixIn;
554693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   xrgb *ctable;
555693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
556693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* we'll try to cache ctable for better remote display performance */
557693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   static Display *prevDisplay = NULL;
558693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   static XMesaColormap prevCmap = 0;
559693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   static int prevCmapSize = 0;
560693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   static XMesaColor *ctable = NULL;
561693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
562693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaColor subColor;
563693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   int i, bestmatch;
564693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   double mindist;       /* 3*2^16^2 exceeds long int precision. */
565693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
566693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   (void) client;
567693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
568693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* First try just using XAllocColor. */
569693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
570693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (AllocColor(cmap,
571693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		  &color->red, &color->green, &color->blue,
572693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		  &color->pixel,
573d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul		  client) == Success)
574693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
575d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   if (XAllocColor(dpy, cmap, color))
576693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
577d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   {
578693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      *exact = 1;
579693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      *alloced = 1;
580693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return;
581693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
582693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
583693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Alloc failed, search for closest match */
584693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
585693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Retrieve color table entries. */
586693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* XXX alloca candidate. */
587693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
588693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   ppixIn = (Pixel *) MALLOC(cmapSize * sizeof(Pixel));
589693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   ctable = (xrgb *) MALLOC(cmapSize * sizeof(xrgb));
590693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   for (i = 0; i < cmapSize; i++) {
591693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      ppixIn[i] = i;
592693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
593693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   QueryColors(cmap, cmapSize, ppixIn, ctable);
594693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
595693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (prevDisplay != dpy || prevCmap != cmap
596693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       || prevCmapSize != cmapSize || !ctable) {
597693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* free previously cached color table */
598693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (ctable)
59932f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg         free(ctable);
600693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Get the color table from X */
601693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      ctable = (XMesaColor *) MALLOC(cmapSize * sizeof(XMesaColor));
602693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      assert(ctable);
603693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      for (i = 0; i < cmapSize; i++) {
604693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         ctable[i].pixel = i;
605693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
606693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      XQueryColors(dpy, cmap, ctable, cmapSize);
607693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      prevDisplay = dpy;
608693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      prevCmap = cmap;
609693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      prevCmapSize = cmapSize;
610693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
611693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
612693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
613693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Find best match. */
614693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   bestmatch = -1;
615693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   mindist = 0.0;
616693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   for (i = 0; i < cmapSize; i++) {
617693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      double dr = 0.30 * ((double) color->red - (double) ctable[i].red);
618693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      double dg = 0.59 * ((double) color->green - (double) ctable[i].green);
619693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      double db = 0.11 * ((double) color->blue - (double) ctable[i].blue);
620693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      double dist = dr * dr + dg * dg + db * db;
621693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (bestmatch < 0 || dist < mindist) {
622693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         bestmatch = i;
623693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         mindist = dist;
624693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
625693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
626693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
627693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Return result. */
628693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   subColor.red   = ctable[bestmatch].red;
629693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   subColor.green = ctable[bestmatch].green;
630693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   subColor.blue  = ctable[bestmatch].blue;
631693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Try to allocate the closest match color.  This should only
632693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * fail if the cell is read/write.  Otherwise, we're incrementing
633693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * the cell's reference count.
634693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    */
635693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
636693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (AllocColor(cmap,
637693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		  &subColor.red, &subColor.green, &subColor.blue,
638693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		  &subColor.pixel,
639693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		  client) == Success) {
640693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
641693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (XAllocColor(dpy, cmap, &subColor)) {
642693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
643693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      *alloced = 1;
644693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
645693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
646693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* do this to work around a problem reported by Frank Ortega */
647693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      subColor.pixel = (unsigned long) bestmatch;
648693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      subColor.red   = ctable[bestmatch].red;
649693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      subColor.green = ctable[bestmatch].green;
6505e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen      subColor.blue  = ctable[bestmatch].blue;
651693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      subColor.flags = DoRed | DoGreen | DoBlue;
652693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      *alloced = 0;
653693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
654693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
65532f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg   free(ppixIn);
65632f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg   free(ctable);
657693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
658693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* don't free table, save it for next time */
659693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
660693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
661693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   *color = subColor;
662693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   *exact = 0;
663693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
664693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
665693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
666693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
667d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul/**
668693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Do setup for PF_GRAYSCALE pixel format.
669693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Note that buffer may be NULL.
670693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
671d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paulstatic GLboolean
672d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paulsetup_grayscale(int client, XMesaVisual v,
673d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul                XMesaBuffer buffer, XMesaColormap cmap)
674693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
675693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (GET_VISUAL_DEPTH(v)<4 || GET_VISUAL_DEPTH(v)>16) {
676693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return GL_FALSE;
677693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
678693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
679693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (buffer) {
680693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      XMesaBuffer prevBuffer;
681693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
682693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (!cmap) {
683693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return GL_FALSE;
684693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
685693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
686928a70e4354d4884e2918ec67ddc6d8baf942c8aBrian      prevBuffer = xmesa_find_buffer(v->display, cmap, buffer);
687693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (prevBuffer &&
6881832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul          (buffer->xm_visual->mesa_visual.rgbMode ==
6891832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul           prevBuffer->xm_visual->mesa_visual.rgbMode)) {
690693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* Copy colormap stuff from previous XMesaBuffer which uses same
691693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul          * X colormap.  Do this to avoid time spent in noFaultXAllocColor.
692693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul          */
693693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         copy_colortable_info(buffer, prevBuffer);
694693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
695693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      else {
696693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* Allocate 256 shades of gray */
697693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         int gray;
698693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         int colorsfailed = 0;
699693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         for (gray=0;gray<256;gray++) {
700693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            GLint r = gamma_adjust( v->RedGamma,   gray, 255 );
701693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            GLint g = gamma_adjust( v->GreenGamma, gray, 255 );
702693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            GLint b = gamma_adjust( v->BlueGamma,  gray, 255 );
703693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            int exact, alloced;
704693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            XMesaColor xcol;
705693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            xcol.red   = (r << 8) | r;
706693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            xcol.green = (g << 8) | g;
707693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            xcol.blue  = (b << 8) | b;
708693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            noFaultXAllocColor( client, v->display,
709693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                cmap, GET_COLORMAP_SIZE(v),
710693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                &xcol, &exact, &alloced );
711693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            if (!exact) {
712693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul               colorsfailed++;
713693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            }
714693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            if (alloced) {
715693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul               assert(buffer->num_alloced<256);
716693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul               buffer->alloced_colors[buffer->num_alloced] = xcol.pixel;
717693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul               buffer->num_alloced++;
718693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            }
719693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
720693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            /*OLD
721693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            assert(gray < 576);
722693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            buffer->color_table[gray*3+0] = xcol.pixel;
723693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            buffer->color_table[gray*3+1] = xcol.pixel;
724693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            buffer->color_table[gray*3+2] = xcol.pixel;
725693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            assert(xcol.pixel < 65536);
726693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            buffer->pixel_to_r[xcol.pixel] = gray * 30 / 100;
727693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            buffer->pixel_to_g[xcol.pixel] = gray * 59 / 100;
728693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            buffer->pixel_to_b[xcol.pixel] = gray * 11 / 100;
729693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            */
730693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            buffer->color_table[gray] = xcol.pixel;
731693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            assert(xcol.pixel < 65536);
732693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            buffer->pixel_to_r[xcol.pixel] = gray;
733693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            buffer->pixel_to_g[xcol.pixel] = gray;
734693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            buffer->pixel_to_b[xcol.pixel] = gray;
735693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
736693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
737367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul         if (colorsfailed && _mesa_getenv("MESA_DEBUG")) {
7382ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul            _mesa_warning(NULL,
739693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  "Note: %d out of 256 needed colors do not match exactly.\n",
740693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  colorsfailed );
741693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
742693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
743693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
744693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
745449e47f06a46c42fb9895d13f37b599600225e56Brian Paul   v->dithered_pf = PF_Grayscale;
746449e47f06a46c42fb9895d13f37b599600225e56Brian Paul   v->undithered_pf = PF_Grayscale;
747693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return GL_TRUE;
748693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
749693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
750693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
751693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
752d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul/**
753693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Setup RGB rendering for a window with a PseudoColor, StaticColor,
754693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * or 8-bit TrueColor visual visual.  We try to allocate a palette of 225
755693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * colors (5 red, 9 green, 5 blue) and dither to approximate a 24-bit RGB
756693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * color.  While this function was originally designed just for 8-bit
757693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * visuals, it has also proven to work from 4-bit up to 16-bit visuals.
758693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Dithering code contributed by Bob Mercier.
759693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
760d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paulstatic GLboolean
761d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paulsetup_dithered_color(int client, XMesaVisual v,
762d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul                     XMesaBuffer buffer, XMesaColormap cmap)
763693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
764693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (GET_VISUAL_DEPTH(v)<4 || GET_VISUAL_DEPTH(v)>16) {
765693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return GL_FALSE;
766693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
767693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
768693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (buffer) {
769693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      XMesaBuffer prevBuffer;
770693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
771693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (!cmap) {
772693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return GL_FALSE;
773693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
774693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
775928a70e4354d4884e2918ec67ddc6d8baf942c8aBrian      prevBuffer = xmesa_find_buffer(v->display, cmap, buffer);
776693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (prevBuffer &&
7771832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul          (buffer->xm_visual->mesa_visual.rgbMode ==
7781832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul           prevBuffer->xm_visual->mesa_visual.rgbMode)) {
779693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* Copy colormap stuff from previous, matching XMesaBuffer.
780693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul          * Do this to avoid time spent in noFaultXAllocColor.
781693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul          */
782693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         copy_colortable_info(buffer, prevBuffer);
783693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
784693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      else {
785693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* Allocate X colors and initialize color_table[], red_table[], etc */
786693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         int r, g, b, i;
787693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         int colorsfailed = 0;
788d737ad52720f2c6b10ea02cef1e3c046e52bee15Brian Paul         for (r = 0; r < DITH_R; r++) {
789d737ad52720f2c6b10ea02cef1e3c046e52bee15Brian Paul            for (g = 0; g < DITH_G; g++) {
790d737ad52720f2c6b10ea02cef1e3c046e52bee15Brian Paul               for (b = 0; b < DITH_B; b++) {
791693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  XMesaColor xcol;
792693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  int exact, alloced;
793d737ad52720f2c6b10ea02cef1e3c046e52bee15Brian Paul                  xcol.red  =gamma_adjust(v->RedGamma,   r*65535/(DITH_R-1),65535);
794d737ad52720f2c6b10ea02cef1e3c046e52bee15Brian Paul                  xcol.green=gamma_adjust(v->GreenGamma, g*65535/(DITH_G-1),65535);
795d737ad52720f2c6b10ea02cef1e3c046e52bee15Brian Paul                  xcol.blue =gamma_adjust(v->BlueGamma,  b*65535/(DITH_B-1),65535);
796693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  noFaultXAllocColor( client, v->display,
797693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                      cmap, GET_COLORMAP_SIZE(v),
798693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                      &xcol, &exact, &alloced );
799693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  if (!exact) {
800693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                     colorsfailed++;
801693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  }
802693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  if (alloced) {
803693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                     assert(buffer->num_alloced<256);
804693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                     buffer->alloced_colors[buffer->num_alloced] = xcol.pixel;
805693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                     buffer->num_alloced++;
806693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  }
807d737ad52720f2c6b10ea02cef1e3c046e52bee15Brian Paul                  i = DITH_MIX( r, g, b );
808693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  assert(i < 576);
809693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  buffer->color_table[i] = xcol.pixel;
810693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  assert(xcol.pixel < 65536);
811d737ad52720f2c6b10ea02cef1e3c046e52bee15Brian Paul                  buffer->pixel_to_r[xcol.pixel] = r * 255 / (DITH_R-1);
812d737ad52720f2c6b10ea02cef1e3c046e52bee15Brian Paul                  buffer->pixel_to_g[xcol.pixel] = g * 255 / (DITH_G-1);
813d737ad52720f2c6b10ea02cef1e3c046e52bee15Brian Paul                  buffer->pixel_to_b[xcol.pixel] = b * 255 / (DITH_B-1);
814693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul               }
815693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            }
816693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
817693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
818367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul         if (colorsfailed && _mesa_getenv("MESA_DEBUG")) {
8192ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul            _mesa_warning(NULL,
820693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                  "Note: %d out of %d needed colors do not match exactly.\n",
821d737ad52720f2c6b10ea02cef1e3c046e52bee15Brian Paul                  colorsfailed, DITH_R * DITH_G * DITH_B );
822693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
823693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
824693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
825693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
826449e47f06a46c42fb9895d13f37b599600225e56Brian Paul   v->dithered_pf = PF_Dither;
827449e47f06a46c42fb9895d13f37b599600225e56Brian Paul   v->undithered_pf = PF_Lookup;
828693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return GL_TRUE;
829693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
830693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
831693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
832d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul/**
833693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Setup for Hewlett Packard Color Recovery 8-bit TrueColor mode.
834693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * HPCR simulates 24-bit color fidelity with an 8-bit frame buffer.
835693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Special dithering tables have to be initialized.
836693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
837d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paulstatic void
838d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paulsetup_8bit_hpcr(XMesaVisual v)
839693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
840693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* HP Color Recovery contributed by:  Alex De Bruyn (ad@lms.be)
841693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * To work properly, the atom _HP_RGB_SMOOTH_MAP_LIST must be defined
842693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * on the root window AND the colormap obtainable by XGetRGBColormaps
843693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * for that atom must be set on the window.  (see also tkInitWindow)
844693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * If that colormap is not set, the output will look stripy.
845693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    */
846693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
847693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Setup color tables with gamma correction */
848693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   int i;
849693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   double g;
850693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
8515e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   g = 1.0 / v->RedGamma;
8525e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen   for (i=0; i<256; i++) {
853367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul      GLint red = IROUND_POS(255.0 * _mesa_pow( hpcr_rgbTbl[0][i]/255.0, g ));
854693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->hpcr_rgbTbl[0][i] = CLAMP( red, 16, 239 );
855693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
856693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
857693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   g = 1.0 / v->GreenGamma;
858693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   for (i=0; i<256; i++) {
859367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul      GLint green = IROUND_POS(255.0 * _mesa_pow( hpcr_rgbTbl[1][i]/255.0, g ));
860693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->hpcr_rgbTbl[1][i] = CLAMP( green, 16, 239 );
861693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
862693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
863693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   g = 1.0 / v->BlueGamma;
864693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   for (i=0; i<256; i++) {
865367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul      GLint blue = IROUND_POS(255.0 * _mesa_pow( hpcr_rgbTbl[2][i]/255.0, g ));
866693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->hpcr_rgbTbl[2][i] = CLAMP( blue, 32, 223 );
867693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
868693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->undithered_pf = PF_HPCR;  /* can't really disable dithering for now */
869693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->dithered_pf = PF_HPCR;
870693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
871693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* which method should I use to clear */
872693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* GL_FALSE: keep the ordinary method  */
873693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* GL_TRUE : clear with dither pattern */
874367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul   v->hpcr_clear_flag = _mesa_getenv("MESA_HPCR_CLEAR") ? GL_TRUE : GL_FALSE;
875693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
876693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (v->hpcr_clear_flag) {
877693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->hpcr_clear_pixmap = XMesaCreatePixmap(v->display,
878693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                               DefaultRootWindow(v->display),
879693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                               16, 2, 8);
880693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifndef XFree86Server
881693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->hpcr_clear_ximage = XGetImage(v->display, v->hpcr_clear_pixmap,
882693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                       0, 0, 16, 2, AllPlanes, ZPixmap);
883693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
884693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
885693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
886693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
887693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
888d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul/**
889693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Setup RGB rendering for a window with a True/DirectColor visual.
890693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
891d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paulstatic void
892d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paulsetup_truecolor(XMesaVisual v, XMesaBuffer buffer, XMesaColormap cmap)
893693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
894693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   unsigned long rmask, gmask, bmask;
895693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   (void) buffer;
896693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   (void) cmap;
897693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
898693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Compute red multiplier (mask) and bit shift */
899693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->rshift = 0;
900693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   rmask = GET_REDMASK(v);
901693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   while ((rmask & 1)==0) {
902693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->rshift++;
903693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      rmask = rmask >> 1;
904693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
905693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
906693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Compute green multiplier (mask) and bit shift */
907693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->gshift = 0;
908693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   gmask = GET_GREENMASK(v);
909693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   while ((gmask & 1)==0) {
910693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->gshift++;
911693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      gmask = gmask >> 1;
912693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
913693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
914693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Compute blue multiplier (mask) and bit shift */
915693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->bshift = 0;
916693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   bmask = GET_BLUEMASK(v);
917693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   while ((bmask & 1)==0) {
918693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->bshift++;
919693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      bmask = bmask >> 1;
920693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
921693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
922693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /*
923693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * Compute component-to-pixel lookup tables and dithering kernel
924693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    */
925693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   {
926693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      static GLubyte kernel[16] = {
927693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul          0*16,  8*16,  2*16, 10*16,
928693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         12*16,  4*16, 14*16,  6*16,
929693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul          3*16, 11*16,  1*16,  9*16,
930693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         15*16,  7*16, 13*16,  5*16,
931693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      };
932692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul      GLint rBits = _mesa_bitcount(rmask);
933692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul      GLint gBits = _mesa_bitcount(gmask);
934692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul      GLint bBits = _mesa_bitcount(bmask);
9353cbbef53bcf9a74beec3d6699a03e8d0c2eb24e2Brian Paul      GLint maxBits;
936693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      GLuint i;
937693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
938693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* convert pixel components in [0,_mask] to RGB values in [0,255] */
939693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      for (i=0; i<=rmask; i++)
940693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         v->PixelToR[i] = (unsigned char) ((i * 255) / rmask);
941693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      for (i=0; i<=gmask; i++)
942693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         v->PixelToG[i] = (unsigned char) ((i * 255) / gmask);
943693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      for (i=0; i<=bmask; i++)
944693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         v->PixelToB[i] = (unsigned char) ((i * 255) / bmask);
945693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
946693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* convert RGB values from [0,255] to pixel components */
947693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
948693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      for (i=0;i<256;i++) {
949693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         GLint r = gamma_adjust(v->RedGamma,   i, 255);
950693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         GLint g = gamma_adjust(v->GreenGamma, i, 255);
951693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         GLint b = gamma_adjust(v->BlueGamma,  i, 255);
952693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         v->RtoPixel[i] = (r >> (8-rBits)) << v->rshift;
953693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         v->GtoPixel[i] = (g >> (8-gBits)) << v->gshift;
954693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         v->BtoPixel[i] = (b >> (8-bBits)) << v->bshift;
955693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
956693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* overflow protection */
957693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      for (i=256;i<512;i++) {
958693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         v->RtoPixel[i] = v->RtoPixel[255];
959693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         v->GtoPixel[i] = v->GtoPixel[255];
960693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         v->BtoPixel[i] = v->BtoPixel[255];
961693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
962693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
963693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* setup dithering kernel */
9643cbbef53bcf9a74beec3d6699a03e8d0c2eb24e2Brian Paul      maxBits = rBits;
9653cbbef53bcf9a74beec3d6699a03e8d0c2eb24e2Brian Paul      if (gBits > maxBits)  maxBits = gBits;
9663cbbef53bcf9a74beec3d6699a03e8d0c2eb24e2Brian Paul      if (bBits > maxBits)  maxBits = bBits;
967693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      for (i=0;i<16;i++) {
9683cbbef53bcf9a74beec3d6699a03e8d0c2eb24e2Brian Paul         v->Kernel[i] = kernel[i] >> maxBits;
969693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
970693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
971449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      v->undithered_pf = PF_Truecolor;
972449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      v->dithered_pf = (GET_VISUAL_DEPTH(v)<24) ? PF_Dither_True : PF_Truecolor;
973693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
974693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
975693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /*
976693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * Now check for TrueColor visuals which we can optimize.
977693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    */
978693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (   GET_REDMASK(v)  ==0x0000ff
979693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && GET_GREENMASK(v)==0x00ff00
980693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && GET_BLUEMASK(v) ==0xff0000
981693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && CHECK_BYTE_ORDER(v)
982693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && v->BitsPerPixel==32
983693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && v->RedGamma==1.0 && v->GreenGamma==1.0 && v->BlueGamma==1.0) {
984693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* common 32 bpp config used on SGI, Sun */
9853fd88089c03f2dbe634ba2611955c6d0a6b2ccd5Brian      v->undithered_pf = v->dithered_pf = PF_8A8B8G8R; /* ABGR */
986693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
9873fd88089c03f2dbe634ba2611955c6d0a6b2ccd5Brian   else if (GET_REDMASK(v)  == 0xff0000
9883fd88089c03f2dbe634ba2611955c6d0a6b2ccd5Brian         && GET_GREENMASK(v)== 0x00ff00
9893fd88089c03f2dbe634ba2611955c6d0a6b2ccd5Brian         && GET_BLUEMASK(v) == 0x0000ff
9903fd88089c03f2dbe634ba2611955c6d0a6b2ccd5Brian         && CHECK_BYTE_ORDER(v)
9913fd88089c03f2dbe634ba2611955c6d0a6b2ccd5Brian         && v->RedGamma == 1.0 && v->GreenGamma == 1.0 && v->BlueGamma == 1.0){
9923fd88089c03f2dbe634ba2611955c6d0a6b2ccd5Brian      if (v->BitsPerPixel==32) {
9933fd88089c03f2dbe634ba2611955c6d0a6b2ccd5Brian         /* if 32 bpp, and visual indicates 8 bpp alpha channel */
9943fd88089c03f2dbe634ba2611955c6d0a6b2ccd5Brian         if (GET_VISUAL_DEPTH(v) == 32 && v->mesa_visual.alphaBits == 8)
9953fd88089c03f2dbe634ba2611955c6d0a6b2ccd5Brian            v->undithered_pf = v->dithered_pf = PF_8A8R8G8B; /* ARGB */
9963fd88089c03f2dbe634ba2611955c6d0a6b2ccd5Brian         else
9973fd88089c03f2dbe634ba2611955c6d0a6b2ccd5Brian            v->undithered_pf = v->dithered_pf = PF_8R8G8B; /* xRGB */
9983fd88089c03f2dbe634ba2611955c6d0a6b2ccd5Brian      }
9993fd88089c03f2dbe634ba2611955c6d0a6b2ccd5Brian      else if (v->BitsPerPixel == 24) {
10003fd88089c03f2dbe634ba2611955c6d0a6b2ccd5Brian         v->undithered_pf = v->dithered_pf = PF_8R8G8B24; /* RGB */
10013fd88089c03f2dbe634ba2611955c6d0a6b2ccd5Brian      }
1002693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1003693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else if (GET_REDMASK(v)  ==0xf800
1004693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       &&   GET_GREENMASK(v)==0x07e0
1005693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       &&   GET_BLUEMASK(v) ==0x001f
1006693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && CHECK_BYTE_ORDER(v)
1007693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && v->BitsPerPixel==16
1008693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && v->RedGamma==1.0 && v->GreenGamma==1.0 && v->BlueGamma==1.0) {
10093fd88089c03f2dbe634ba2611955c6d0a6b2ccd5Brian      /* 5-6-5 RGB */
1010693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->undithered_pf = PF_5R6G5B;
1011449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      v->dithered_pf = PF_Dither_5R6G5B;
1012693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1013693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else if (GET_REDMASK(v)  ==0xe0
1014693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       &&   GET_GREENMASK(v)==0x1c
1015693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       &&   GET_BLUEMASK(v) ==0x03
1016693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       && CHECK_FOR_HPCR(v)) {
10173fd88089c03f2dbe634ba2611955c6d0a6b2ccd5Brian      /* 8-bit HP color recovery */
1018693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      setup_8bit_hpcr( v );
1019693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1020693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1021693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1022693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1023693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1024d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul/**
1025693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Setup RGB rendering for a window with a monochrome visual.
1026693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
1027d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paulstatic void
1028d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paulsetup_monochrome( XMesaVisual v, XMesaBuffer b )
1029693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1030693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   (void) b;
1031449e47f06a46c42fb9895d13f37b599600225e56Brian Paul   v->dithered_pf = v->undithered_pf = PF_1Bit;
1032693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* if black=1 then we must flip pixel values */
1033693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->bitFlip = (GET_BLACK_PIXEL(v) != 0);
1034693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1035693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1036693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1037693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
103863f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul/**
103963f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul * When a context is bound for the first time, we can finally finish
104063f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul * initializing the context's visual and buffer information.
104163f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul * \param v  the XMesaVisual to initialize
104263f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul * \param b  the XMesaBuffer to initialize (may be NULL)
104363f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul * \param rgb_flag  TRUE = RGBA mode, FALSE = color index mode
104463f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul * \param window  the window/pixmap we're rendering into
104563f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul * \param cmap  the colormap associated with the window/pixmap
104663f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul * \return GL_TRUE=success, GL_FALSE=failure
1047693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
104863f6802077c2279e1b9551f9a628e6a313488f8dBrian Paulstatic GLboolean
1049e4e2068ac9d21ce50e863ccf3171462ab61c3ec8George Sapountzisinitialize_visual_and_buffer(XMesaVisual v, XMesaBuffer b,
105063f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul                             GLboolean rgb_flag, XMesaDrawable window,
105163f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul                             XMesaColormap cmap)
1052693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1053e4e2068ac9d21ce50e863ccf3171462ab61c3ec8George Sapountzis   int client = 0;
1054e4e2068ac9d21ce50e863ccf3171462ab61c3ec8George Sapountzis
1055e4e2068ac9d21ce50e863ccf3171462ab61c3ec8George Sapountzis#ifdef XFree86Server
1056e4e2068ac9d21ce50e863ccf3171462ab61c3ec8George Sapountzis   client = (window) ? CLIENT_ID(window->id) : 0;
1057e4e2068ac9d21ce50e863ccf3171462ab61c3ec8George Sapountzis#endif
1058e4e2068ac9d21ce50e863ccf3171462ab61c3ec8George Sapountzis
105963f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul   ASSERT(!b || b->xm_visual == v);
1060e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
1061693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* Save true bits/pixel */
1062a078d75a27b99252ede6520e24b145106ab98aa2Brian Paul   v->BitsPerPixel = bits_per_pixel(v);
1063693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   assert(v->BitsPerPixel > 0);
1064693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1065d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   if (rgb_flag == GL_FALSE) {
1066693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* COLOR-INDEXED WINDOW:
1067693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       * Even if the visual is TrueColor or DirectColor we treat it as
1068693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       * being color indexed.  This is weird but might be useful to someone.
1069693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       */
1070449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      v->dithered_pf = v->undithered_pf = PF_Index;
1071304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick      v->mesa_visual.indexBits = GET_VISUAL_DEPTH(v);
1072693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1073693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
1074693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* RGB WINDOW:
1075693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       * We support RGB rendering into almost any kind of visual.
1076693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       */
1077304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick      const int xclass = v->mesa_visual.visualType;
107863f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul      if (xclass == GLX_TRUE_COLOR || xclass == GLX_DIRECT_COLOR) {
1079190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul	 setup_truecolor( v, b, cmap );
1080693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
108163f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul      else if (xclass == GLX_STATIC_GRAY && GET_VISUAL_DEPTH(v) == 1) {
1082693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 setup_monochrome( v, b );
1083693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
108463f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul      else if (xclass == GLX_GRAY_SCALE || xclass == GLX_STATIC_GRAY) {
1085693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         if (!setup_grayscale( client, v, b, cmap )) {
1086693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            return GL_FALSE;
1087693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
1088693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
108963f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul      else if ((xclass == GLX_PSEUDO_COLOR || xclass == GLX_STATIC_COLOR)
1090693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul               && GET_VISUAL_DEPTH(v)>=4 && GET_VISUAL_DEPTH(v)<=16) {
1091693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 if (!setup_dithered_color( client, v, b, cmap )) {
1092693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            return GL_FALSE;
1093693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
1094693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1095693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      else {
109699f13343cf270d8dfde8445ae363d9b05256e05bBrian Paul	 _mesa_warning(NULL, "XMesa: RGB mode rendering not supported in given visual.\n");
1097693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 return GL_FALSE;
1098693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1099304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick      v->mesa_visual.indexBits = 0;
1100693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1101367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul      if (_mesa_getenv("MESA_NO_DITHER")) {
1102693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 v->dithered_pf = v->undithered_pf;
1103693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1104693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1105693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1106693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1107693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /*
1108693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * If MESA_INFO env var is set print out some debugging info
1109693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * which can help Brian figure out what's going on when a user
1110693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * reports bugs.
1111693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    */
1112367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul   if (_mesa_getenv("MESA_INFO")) {
1113298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg      printf("X/Mesa visual = %p\n", (void *) v);
1114298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg      printf("X/Mesa dithered pf = %u\n", v->dithered_pf);
1115298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg      printf("X/Mesa undithered pf = %u\n", v->undithered_pf);
1116298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg      printf("X/Mesa level = %d\n", v->mesa_visual.level);
1117298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg      printf("X/Mesa depth = %d\n", GET_VISUAL_DEPTH(v));
1118298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg      printf("X/Mesa bits per pixel = %d\n", v->BitsPerPixel);
1119693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1120693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1121693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (b && window) {
1122e4e2068ac9d21ce50e863ccf3171462ab61c3ec8George Sapountzis      char *data;
1123e4e2068ac9d21ce50e863ccf3171462ab61c3ec8George Sapountzis
1124693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Do window-specific initializations */
1125693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1126d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul      /* these should have been set in create_xmesa_buffer */
1127d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul      ASSERT(b->frontxrb->drawable == window);
1128d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul      ASSERT(b->frontxrb->pixmap == (XMesaPixmap) window);
1129693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1130693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Setup for single/double buffering */
11311832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul      if (v->mesa_visual.doubleBufferMode) {
1132693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* Double buffered */
1133693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         b->shm = check_for_xshm( v->display );
1134693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1135693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1136693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* X11 graphics contexts */
1137693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
1138c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul      b->gc = CreateScratchGC(v->display, window->depth);
1139693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
1140c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul      b->gc = XCreateGC( v->display, window, 0, NULL );
1141693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1142c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul      XMesaSetFunction( v->display, b->gc, GXcopy );
1143693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
11449ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul      /* cleargc - for glClear() */
11459ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul#ifdef XFree86Server
11469ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul      b->cleargc = CreateScratchGC(v->display, window->depth);
11479ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul#else
11489ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul      b->cleargc = XCreateGC( v->display, window, 0, NULL );
11499ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul#endif
11509ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul      XMesaSetFunction( v->display, b->cleargc, GXcopy );
11519ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul
1152693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /*
1153693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       * Don't generate Graphics Expose/NoExpose events in swapbuffers().
1154693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       * Patch contributed by Michael Pichler May 15, 1995.
1155693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       */
1156693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
11579ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul      b->swapgc = CreateScratchGC(v->display, window->depth);
1158693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      {
1159692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul         CARD32 v[1];
1160692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul         v[0] = FALSE;
1161692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul         dixChangeGC(NullClient, b->swapgc, GCGraphicsExposures, v, NULL);
1162693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1163693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
116463f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul      {
116563f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul         XGCValues gcvalues;
116663f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul         gcvalues.graphics_exposures = False;
116763f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul         b->swapgc = XCreateGC(v->display, window,
116863f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul                               GCGraphicsExposures, &gcvalues);
116963f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul      }
1170693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
11719ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul      XMesaSetFunction( v->display, b->swapgc, GXcopy );
1172693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /*
1173693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       * Set fill style and tile pixmap once for all for HPCR stuff
1174693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       * (instead of doing it each time in clear_color_HPCR_pixmap())
1175693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       * Initialize whole stuff
1176693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       * Patch contributed by Jacques Leroy March 8, 1998.
1177693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       */
117863f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul      if (v->hpcr_clear_flag && b->backxrb && b->backxrb->pixmap) {
117963f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul         int i;
118063f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul         for (i = 0; i < 16; i++) {
118163f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul            XMesaPutPixel(v->hpcr_clear_ximage, i, 0, 0);
118263f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul            XMesaPutPixel(v->hpcr_clear_ximage, i, 1, 0);
118363f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul         }
118463f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul         XMesaPutImage(b->display, (XMesaDrawable) v->hpcr_clear_pixmap,
118563f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul                       b->cleargc, v->hpcr_clear_ximage, 0, 0, 0, 0, 16, 2);
118663f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul         XMesaSetFillStyle( v->display, b->cleargc, FillTiled);
118763f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul         XMesaSetTile( v->display, b->cleargc, v->hpcr_clear_pixmap );
1188693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1189693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1190693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Initialize the row buffer XImage for use in write_color_span() */
1191e4e2068ac9d21ce50e863ccf3171462ab61c3ec8George Sapountzis      data = (char*) MALLOC(MAX_WIDTH*4);
1192693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
1193e4e2068ac9d21ce50e863ccf3171462ab61c3ec8George Sapountzis      b->rowimage = XMesaCreateImage(GET_VISUAL_DEPTH(v), MAX_WIDTH, 1, data);
1194693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
1195693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      b->rowimage = XCreateImage( v->display,
1196693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                  v->visinfo->visual,
1197693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                  v->visinfo->depth,
1198693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                  ZPixmap, 0,           /*format, offset*/
1199e4e2068ac9d21ce50e863ccf3171462ab61c3ec8George Sapountzis                                  data,                 /*data*/
1200693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                  MAX_WIDTH, 1,         /*width, height*/
1201693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                  32,                   /*bitmap_pad*/
1202693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                  0                     /*bytes_per_line*/ );
1203693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1204ef5c82bd02926ac851537f1382352f8f6af33eceAlan Hourihane      if (!b->rowimage)
1205ef5c82bd02926ac851537f1382352f8f6af33eceAlan Hourihane         return GL_FALSE;
1206693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1207693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1208693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return GL_TRUE;
1209693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1210693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1211693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1212693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1213693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
1214693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Convert an RGBA color to a pixel value.
1215693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
1216693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulunsigned long
1217e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paulxmesa_color_to_pixel(GLcontext *ctx,
1218e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                     GLubyte r, GLubyte g, GLubyte b, GLubyte a,
1219e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                     GLuint pixelFormat)
1220693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1221e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   XMesaContext xmesa = XMESA_CONTEXT(ctx);
1222693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   switch (pixelFormat) {
1223449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      case PF_Index:
1224693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return 0;
1225449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      case PF_Truecolor:
1226693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         {
1227693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            unsigned long p;
1228693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            PACK_TRUECOLOR( p, r, g, b );
1229693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            return p;
1230693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
1231693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_8A8B8G8R:
1232693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return PACK_8A8B8G8R( r, g, b, a );
123341bddcfa7bbc65bcd2fc60ada9761d3065e71388Brian Paul      case PF_8A8R8G8B:
123441bddcfa7bbc65bcd2fc60ada9761d3065e71388Brian Paul         return PACK_8A8R8G8B( r, g, b, a );
1235693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_8R8G8B:
1236693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* fall through */
1237693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_8R8G8B24:
1238693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return PACK_8R8G8B( r, g, b );
1239693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_5R6G5B:
1240693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return PACK_5R6G5B( r, g, b );
1241449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      case PF_Dither:
1242693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         {
1243693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            DITHER_SETUP;
1244693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            return DITHER( 1, 0, r, g, b );
1245693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
1246449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      case PF_1Bit:
1247693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* 382 = (3*255)/2 */
1248693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return ((r+g+b) > 382) ^ xmesa->xm_visual->bitFlip;
1249693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_HPCR:
1250693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return DITHER_HPCR(1, 1, r, g, b);
1251449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      case PF_Lookup:
1252693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         {
1253693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            LOOKUP_SETUP;
1254693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            return LOOKUP( r, g, b );
1255693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
1256449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      case PF_Grayscale:
1257693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return GRAY_RGB( r, g, b );
1258449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      case PF_Dither_True:
1259693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* fall through */
1260449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      case PF_Dither_5R6G5B:
1261693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         {
1262693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            unsigned long p;
1263693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            PACK_TRUEDITHER(p, 1, 0, r, g, b);
1264693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            return p;
1265693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
1266693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      default:
1267e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         _mesa_problem(ctx, "Bad pixel format in xmesa_color_to_pixel");
1268693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1269693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return 0;
1270693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1271693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1272693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1273304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick#define NUM_VISUAL_TYPES   6
1274304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick
1275304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick/**
1276304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick * Convert an X visual type to a GLX visual type.
1277304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick *
1278304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick * \param visualType X visual type (i.e., \c TrueColor, \c StaticGray, etc.)
1279304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick *        to be converted.
1280304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick * \return If \c visualType is a valid X visual type, a GLX visual type will
1281304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick *         be returned.  Otherwise \c GLX_NONE will be returned.
1282304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick *
1283304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick * \note
1284304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick * This code was lifted directly from lib/GL/glx/glcontextmodes.c in the
1285304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick * DRI CVS tree.
1286304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick */
1287304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanickstatic GLint
1288304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanickxmesa_convert_from_x_visual_type( int visualType )
1289304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick{
1290304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick    static const int glx_visual_types[ NUM_VISUAL_TYPES ] = {
1291304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick	GLX_STATIC_GRAY,  GLX_GRAY_SCALE,
1292304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick	GLX_STATIC_COLOR, GLX_PSEUDO_COLOR,
1293304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick	GLX_TRUE_COLOR,   GLX_DIRECT_COLOR
1294304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick    };
1295304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick
1296304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick    return ( (unsigned) visualType < NUM_VISUAL_TYPES )
1297304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick	? glx_visual_types[ visualType ] : GLX_NONE;
1298304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick}
1299304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick
1300304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick
1301693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/**********************************************************************/
1302693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*****                       Public Functions                     *****/
1303693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/**********************************************************************/
1304693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1305693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1306693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
1307693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Create a new X/Mesa visual.
1308693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Input:  display - X11 display
1309693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         visinfo - an XVisualInfo pointer
1310693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         rgb_flag - GL_TRUE = RGB mode,
1311693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *                    GL_FALSE = color index mode
1312693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         alpha_flag - alpha buffer requested?
1313693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         db_flag - GL_TRUE = double-buffered,
1314693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *                   GL_FALSE = single buffered
1315693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         stereo_flag - stereo visual?
1316693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         ximage_flag - GL_TRUE = use an XImage for back buffer,
1317693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *                       GL_FALSE = use an off-screen pixmap for back buffer
1318693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         depth_size - requested bits/depth values, or zero
1319693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         stencil_size - requested bits/stencil values, or zero
1320693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         accum_red_size - requested bits/red accum values, or zero
1321693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         accum_green_size - requested bits/green accum values, or zero
1322693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         accum_blue_size - requested bits/blue accum values, or zero
1323693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         accum_alpha_size - requested bits/alpha accum values, or zero
1324693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         num_samples - number of samples/pixel if multisampling, or zero
1325693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *         level - visual level, usually 0
1326304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick *         visualCaveat - ala the GLX extension, usually GLX_NONE
1327693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return;  a new XMesaVisual or 0 if error.
1328693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
132950aaabc248c9823106ff772873cbf2631d4dadcdGeorge SapountzisPUBLIC
1330693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulXMesaVisual XMesaCreateVisual( XMesaDisplay *display,
1331693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               XMesaVisualInfo visinfo,
1332693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLboolean rgb_flag,
1333693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLboolean alpha_flag,
1334693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLboolean db_flag,
1335693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLboolean stereo_flag,
1336693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLboolean ximage_flag,
1337693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLint depth_size,
1338693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLint stencil_size,
1339693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLint accum_red_size,
1340693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLint accum_green_size,
1341693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLint accum_blue_size,
1342693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLint accum_alpha_size,
1343693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLint num_samples,
1344693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLint level,
1345693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLint visualCaveat )
1346693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1347693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   char *gamma;
1348693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaVisual v;
1349693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   GLint red_bits, green_bits, blue_bits, alpha_bits;
1350693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
135163f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul#ifndef XFree86Server
1352693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* For debugging only */
1353367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul   if (_mesa_getenv("MESA_XSYNC")) {
1354693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* This makes debugging X easier.
1355693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       * In your debugger, set a breakpoint on _XError to stop when an
1356693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       * X protocol error is generated.
1357693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul       */
1358693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      XSynchronize( display, 1 );
1359693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
136063f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul#endif
1361693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1362693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v = (XMesaVisual) CALLOC_STRUCT(xmesa_visual);
1363693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (!v) {
1364693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return NULL;
1365693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1366693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1367693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->display = display;
1368693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
136932f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg   /* Save a copy of the XVisualInfo struct because the user may Xfree()
1370693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * the struct but we may need some of the information contained in it
1371693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * at a later time.
1372693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    */
1373304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick#ifndef XFree86Server
1374693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->visinfo = (XVisualInfo *) MALLOC(sizeof(*visinfo));
1375693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if(!v->visinfo) {
137632f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free(v);
1377693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return NULL;
1378693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1379e197de56cdb86835f1437688a9161cd909792d80Brian Paul   memcpy(v->visinfo, visinfo, sizeof(*visinfo));
1380693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1381693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1382693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* check for MESA_GAMMA environment variable */
1383367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul   gamma = _mesa_getenv("MESA_GAMMA");
1384693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (gamma) {
1385693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->RedGamma = v->GreenGamma = v->BlueGamma = 0.0;
1386693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      sscanf( gamma, "%f %f %f", &v->RedGamma, &v->GreenGamma, &v->BlueGamma );
1387693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (v->RedGamma<=0.0)    v->RedGamma = 1.0;
1388693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (v->GreenGamma<=0.0)  v->GreenGamma = v->RedGamma;
1389693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (v->BlueGamma<=0.0)   v->BlueGamma = v->RedGamma;
1390693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1391693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
1392693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      v->RedGamma = v->GreenGamma = v->BlueGamma = 1.0;
1393693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1394693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1395693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   v->ximage_flag = ximage_flag;
1396304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick
1397304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick#ifdef XFree86Server
1398304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick   /* We could calculate these values by ourselves.  nplanes is either the sum
1399304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick    * of the red, green, and blue bits or the number index bits.
1400304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick    * ColormapEntries is either (1U << index_bits) or
1401304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick    * (1U << max(redBits, greenBits, blueBits)).
1402304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick    */
14031814d6541b1fb4bad67fb6277a6fcbe518453230Brian Paul   assert(visinfo->nplanes > 0);
1404304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick   v->nplanes = visinfo->nplanes;
1405304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick   v->ColormapEntries = visinfo->ColormapEntries;
1406304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick
1407304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick   v->mesa_visual.redMask = visinfo->redMask;
1408304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick   v->mesa_visual.greenMask = visinfo->greenMask;
1409304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick   v->mesa_visual.blueMask = visinfo->blueMask;
1410304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick   v->mesa_visual.visualID = visinfo->vid;
1411304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick   v->mesa_visual.screen = 0; /* FIXME: What should be done here? */
1412304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick#else
1413304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick   v->mesa_visual.redMask = visinfo->red_mask;
1414304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick   v->mesa_visual.greenMask = visinfo->green_mask;
1415304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick   v->mesa_visual.blueMask = visinfo->blue_mask;
1416304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick   v->mesa_visual.visualID = visinfo->visualid;
1417304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick   v->mesa_visual.screen = visinfo->screen;
1418304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick#endif
1419304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick
1420304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick#if defined(XFree86Server) || !(defined(__cplusplus) || defined(c_plusplus))
1421304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick   v->mesa_visual.visualType = xmesa_convert_from_x_visual_type(visinfo->class);
1422304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick#else
1423304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick   v->mesa_visual.visualType = xmesa_convert_from_x_visual_type(visinfo->c_class);
1424304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick#endif
1425304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick
1426304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick   v->mesa_visual.visualRating = visualCaveat;
1427693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
14283fd88089c03f2dbe634ba2611955c6d0a6b2ccd5Brian   if (alpha_flag)
14293fd88089c03f2dbe634ba2611955c6d0a6b2ccd5Brian      v->mesa_visual.alphaBits = 8;
14303fd88089c03f2dbe634ba2611955c6d0a6b2ccd5Brian
1431e4e2068ac9d21ce50e863ccf3171462ab61c3ec8George Sapountzis   (void) initialize_visual_and_buffer( v, NULL, rgb_flag, 0, 0 );
1432693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1433693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   {
1434304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick      const int xclass = v->mesa_visual.visualType;
143563f6802077c2279e1b9551f9a628e6a313488f8dBrian Paul      if (xclass == GLX_TRUE_COLOR || xclass == GLX_DIRECT_COLOR) {
1436692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul         red_bits   = _mesa_bitcount(GET_REDMASK(v));
1437692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul         green_bits = _mesa_bitcount(GET_GREENMASK(v));
1438692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul         blue_bits  = _mesa_bitcount(GET_BLUEMASK(v));
1439693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1440693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      else {
1441693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* this is an approximation */
1442693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         int depth;
1443693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         depth = GET_VISUAL_DEPTH(v);
1444693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         red_bits = depth / 3;
1445693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         depth -= red_bits;
1446693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         green_bits = depth / 2;
1447693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         depth -= green_bits;
1448693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         blue_bits = depth;
1449693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         alpha_bits = 0;
1450693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         assert( red_bits + green_bits + blue_bits == GET_VISUAL_DEPTH(v) );
1451693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
14523fd88089c03f2dbe634ba2611955c6d0a6b2ccd5Brian      alpha_bits = v->mesa_visual.alphaBits;
1453693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1454693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
14551832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul   _mesa_initialize_visual( &v->mesa_visual,
14561832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul                            rgb_flag, db_flag, stereo_flag,
14571832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul                            red_bits, green_bits,
14581832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul                            blue_bits, alpha_bits,
1459304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick                            v->mesa_visual.indexBits,
14601832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul                            depth_size,
14611832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul                            stencil_size,
14621832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul                            accum_red_size, accum_green_size,
14631832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul                            accum_blue_size, accum_alpha_size,
14641832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul                            0 );
1465304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick
1466894844a8d956a0ee5f95836331dc318f49fdb845Brian Paul   /* XXX minor hack */
1467304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick   v->mesa_visual.level = level;
1468693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return v;
1469693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1470693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1471693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
147250aaabc248c9823106ff772873cbf2631d4dadcdGeorge SapountzisPUBLIC
1473693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulvoid XMesaDestroyVisual( XMesaVisual v )
1474693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1475693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifndef XFree86Server
147632f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg   free(v->visinfo);
1477693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
147832f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg   free(v);
1479693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1480693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1481693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1482693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1483d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul/**
1484693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Create a new XMesaContext.
1485d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul * \param v  the XMesaVisual
1486d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul * \param share_list  another XMesaContext with which to share display
1487d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul *                    lists or NULL if no sharing is wanted.
1488d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul * \return an XMesaContext or NULL if error.
1489693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
149050aaabc248c9823106ff772873cbf2631d4dadcdGeorge SapountzisPUBLIC
14917a1f3a37a10b162b067239dafa19fc6865a41f14Keith WhitwellXMesaContext XMesaCreateContext( XMesaVisual v, XMesaContext share_list )
1492693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
14939a33a11d714c90162d32781ebbd2c1dfab52cfd1Brian Paul   static GLboolean firstTime = GL_TRUE;
1494693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaContext c;
14951e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul   GLcontext *mesaCtx;
1496d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   struct dd_function_table functions;
1497d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   TNLcontext *tnl;
1498693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1499693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (firstTime) {
1500693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      _glthread_INIT_MUTEX(_xmesa_lock);
1501693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      firstTime = GL_FALSE;
1502693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1503693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1504d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   /* Note: the XMesaContext contains a Mesa GLcontext struct (inheritance) */
1505693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   c = (XMesaContext) CALLOC_STRUCT(xmesa_context);
1506d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   if (!c)
1507693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return NULL;
1508693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
15091e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul   mesaCtx = &(c->mesa);
15101e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul
1511d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   /* initialize with default driver functions, then plug in XMesa funcs */
1512d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   _mesa_init_driver_functions(&functions);
1513d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   xmesa_init_driver_functions(v, &functions);
15141e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul   if (!_mesa_initialize_context(mesaCtx, &v->mesa_visual,
15151e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul                      share_list ? &(share_list->mesa) : (GLcontext *) NULL,
1516d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul                      &functions, (void *) c)) {
151732f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free(c);
1518693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return NULL;
1519693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1520693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1521c37872d8c02c5c875b1570d8eaa1fe5de0380b53Brian Paul   /* Enable this to exercise fixed function -> shader translation
1522c37872d8c02c5c875b1570d8eaa1fe5de0380b53Brian Paul    * with software rendering.
1523c37872d8c02c5c875b1570d8eaa1fe5de0380b53Brian Paul    */
1524c37872d8c02c5c875b1570d8eaa1fe5de0380b53Brian Paul   if (0) {
1525c37872d8c02c5c875b1570d8eaa1fe5de0380b53Brian Paul      mesaCtx->VertexProgram._MaintainTnlProgram = GL_TRUE;
1526c37872d8c02c5c875b1570d8eaa1fe5de0380b53Brian Paul      mesaCtx->FragmentProgram._MaintainTexEnvProgram = GL_TRUE;
1527c37872d8c02c5c875b1570d8eaa1fe5de0380b53Brian Paul   }
1528c37872d8c02c5c875b1570d8eaa1fe5de0380b53Brian Paul
15291e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul   _mesa_enable_sw_extensions(mesaCtx);
15301e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul   _mesa_enable_1_3_extensions(mesaCtx);
15311e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul   _mesa_enable_1_4_extensions(mesaCtx);
153284351999ec6ad07e0cfc31c0b3a8c86da4134bfeBrian Paul   _mesa_enable_1_5_extensions(mesaCtx);
153353f82c5aadbb15585754bfacf3237093eccdb2ceBrian Paul   _mesa_enable_2_0_extensions(mesaCtx);
15345c4ca968fab1b0b993fabeb73e3a5d92cbaadaf1Brian   _mesa_enable_2_1_extensions(mesaCtx);
15354fb995084e1b4b629667f09331adf060aa0fac4cBrian Paul#if ENABLE_EXT_texure_compression_s3tc
1536750f52169ccbd1aca217e7749f1ce6ae5828c2acGeorge Sapountzis    if (mesaCtx->Mesa_DXTn) {
1537692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul       _mesa_enable_extension(mesaCtx, "GL_EXT_texture_compression_s3tc");
1538692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul       _mesa_enable_extension(mesaCtx, "GL_S3_s3tc");
15393c9faa448ccef15a514a5580fe76838822dd2a9eDaniel Borca    }
1540692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul    _mesa_enable_extension(mesaCtx, "GL_3DFX_texture_compression_FXT1");
15413c9faa448ccef15a514a5580fe76838822dd2a9eDaniel Borca#endif
15424fb995084e1b4b629667f09331adf060aa0fac4cBrian Paul#if ENABLE_EXT_timer_query
1543692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul    _mesa_enable_extension(mesaCtx, "GL_EXT_timer_query");
15444fb995084e1b4b629667f09331adf060aa0fac4cBrian Paul#endif
1545693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1546507167d7e2cf3bc64d1c112d927efeb1baa3b495George Sapountzis#ifdef XFree86Server
1547507167d7e2cf3bc64d1c112d927efeb1baa3b495George Sapountzis   /* If we're running in the X server, do bounds checking to prevent
1548507167d7e2cf3bc64d1c112d927efeb1baa3b495George Sapountzis    * segfaults and server crashes!
1549507167d7e2cf3bc64d1c112d927efeb1baa3b495George Sapountzis    */
1550507167d7e2cf3bc64d1c112d927efeb1baa3b495George Sapountzis   mesaCtx->Const.CheckArrayBounds = GL_TRUE;
1551507167d7e2cf3bc64d1c112d927efeb1baa3b495George Sapountzis#endif
1552507167d7e2cf3bc64d1c112d927efeb1baa3b495George Sapountzis
1553d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   /* finish up xmesa context initializations */
1554d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   c->swapbytes = CHECK_BYTE_ORDER(v) ? GL_FALSE : GL_TRUE;
1555693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   c->xm_visual = v;
1556693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   c->xm_buffer = NULL;   /* set later by XMesaMakeCurrent */
1557693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   c->display = v->display;
1558693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   c->pixelformat = v->dithered_pf;      /* Dithering is enabled by default */
1559693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1560ec0585883a85a495d94e24970d64e5d6fc889147Keith Whitwell   /* Initialize the software rasterizer and helper modules.
1561ec0585883a85a495d94e24970d64e5d6fc889147Keith Whitwell    */
1562c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul   if (!_swrast_CreateContext( mesaCtx ) ||
15630a0fb5e0b3cfe61749af41d4200d42982b551cefKeith Whitwell       !_vbo_CreateContext( mesaCtx ) ||
1564c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul       !_tnl_CreateContext( mesaCtx ) ||
1565c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul       !_swsetup_CreateContext( mesaCtx )) {
1566c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul      _mesa_free_context_data(&c->mesa);
156732f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free(c);
1568c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul      return NULL;
1569c45b7364dab6c3daebc1f1d8d11124af4129074aBrian Paul   }
1570ec0585883a85a495d94e24970d64e5d6fc889147Keith Whitwell
1571d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   /* tnl setup */
1572d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   tnl = TNL_CONTEXT(mesaCtx);
1573d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   tnl->Driver.RunPipeline = _tnl_run_pipeline;
1574d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   /* swrast setup */
15751e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul   xmesa_register_swrast_functions( mesaCtx );
1576d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul   _swsetup_Wakeup(mesaCtx);
1577709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell
15782c1937480a68b066a1a0b8ee3770e675bfad859bBrian Paul   _mesa_meta_init(mesaCtx);
1579da9d8f192431b0142e65bceb5ca8a2e52e21ac90Brian Paul
15807a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell   return c;
1581693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1582693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1583693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1584693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
158550aaabc248c9823106ff772873cbf2631d4dadcdGeorge SapountzisPUBLIC
1586693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulvoid XMesaDestroyContext( XMesaContext c )
1587693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
15881e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul   GLcontext *mesaCtx = &c->mesa;
1589d60009bd6dba15d094b0d0bcb8180b7a2e1c1708George Sapountzis
15906346a753c6e77373cffcec6dd0df253efd159dd4George Sapountzis#ifdef FX
15916346a753c6e77373cffcec6dd0df253efd159dd4George Sapountzis   FXdestroyContext( XMESA_BUFFER(mesaCtx->DrawBuffer) );
1592d60009bd6dba15d094b0d0bcb8180b7a2e1c1708George Sapountzis#endif
15936346a753c6e77373cffcec6dd0df253efd159dd4George Sapountzis
15942c1937480a68b066a1a0b8ee3770e675bfad859bBrian Paul   _mesa_meta_free( mesaCtx );
1595da9d8f192431b0142e65bceb5ca8a2e52e21ac90Brian Paul
15961e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul   _swsetup_DestroyContext( mesaCtx );
15971e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul   _swrast_DestroyContext( mesaCtx );
15981e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul   _tnl_DestroyContext( mesaCtx );
15990a0fb5e0b3cfe61749af41d4200d42982b551cefKeith Whitwell   _vbo_DestroyContext( mesaCtx );
16000983163fde91f1026146903155fd414725a79879Brian Paul   _mesa_free_context_data( mesaCtx );
160132f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg   free( c );
1602693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1603693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1604693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1605693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1606d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul/**
1607d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul * Private function for creating an XMesaBuffer which corresponds to an
1608d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul * X window or pixmap.
1609d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul * \param v  the window's XMesaVisual
1610d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul * \param w  the window we're wrapping
1611d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul * \return  new XMesaBuffer or NULL if error
1612693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
16136aa5668871e7f366b33e85fabc72885fc269a7d4George SapountzisPUBLIC XMesaBuffer
16146aa5668871e7f366b33e85fabc72885fc269a7d4George SapountzisXMesaCreateWindowBuffer(XMesaVisual v, XMesaWindow w)
1615693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1616693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifndef XFree86Server
1617693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XWindowAttributes attr;
1618693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
16198d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul   XMesaBuffer b;
16208d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul   XMesaColormap cmap;
1621e4e2068ac9d21ce50e863ccf3171462ab61c3ec8George Sapountzis   int depth;
1622693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
16238d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul   assert(v);
1624d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   assert(w);
1625693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
16268d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul   /* Check that window depth matches visual depth */
1627693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
1628e4e2068ac9d21ce50e863ccf3171462ab61c3ec8George Sapountzis   depth = ((XMesaDrawable)w)->depth;
1629693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
16307a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell   XGetWindowAttributes( v->display, w, &attr );
1631e4e2068ac9d21ce50e863ccf3171462ab61c3ec8George Sapountzis   depth = attr.depth;
1632e4e2068ac9d21ce50e863ccf3171462ab61c3ec8George Sapountzis#endif
1633e4e2068ac9d21ce50e863ccf3171462ab61c3ec8George Sapountzis   if (GET_VISUAL_DEPTH(v) != depth) {
1634a92100a3c6f13597b9f9c47987d232dadd4ebe93Brian Paul      _mesa_warning(NULL, "XMesaCreateWindowBuffer: depth mismatch between visual (%d) and window (%d)!\n",
1635e4e2068ac9d21ce50e863ccf3171462ab61c3ec8George Sapountzis                    GET_VISUAL_DEPTH(v), depth);
1636693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return NULL;
1637693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1638693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
16398d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul   /* Find colormap */
1640693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
16418d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul   cmap = (ColormapPtr)LookupIDByType(wColormap(w), RT_COLORMAP);
1642693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
1643693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (attr.colormap) {
16448d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul      cmap = attr.colormap;
1645693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1646693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
16472ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul      _mesa_warning(NULL, "Window %u has no colormap!\n", (unsigned int) w);
1648693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* this is weird, a window w/out a colormap!? */
1649693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* OK, let's just allocate a new one and hope for the best */
16508d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul      cmap = XCreateColormap(v->display, w, attr.visual, AllocNone);
1651693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1652693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
1653693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1654d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   b = create_xmesa_buffer((XMesaDrawable) w, WINDOW, v, cmap);
1655d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   if (!b)
16568d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul      return NULL;
1657693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1658e4e2068ac9d21ce50e863ccf3171462ab61c3ec8George Sapountzis   if (!initialize_visual_and_buffer( v, b, v->mesa_visual.rgbMode,
1659ad271b8c98021dc82c0714d768a6642aee10794fBrian Paul                                      (XMesaDrawable) w, cmap )) {
1660928a70e4354d4884e2918ec67ddc6d8baf942c8aBrian      xmesa_free_buffer(b);
1661693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return NULL;
1662693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1663693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
16646aa5668871e7f366b33e85fabc72885fc269a7d4George Sapountzis   return b;
16656aa5668871e7f366b33e85fabc72885fc269a7d4George Sapountzis}
16666aa5668871e7f366b33e85fabc72885fc269a7d4George Sapountzis
1667d60009bd6dba15d094b0d0bcb8180b7a2e1c1708George Sapountzis
1668d60009bd6dba15d094b0d0bcb8180b7a2e1c1708George Sapountzis
1669304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick/**
1670693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Create a new XMesaBuffer from an X pixmap.
1671304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick *
1672304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick * \param v    the XMesaVisual
1673304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick * \param p    the pixmap
1674304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick * \param cmap the colormap, may be 0 if using a \c GLX_TRUE_COLOR or
1675304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick *             \c GLX_DIRECT_COLOR visual for the pixmap
1676304d3aa9cb727eb4cd4797c33f8e13e5ac4285a9Ian Romanick * \returns new XMesaBuffer or NULL if error
1677693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
167850aaabc248c9823106ff772873cbf2631d4dadcdGeorge SapountzisPUBLIC XMesaBuffer
16798d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian PaulXMesaCreatePixmapBuffer(XMesaVisual v, XMesaPixmap p, XMesaColormap cmap)
1680693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
16818d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul   XMesaBuffer b;
16828d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul
16838d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul   assert(v);
16848d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul
1685d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   b = create_xmesa_buffer((XMesaDrawable) p, PIXMAP, v, cmap);
1686d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   if (!b)
1687693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return NULL;
1688693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1689e4e2068ac9d21ce50e863ccf3171462ab61c3ec8George Sapountzis   if (!initialize_visual_and_buffer(v, b, v->mesa_visual.rgbMode,
1690ad271b8c98021dc82c0714d768a6642aee10794fBrian Paul				     (XMesaDrawable) p, cmap)) {
1691928a70e4354d4884e2918ec67ddc6d8baf942c8aBrian      xmesa_free_buffer(b);
1692693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return NULL;
1693693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1694693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1695693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return b;
1696693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1697693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1698693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1699fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian/**
1700fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian * For GLX_EXT_texture_from_pixmap
1701fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian */
1702fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrianXMesaBuffer
1703fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrianXMesaCreatePixmapTextureBuffer(XMesaVisual v, XMesaPixmap p,
1704fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian                               XMesaColormap cmap,
1705fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian                               int format, int target, int mipmap)
1706fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian{
1707fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   GET_CURRENT_CONTEXT(ctx);
1708fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   XMesaBuffer b;
1709fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   GLuint width, height;
1710fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian
1711fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   assert(v);
1712fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian
1713fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   b = create_xmesa_buffer((XMesaDrawable) p, PIXMAP, v, cmap);
1714fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   if (!b)
1715fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian      return NULL;
1716fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian
1717fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   /* get pixmap size, update framebuffer/renderbuffer dims */
171824d965fab52f790188e5de6e67e7387809b1f145Michel Dänzer   xmesa_get_window_size(v->display, b, &width, &height);
1719fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   _mesa_resize_framebuffer(NULL, &(b->mesa_buffer), width, height);
1720fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian
1721fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   if (target == 0) {
1722fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian      /* examine dims */
1723fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian      if (ctx->Extensions.ARB_texture_non_power_of_two) {
1724fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian         target = GLX_TEXTURE_2D_EXT;
1725fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian      }
1726fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian      else if (   _mesa_bitcount(width)  == 1
1727fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian               && _mesa_bitcount(height) == 1) {
1728fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian         /* power of two size */
1729fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian         if (height == 1) {
1730fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian            target = GLX_TEXTURE_1D_EXT;
1731fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian         }
1732fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian         else {
1733fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian            target = GLX_TEXTURE_2D_EXT;
1734fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian         }
1735fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian      }
1736fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian      else if (ctx->Extensions.NV_texture_rectangle) {
1737fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian         target = GLX_TEXTURE_RECTANGLE_EXT;
1738fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian      }
1739fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian      else {
1740fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian         /* non power of two textures not supported */
1741fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian         XMesaDestroyBuffer(b);
1742fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian         return 0;
1743fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian      }
1744fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   }
1745fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian
1746fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   b->TextureTarget = target;
1747fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   b->TextureFormat = format;
1748fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   b->TextureMipmap = mipmap;
1749fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian
1750fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   if (!initialize_visual_and_buffer(v, b, v->mesa_visual.rgbMode,
1751fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian				     (XMesaDrawable) p, cmap)) {
1752fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian      xmesa_free_buffer(b);
1753fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian      return NULL;
1754fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   }
1755fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian
1756fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   return b;
1757fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian}
1758fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian
1759fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian
1760693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
17618d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian PaulXMesaBuffer
17628d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian PaulXMesaCreatePBuffer(XMesaVisual v, XMesaColormap cmap,
17638d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul                   unsigned int width, unsigned int height)
1764190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul{
1765e4e2068ac9d21ce50e863ccf3171462ab61c3ec8George Sapountzis#ifndef XFree86Server
1766e4656003caee346d9c4eb23256d73409271291a7Brian Paul   XMesaWindow root;
1767e4656003caee346d9c4eb23256d73409271291a7Brian Paul   XMesaDrawable drawable;  /* X Pixmap Drawable */
17688d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul   XMesaBuffer b;
17698d51bbf2a3b4bac379855c84ebeed86c3578d0c6Brian Paul
1770e4656003caee346d9c4eb23256d73409271291a7Brian Paul   /* allocate pixmap for front buffer */
1771e4656003caee346d9c4eb23256d73409271291a7Brian Paul   root = RootWindow( v->display, v->visinfo->screen );
1772d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   drawable = XCreatePixmap(v->display, root, width, height,
1773d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul                            v->visinfo->depth);
1774d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   if (!drawable)
1775d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul      return NULL;
1776d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul
1777d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   b = create_xmesa_buffer(drawable, PBUFFER, v, cmap);
1778d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   if (!b)
1779d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul      return NULL;
1780e4656003caee346d9c4eb23256d73409271291a7Brian Paul
1781e4e2068ac9d21ce50e863ccf3171462ab61c3ec8George Sapountzis   if (!initialize_visual_and_buffer(v, b, v->mesa_visual.rgbMode,
1782e4656003caee346d9c4eb23256d73409271291a7Brian Paul				     drawable, cmap)) {
1783928a70e4354d4884e2918ec67ddc6d8baf942c8aBrian      xmesa_free_buffer(b);
1784190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul      return NULL;
1785190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul   }
1786190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul
1787190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul   return b;
1788e4e2068ac9d21ce50e863ccf3171462ab61c3ec8George Sapountzis#else
1789e4e2068ac9d21ce50e863ccf3171462ab61c3ec8George Sapountzis   return 0;
1790f2c5296dd7c990f566187621835414c3015058a1Brian Paul#endif
1791190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul}
1792190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul
1793190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul
1794190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul
1795693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
1796693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Deallocate an XMesaBuffer structure and all related info.
1797693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
179850aaabc248c9823106ff772873cbf2631d4dadcdGeorge SapountzisPUBLIC void
1799928a70e4354d4884e2918ec67ddc6d8baf942c8aBrianXMesaDestroyBuffer(XMesaBuffer b)
1800693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1801928a70e4354d4884e2918ec67ddc6d8baf942c8aBrian   xmesa_free_buffer(b);
1802693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1803693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1804693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1805d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul/**
1806d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul * Query the current window size and update the corresponding GLframebuffer
1807d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul * and all attached renderbuffers.
1808d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul * Called when:
1809d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul *  1. the first time a buffer is bound to a context.
1810d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul *  2. from glViewport to poll for window size changes
1811d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul *  3. from the XMesaResizeBuffers() API function.
1812e5070bc3ca75dee31034cc543f3d2ee04e5dc032Brian * Note: it's possible (and legal) for xmctx to be NULL.  That can happen
1813e5070bc3ca75dee31034cc543f3d2ee04e5dc032Brian * when resizing a buffer when no rendering context is bound.
1814d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul */
1815d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paulvoid
1816d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paulxmesa_check_and_update_buffer_size(XMesaContext xmctx, XMesaBuffer drawBuffer)
1817d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul{
1818d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   GLuint width, height;
1819e5070bc3ca75dee31034cc543f3d2ee04e5dc032Brian   xmesa_get_window_size(drawBuffer->display, drawBuffer, &width, &height);
1820d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   if (drawBuffer->mesa_buffer.Width != width ||
1821d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul       drawBuffer->mesa_buffer.Height != height) {
1822e5070bc3ca75dee31034cc543f3d2ee04e5dc032Brian      GLcontext *ctx = xmctx ? &xmctx->mesa : NULL;
1823e5070bc3ca75dee31034cc543f3d2ee04e5dc032Brian      _mesa_resize_framebuffer(ctx, &(drawBuffer->mesa_buffer), width, height);
1824d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   }
182542b26f688d82b2023ea882bfa1fd13bb6548d73aBrian Paul   drawBuffer->mesa_buffer.Initialized = GL_TRUE; /* XXX TEMPORARY? */
1826d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul}
1827d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul
1828693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1829693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
1830693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Bind buffer b to context c and make c the current rendering context.
1831693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
1832693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulGLboolean XMesaMakeCurrent( XMesaContext c, XMesaBuffer b )
1833693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1834693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return XMesaMakeCurrent2( c, b, b );
1835693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1836693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1837693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1838693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
1839693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Bind buffer b to context c and make c the current rendering context.
1840693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
184150aaabc248c9823106ff772873cbf2631d4dadcdGeorge SapountzisPUBLIC
1842693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulGLboolean XMesaMakeCurrent2( XMesaContext c, XMesaBuffer drawBuffer,
1843693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                             XMesaBuffer readBuffer )
1844693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1845693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (c) {
1846693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      if (!drawBuffer || !readBuffer)
1847693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return GL_FALSE;  /* must specify buffers! */
1848693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
18491e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul      if (&(c->mesa) == _mesa_get_current_context()
1850e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul          && c->mesa.DrawBuffer == &drawBuffer->mesa_buffer
1851e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul          && c->mesa.ReadBuffer == &readBuffer->mesa_buffer
1852d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul          && XMESA_BUFFER(c->mesa.DrawBuffer)->wasCurrent) {
1853693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* same context and buffer, do nothing */
1854693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return GL_TRUE;
1855693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1856693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
18573b4fbbc129c711a5aec8d653d5c6eb2e195f947cBrian Paul      c->xm_buffer = drawBuffer;
1858693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
18596346a753c6e77373cffcec6dd0df253efd159dd4George Sapountzis#ifdef FX
18606346a753c6e77373cffcec6dd0df253efd159dd4George Sapountzis      if (FXmakeCurrent( drawBuffer ))
18616346a753c6e77373cffcec6dd0df253efd159dd4George Sapountzis         return GL_TRUE;
18626346a753c6e77373cffcec6dd0df253efd159dd4George Sapountzis#endif
18636346a753c6e77373cffcec6dd0df253efd159dd4George Sapountzis
1864c6c0f947142c0cc82626c238804a68b4e8f53945Brian Paul      /* Call this periodically to detect when the user has begun using
1865c6c0f947142c0cc82626c238804a68b4e8f53945Brian Paul       * GL rendering from multiple threads.
1866c6c0f947142c0cc82626c238804a68b4e8f53945Brian Paul       */
1867c6c0f947142c0cc82626c238804a68b4e8f53945Brian Paul      _glapi_check_multithread();
1868c6c0f947142c0cc82626c238804a68b4e8f53945Brian Paul
186942b26f688d82b2023ea882bfa1fd13bb6548d73aBrian Paul      xmesa_check_and_update_buffer_size(c, drawBuffer);
187042b26f688d82b2023ea882bfa1fd13bb6548d73aBrian Paul      if (readBuffer != drawBuffer)
1871d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul         xmesa_check_and_update_buffer_size(c, readBuffer);
1872d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul
1873e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      _mesa_make_current(&(c->mesa),
1874e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                         &drawBuffer->mesa_buffer,
1875e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                         &readBuffer->mesa_buffer);
1876693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
18771832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul      if (c->xm_visual->mesa_visual.rgbMode) {
1878693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /*
1879693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul          * Must recompute and set these pixel values because colormap
1880693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul          * can be different for different windows.
1881693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul          */
1882e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         c->clearpixel = xmesa_color_to_pixel( &c->mesa,
1883693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                               c->clearcolor[0],
1884693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                               c->clearcolor[1],
1885693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                               c->clearcolor[2],
1886693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                               c->clearcolor[3],
1887693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                               c->xm_visual->undithered_pf);
1888e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         XMesaSetForeground(c->display, drawBuffer->cleargc, c->clearpixel);
1889693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1890693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1891693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Solution to Stephane Rehel's problem with glXReleaseBuffersMESA(): */
1892e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      drawBuffer->wasCurrent = GL_TRUE;
1893693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1894693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
1895693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* Detach */
1896e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      _mesa_make_current( NULL, NULL, NULL );
1897693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1898693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return GL_TRUE;
1899693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1900693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1901693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1902693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
1903693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Unbind the context c from its buffer.
1904693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
1905693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulGLboolean XMesaUnbindContext( XMesaContext c )
1906693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1907693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* A no-op for XFree86 integration purposes */
1908693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return GL_TRUE;
1909693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1910693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1911693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1912693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulXMesaContext XMesaGetCurrentContext( void )
1913693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1914693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   GET_CURRENT_CONTEXT(ctx);
1915693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (ctx) {
19161e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul      XMesaContext xmesa = XMESA_CONTEXT(ctx);
1917693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return xmesa;
1918693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1919693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
1920693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return 0;
1921693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1922693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1923693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1924693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1925693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulXMesaBuffer XMesaGetCurrentBuffer( void )
1926693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1927693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   GET_CURRENT_CONTEXT(ctx);
1928693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (ctx) {
1929e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      XMesaBuffer xmbuf = XMESA_BUFFER(ctx->DrawBuffer);
1930e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      return xmbuf;
1931693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1932693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
1933693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return 0;
1934693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1935693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1936693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1937693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1938693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/* New in Mesa 3.1 */
1939693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulXMesaBuffer XMesaGetCurrentReadBuffer( void )
1940693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1941693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   GET_CURRENT_CONTEXT(ctx);
1942693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (ctx) {
1943d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul      return XMESA_BUFFER(ctx->ReadBuffer);
1944693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1945693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
1946693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return 0;
1947693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1948693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1949693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1950693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
195150aaabc248c9823106ff772873cbf2631d4dadcdGeorge Sapountzis#ifdef XFree86Server
195250aaabc248c9823106ff772873cbf2631d4dadcdGeorge SapountzisPUBLIC
1953693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulGLboolean XMesaForceCurrent(XMesaContext c)
1954693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1955693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (c) {
19567439a36785b6a2783e80a40a96c09db8f56dc2bcGeorge Sapountzis      _glapi_set_dispatch(c->mesa.CurrentDispatch);
19577439a36785b6a2783e80a40a96c09db8f56dc2bcGeorge Sapountzis
19581e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul      if (&(c->mesa) != _mesa_get_current_context()) {
1959e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul	 _mesa_make_current(&c->mesa, c->mesa.DrawBuffer, c->mesa.ReadBuffer);
1960693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
1961693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1962693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
1963e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      _mesa_make_current(NULL, NULL, NULL);
1964693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
1965693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return GL_TRUE;
1966693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1967693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1968693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
196950aaabc248c9823106ff772873cbf2631d4dadcdGeorge SapountzisPUBLIC
1970693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulGLboolean XMesaLoseCurrent(XMesaContext c)
1971693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
1972693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   (void) c;
1973e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   _mesa_make_current(NULL, NULL, NULL);
1974693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return GL_TRUE;
1975693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
1976693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1977693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
197850aaabc248c9823106ff772873cbf2631d4dadcdGeorge SapountzisPUBLIC
19797439a36785b6a2783e80a40a96c09db8f56dc2bcGeorge SapountzisGLboolean XMesaCopyContext( XMesaContext xm_src, XMesaContext xm_dst, GLuint mask )
19807439a36785b6a2783e80a40a96c09db8f56dc2bcGeorge Sapountzis{
19817439a36785b6a2783e80a40a96c09db8f56dc2bcGeorge Sapountzis   _mesa_copy_context(&xm_src->mesa, &xm_dst->mesa, mask);
19827439a36785b6a2783e80a40a96c09db8f56dc2bcGeorge Sapountzis   return GL_TRUE;
19837439a36785b6a2783e80a40a96c09db8f56dc2bcGeorge Sapountzis}
198450aaabc248c9823106ff772873cbf2631d4dadcdGeorge Sapountzis#endif /* XFree86Server */
19857439a36785b6a2783e80a40a96c09db8f56dc2bcGeorge Sapountzis
19867439a36785b6a2783e80a40a96c09db8f56dc2bcGeorge Sapountzis
19874d944b502f8a1ae372d9248e888612bffb5eb6a5George Sapountzis#ifndef FX
19886aa5668871e7f366b33e85fabc72885fc269a7d4George SapountzisGLboolean XMesaSetFXmode( GLint mode )
19896aa5668871e7f366b33e85fabc72885fc269a7d4George Sapountzis{
1990693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   (void) mode;
1991693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return GL_FALSE;
1992693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
19936aa5668871e7f366b33e85fabc72885fc269a7d4George Sapountzis#endif
1994693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1995693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1996693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
1997693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
1998693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Copy the back buffer to the front buffer.  If there's no back buffer
1999693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * this is a no-op.
2000693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
200150aaabc248c9823106ff772873cbf2631d4dadcdGeorge SapountzisPUBLIC
2002693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulvoid XMesaSwapBuffers( XMesaBuffer b )
2003693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2004693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   GET_CURRENT_CONTEXT(ctx);
2005693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2006692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul   if (!b->backxrb) {
2007692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul      /* single buffered */
2008692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul      return;
2009692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul   }
2010692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul
2011693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* If we're swapping the buffer associated with the current context
2012693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * we have to flush any pending rendering commands first.
2013693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    */
201418a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul   if (ctx && ctx->DrawBuffer == &(b->mesa_buffer))
201560b6e4fd7e85ca0ad1c4ab22433b745bf97e9280Brian Paul      _mesa_notifySwapBuffers(ctx);
2016693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2017692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul   if (b->db_mode) {
2018d60009bd6dba15d094b0d0bcb8180b7a2e1c1708George Sapountzis#ifdef FX
20194d944b502f8a1ae372d9248e888612bffb5eb6a5George Sapountzis      if (FXswapBuffers(b))
20204d944b502f8a1ae372d9248e888612bffb5eb6a5George Sapountzis         return;
2021d60009bd6dba15d094b0d0bcb8180b7a2e1c1708George Sapountzis#endif
20224d944b502f8a1ae372d9248e888612bffb5eb6a5George Sapountzis      if (b->backxrb->ximage) {
2023e5070bc3ca75dee31034cc543f3d2ee04e5dc032Brian	 /* Copy Ximage (back buf) from client memory to server window */
2024693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#if defined(USE_XSHM) && !defined(XFree86Server)
2025693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 if (b->shm) {
2026693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            /*_glthread_LOCK_MUTEX(_xmesa_lock);*/
2027ad271b8c98021dc82c0714d768a6642aee10794fBrian Paul	    XShmPutImage( b->xm_visual->display, b->frontxrb->drawable,
20289ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul			  b->swapgc,
2029e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul			  b->backxrb->ximage, 0, 0,
203029926a11b16ec7a235947d95e9a46777605dd30eBrian Paul			  0, 0, b->mesa_buffer.Width, b->mesa_buffer.Height,
203129926a11b16ec7a235947d95e9a46777605dd30eBrian Paul                          False );
2032693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            /*_glthread_UNLOCK_MUTEX(_xmesa_lock);*/
2033693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 }
2034693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 else
2035693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
2036693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         {
2037693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            /*_glthread_LOCK_MUTEX(_xmesa_lock);*/
2038ad271b8c98021dc82c0714d768a6642aee10794fBrian Paul            XMesaPutImage( b->xm_visual->display, b->frontxrb->drawable,
20399ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul			   b->swapgc,
2040e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul			   b->backxrb->ximage, 0, 0,
204129926a11b16ec7a235947d95e9a46777605dd30eBrian Paul			   0, 0, b->mesa_buffer.Width, b->mesa_buffer.Height );
2042693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            /*_glthread_UNLOCK_MUTEX(_xmesa_lock);*/
2043693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
2044693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2045e5070bc3ca75dee31034cc543f3d2ee04e5dc032Brian      else if (b->backxrb->pixmap) {
2046e5070bc3ca75dee31034cc543f3d2ee04e5dc032Brian	 /* Copy pixmap (back buf) to window (front buf) on server */
2047693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /*_glthread_LOCK_MUTEX(_xmesa_lock);*/
2048693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 XMesaCopyArea( b->xm_visual->display,
2049e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul			b->backxrb->pixmap,   /* source drawable */
2050ad271b8c98021dc82c0714d768a6642aee10794fBrian Paul			b->frontxrb->drawable,  /* dest. drawable */
20519ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul			b->swapgc,
205229926a11b16ec7a235947d95e9a46777605dd30eBrian Paul			0, 0, b->mesa_buffer.Width, b->mesa_buffer.Height,
2053693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul			0, 0                 /* dest region */
2054693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul		      );
2055693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /*_glthread_UNLOCK_MUTEX(_xmesa_lock);*/
2056693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
20578e1c3bd0b4c599bae5b64cd51cec1d74266f30fbBrian
20588e1c3bd0b4c599bae5b64cd51cec1d74266f30fbBrian      if (b->swAlpha)
20598e1c3bd0b4c599bae5b64cd51cec1d74266f30fbBrian         _mesa_copy_soft_alpha_renderbuffers(ctx, &b->mesa_buffer);
2060693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2061655ba5d9927187e76b66f5886d090624dc4b1dd9Brian Paul#if !defined(XFree86Server)
2062693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XSync( b->xm_visual->display, False );
2063693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
2064693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2065693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2066693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2067693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2068693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
2069693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Copy sub-region of back buffer to front buffer
2070693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
2071693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulvoid XMesaCopySubBuffer( XMesaBuffer b, int x, int y, int width, int height )
2072693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2073693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   GET_CURRENT_CONTEXT(ctx);
2074693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2075693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   /* If we're swapping the buffer associated with the current context
2076693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    * we have to flush any pending rendering commands first.
2077693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul    */
20781d01794e6efa2a366057412f24f82504cc3c2d87Brian Paul   if (ctx && ctx->DrawBuffer == &(b->mesa_buffer))
207960b6e4fd7e85ca0ad1c4ab22433b745bf97e9280Brian Paul      _mesa_notifySwapBuffers(ctx);
2080693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2081692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul   if (!b->backxrb) {
2082692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul      /* single buffered */
2083692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul      return;
2084692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul   }
2085692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul
2086692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul   if (b->db_mode) {
208729926a11b16ec7a235947d95e9a46777605dd30eBrian Paul      int yTop = b->mesa_buffer.Height - y - height;
2088d60009bd6dba15d094b0d0bcb8180b7a2e1c1708George Sapountzis#ifdef FX
20894d944b502f8a1ae372d9248e888612bffb5eb6a5George Sapountzis      if (FXswapBuffers(b))
20904d944b502f8a1ae372d9248e888612bffb5eb6a5George Sapountzis         return;
2091d60009bd6dba15d094b0d0bcb8180b7a2e1c1708George Sapountzis#endif
2092e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      if (b->backxrb->ximage) {
2093693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* Copy Ximage from host's memory to server's window */
2094693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#if defined(USE_XSHM) && !defined(XFree86Server)
2095693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         if (b->shm) {
2096693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            /* XXX assuming width and height aren't too large! */
2097ad271b8c98021dc82c0714d768a6642aee10794fBrian Paul            XShmPutImage( b->xm_visual->display, b->frontxrb->drawable,
20989ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul                          b->swapgc,
2099e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                          b->backxrb->ximage, x, yTop,
2100693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                          x, yTop, width, height, False );
2101693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            /* wait for finished event??? */
2102693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
2103693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         else
2104693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
2105693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         {
2106693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            /* XXX assuming width and height aren't too large! */
2107ad271b8c98021dc82c0714d768a6642aee10794fBrian Paul            XMesaPutImage( b->xm_visual->display, b->frontxrb->drawable,
21089ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul			   b->swapgc,
2109e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul			   b->backxrb->ximage, x, yTop,
2110693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul			   x, yTop, width, height );
2111693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
2112693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2113693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      else {
2114693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* Copy pixmap to window on server */
2115693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         XMesaCopyArea( b->xm_visual->display,
2116e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul			b->backxrb->pixmap,           /* source drawable */
2117ad271b8c98021dc82c0714d768a6642aee10794fBrian Paul			b->frontxrb->drawable,        /* dest. drawable */
21189ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul			b->swapgc,
2119693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul			x, yTop, width, height,  /* source region */
2120693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul			x, yTop                  /* dest region */
2121693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                      );
2122693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2123693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2124693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2125693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2126693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2127693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
2128693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return a pointer to the XMesa backbuffer Pixmap or XImage.  This function
2129693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * is a way to get "under the hood" of X/Mesa so one can manipulate the
2130693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * back buffer directly.
2131693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Output:  pixmap - pointer to back buffer's Pixmap, or 0
2132693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *          ximage - pointer to back buffer's XImage, or NULL
2133693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return:  GL_TRUE = context is double buffered
2134693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *          GL_FALSE = context is single buffered
2135693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
2136ad271b8c98021dc82c0714d768a6642aee10794fBrian Paul#ifndef XFree86Server
2137693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulGLboolean XMesaGetBackBuffer( XMesaBuffer b,
2138693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                              XMesaPixmap *pixmap,
2139693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                              XMesaImage **ximage )
2140693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2141692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul   if (b->db_mode) {
2142692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul      if (pixmap)
2143692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul         *pixmap = b->backxrb->pixmap;
2144692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul      if (ximage)
2145692147ebf7f09d56a7de1659de2449478da4d1baBrian Paul         *ximage = b->backxrb->ximage;
2146693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return GL_TRUE;
2147693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2148693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
2149693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      *pixmap = 0;
2150693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      *ximage = NULL;
2151693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return GL_FALSE;
2152693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2153693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2154ad271b8c98021dc82c0714d768a6642aee10794fBrian Paul#endif /* XFree86Server */
2155693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2156693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2157693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
2158693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return the depth buffer associated with an XMesaBuffer.
2159693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Input:  b - the XMesa buffer handle
2160693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Output:  width, height - size of buffer in pixels
2161693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *          bytesPerValue - bytes per depth value (2 or 4)
2162693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *          buffer - pointer to depth buffer values
2163693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return:  GL_TRUE or GL_FALSE to indicate success or failure.
2164693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
2165693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulGLboolean XMesaGetDepthBuffer( XMesaBuffer b, GLint *width, GLint *height,
2166693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                               GLint *bytesPerValue, void **buffer )
2167693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2168e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   struct gl_renderbuffer *rb
2169e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      = b->mesa_buffer.Attachment[BUFFER_DEPTH].Renderbuffer;
2170e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   if (!rb || !rb->Data) {
2171693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      *width = 0;
2172693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      *height = 0;
2173693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      *bytesPerValue = 0;
2174693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      *buffer = 0;
2175693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return GL_FALSE;
2176693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2177693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
21781832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul      *width = b->mesa_buffer.Width;
21791832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul      *height = b->mesa_buffer.Height;
2180f448e632b60c3bb81cc3a01d92430f5e4a110327Brian Paul      *bytesPerValue = b->mesa_buffer.Visual.depthBits <= 16
2181f448e632b60c3bb81cc3a01d92430f5e4a110327Brian Paul         ? sizeof(GLushort) : sizeof(GLuint);
2182e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      *buffer = rb->Data;
2183693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return GL_TRUE;
2184693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2185693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2186693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2187693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2188693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulvoid XMesaFlush( XMesaContext c )
2189693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2190693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (c && c->xm_visual) {
2191693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
2192693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      /* NOT_NEEDED */
2193693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
2194693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      XSync( c->xm_visual->display, False );
2195693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
2196693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2197693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2198693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2199693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2200693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2201693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulconst char *XMesaGetString( XMesaContext c, int name )
2202693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2203693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   (void) c;
2204693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   if (name==XMESA_VERSION) {
22053160edec3305a81e13aa2b5a3387a0a75c1747bfBrian Paul      return "5.0";
2206693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2207693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else if (name==XMESA_EXTENSIONS) {
2208693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return "";
2209693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2210693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   else {
2211693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      return NULL;
2212693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2213693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2214693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2215693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2216693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2217693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulXMesaBuffer XMesaFindBuffer( XMesaDisplay *dpy, XMesaDrawable d )
2218693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2219693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaBuffer b;
2220693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   for (b=XMesaBufferList; b; b=b->Next) {
2221ad271b8c98021dc82c0714d768a6642aee10794fBrian Paul      if (b->frontxrb->drawable == d && b->display == dpy) {
2222693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return b;
2223693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2224693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2225693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return NULL;
2226693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2227693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2228693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
22296c06ce281aa7a7e20eab1934f573bc5c673d41cbBrian Paul/**
22306c06ce281aa7a7e20eab1934f573bc5c673d41cbBrian Paul * Free/destroy all XMesaBuffers associated with given display.
22316c06ce281aa7a7e20eab1934f573bc5c673d41cbBrian Paul */
22326c06ce281aa7a7e20eab1934f573bc5c673d41cbBrian Paulvoid xmesa_destroy_buffers_on_display(XMesaDisplay *dpy)
22336c06ce281aa7a7e20eab1934f573bc5c673d41cbBrian Paul{
22346c06ce281aa7a7e20eab1934f573bc5c673d41cbBrian Paul   XMesaBuffer b, next;
22356c06ce281aa7a7e20eab1934f573bc5c673d41cbBrian Paul   for (b = XMesaBufferList; b; b = next) {
22366c06ce281aa7a7e20eab1934f573bc5c673d41cbBrian Paul      next = b->Next;
22376c06ce281aa7a7e20eab1934f573bc5c673d41cbBrian Paul      if (b->display == dpy) {
2238928a70e4354d4884e2918ec67ddc6d8baf942c8aBrian         xmesa_free_buffer(b);
22396c06ce281aa7a7e20eab1934f573bc5c673d41cbBrian Paul      }
22406c06ce281aa7a7e20eab1934f573bc5c673d41cbBrian Paul   }
22416c06ce281aa7a7e20eab1934f573bc5c673d41cbBrian Paul}
22426c06ce281aa7a7e20eab1934f573bc5c673d41cbBrian Paul
2243693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2244693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/*
2245693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Look for XMesaBuffers whose X window has been destroyed.
2246693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Deallocate any such XMesaBuffers.
2247693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */
2248693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulvoid XMesaGarbageCollect( void )
2249693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2250693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   XMesaBuffer b, next;
2251693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   for (b=XMesaBufferList; b; b=next) {
2252693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      next = b->Next;
2253ad271b8c98021dc82c0714d768a6642aee10794fBrian Paul      if (b->display && b->frontxrb->drawable && b->type == WINDOW) {
2254693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server
2255693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul	 /* NOT_NEEDED */
2256693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else
2257693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         XSync(b->display, False);
2258ad271b8c98021dc82c0714d768a6642aee10794fBrian Paul         if (!window_exists( b->display, b->frontxrb->drawable )) {
2259693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            /* found a dead window, free the ancillary info */
2260693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            XMesaDestroyBuffer( b );
2261693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
2262693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif
2263693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      }
2264693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2265693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2266693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2267693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2268693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulunsigned long XMesaDitherColor( XMesaContext xmesa, GLint x, GLint y,
2269693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                GLfloat red, GLfloat green,
2270693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul                                GLfloat blue, GLfloat alpha )
2271693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{
2272e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   GLcontext *ctx = &xmesa->mesa;
2273693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   GLint r = (GLint) (red   * 255.0F);
2274693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   GLint g = (GLint) (green * 255.0F);
2275693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   GLint b = (GLint) (blue  * 255.0F);
2276693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   GLint a = (GLint) (alpha * 255.0F);
2277693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2278693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   switch (xmesa->pixelformat) {
2279449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      case PF_Index:
2280693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return 0;
2281449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      case PF_Truecolor:
2282693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         {
2283693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            unsigned long p;
2284693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            PACK_TRUECOLOR( p, r, g, b );
2285693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            return p;
2286693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
2287693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_8A8B8G8R:
2288693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return PACK_8A8B8G8R( r, g, b, a );
228941bddcfa7bbc65bcd2fc60ada9761d3065e71388Brian Paul      case PF_8A8R8G8B:
229041bddcfa7bbc65bcd2fc60ada9761d3065e71388Brian Paul         return PACK_8A8R8G8B( r, g, b, a );
2291693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_8R8G8B:
2292693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return PACK_8R8G8B( r, g, b );
2293693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_5R6G5B:
2294693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return PACK_5R6G5B( r, g, b );
2295449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      case PF_Dither:
2296693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         {
2297693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            DITHER_SETUP;
2298693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            return DITHER( x, y, r, g, b );
2299693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
2300449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      case PF_1Bit:
2301693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* 382 = (3*255)/2 */
2302693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return ((r+g+b) > 382) ^ xmesa->xm_visual->bitFlip;
2303693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      case PF_HPCR:
2304693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return DITHER_HPCR(x, y, r, g, b);
2305449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      case PF_Lookup:
2306693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         {
2307693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            LOOKUP_SETUP;
2308693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            return LOOKUP( r, g, b );
2309693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
2310449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      case PF_Grayscale:
2311693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         return GRAY_RGB( r, g, b );
2312449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      case PF_Dither_5R6G5B:
2313693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         /* fall through */
2314449e47f06a46c42fb9895d13f37b599600225e56Brian Paul      case PF_Dither_True:
2315693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         {
2316693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            unsigned long p;
2317693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            PACK_TRUEDITHER(p, x, y, r, g, b);
2318693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul            return p;
2319693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul         }
2320693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul      default:
232108836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul         _mesa_problem(NULL, "Bad pixel format in XMesaDitherColor");
2322693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   }
2323693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul   return 0;
2324693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}
2325693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
2326693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul
232718a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul/*
232818a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul * This is typically called when the window size changes and we need
232918a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul * to reallocate the buffer's back/depth/stencil/accum buffers.
233018a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul */
233150aaabc248c9823106ff772873cbf2631d4dadcdGeorge SapountzisPUBLIC void
2332d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian PaulXMesaResizeBuffers( XMesaBuffer b )
233318a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul{
2334e0e993c5ff090058037875642dcd34727a3d8760Adam Jackson   GET_CURRENT_CONTEXT(ctx);
2335d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   XMesaContext xmctx = XMESA_CONTEXT(ctx);
2336f04979ae481acc9fdc423da06514c4d557edd7cdMathias Hopf   if (!xmctx)
2337f04979ae481acc9fdc423da06514c4d557edd7cdMathias Hopf      return;
2338d21fa9cd79e4198b673c1453b8bc05749f8a73ebBrian Paul   xmesa_check_and_update_buffer_size(xmctx, b);
233918a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul}
234018a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul
2341fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian
2342fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrianstatic GLint
2343fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrianxbuffer_to_renderbuffer(int buffer)
2344fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian{
2345fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   assert(MAX_AUX_BUFFERS <= 4);
2346fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian
2347fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   switch (buffer) {
2348fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   case GLX_FRONT_LEFT_EXT:
2349fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian      return BUFFER_FRONT_LEFT;
2350fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   case GLX_FRONT_RIGHT_EXT:
2351fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian      return BUFFER_FRONT_RIGHT;
2352fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   case GLX_BACK_LEFT_EXT:
2353fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian      return BUFFER_BACK_LEFT;
2354fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   case GLX_BACK_RIGHT_EXT:
2355fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian      return BUFFER_BACK_RIGHT;
2356fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   case GLX_AUX0_EXT:
2357fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian      return BUFFER_AUX0;
2358fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   case GLX_AUX1_EXT:
2359fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   case GLX_AUX2_EXT:
2360fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   case GLX_AUX3_EXT:
2361fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   case GLX_AUX4_EXT:
2362fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   case GLX_AUX5_EXT:
2363fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   case GLX_AUX6_EXT:
2364fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   case GLX_AUX7_EXT:
2365fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   case GLX_AUX8_EXT:
2366fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   case GLX_AUX9_EXT:
2367fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   default:
2368fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian      /* BadValue error */
2369fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian      return -1;
2370fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   }
2371fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian}
2372fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian
2373fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian
2374fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrianPUBLIC void
237524d965fab52f790188e5de6e67e7387809b1f145Michel DänzerXMesaBindTexImage(XMesaDisplay *dpy, XMesaBuffer drawable, int buffer,
2376fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian                  const int *attrib_list)
2377fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian{
2378fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian#if 0
2379fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   GET_CURRENT_CONTEXT(ctx);
2380fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   const GLuint unit = ctx->Texture.CurrentUnit;
2381fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];
2382fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   struct gl_texture_object *texObj;
2383fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian#endif
2384fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   struct gl_renderbuffer *rb;
2385fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   struct xmesa_renderbuffer *xrb;
2386fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   GLint b;
238724d965fab52f790188e5de6e67e7387809b1f145Michel Dänzer   XMesaImage *img = NULL;
2388fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   GLboolean freeImg = GL_FALSE;
2389fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian
2390fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   b = xbuffer_to_renderbuffer(buffer);
2391fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   if (b < 0)
2392fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian      return;
2393fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian
2394fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   if (drawable->TextureFormat == GLX_TEXTURE_FORMAT_NONE_EXT)
2395fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian      return; /* BadMatch error */
2396fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian
2397fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   rb = drawable->mesa_buffer.Attachment[b].Renderbuffer;
2398fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   if (!rb) {
2399fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian      /* invalid buffer */
2400fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian      return;
2401fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   }
2402fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   xrb = xmesa_renderbuffer(rb);
2403fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian
2404fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian#if 0
2405fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   switch (drawable->TextureTarget) {
2406fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   case GLX_TEXTURE_1D_EXT:
24079818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul      texObj = texUnit->CurrentTex[TEXTURE_1D_INDEX];
2408fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian      break;
2409fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   case GLX_TEXTURE_2D_EXT:
24109818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul      texObj = texUnit->CurrentTex[TEXTURE_2D_INDEX];
2411fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian      break;
2412fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   case GLX_TEXTURE_RECTANGLE_EXT:
24139818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul      texObj = texUnit->CurrentTex[TEXTURE_RECT_INDEX];
2414fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian      break;
2415fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   default:
2416fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian      return; /* BadMatch error */
2417fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   }
2418fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian#endif
2419fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian
2420fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   /*
2421fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian    * The following is a quick and simple way to implement
2422fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian    * BindTexImage.  The better way is to write some new FetchTexel()
2423fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian    * functions which would extract texels from XImages.  We'd still
242424d965fab52f790188e5de6e67e7387809b1f145Michel Dänzer    * need to use GetImage when texturing from a Pixmap (front buffer)
2425fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian    * but texturing from a back buffer (XImage) would avoid an image
2426fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian    * copy.
2427fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian    */
2428fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian
2429fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   /* get XImage */
2430fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   if (xrb->pixmap) {
243124d965fab52f790188e5de6e67e7387809b1f145Michel Dänzer      img = XMesaGetImage(dpy, xrb->pixmap, 0, 0, rb->Width, rb->Height, ~0L,
243224d965fab52f790188e5de6e67e7387809b1f145Michel Dänzer			  ZPixmap);
2433fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian      freeImg = GL_TRUE;
2434fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   }
2435fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   else if (xrb->ximage) {
2436fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian      img = xrb->ximage;
2437fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   }
2438fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian
2439fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   /* store the XImage as a new texture image */
2440fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   if (img) {
2441fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian      GLenum format, type, intFormat;
2442fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian      if (img->bits_per_pixel == 32) {
2443fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian         format = GL_BGRA;
2444fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian         type = GL_UNSIGNED_BYTE;
2445fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian         intFormat = GL_RGBA;
2446fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian      }
2447fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian      else if (img->bits_per_pixel == 24) {
2448fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian         format = GL_BGR;
2449fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian         type = GL_UNSIGNED_BYTE;
2450fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian         intFormat = GL_RGB;
2451fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian      }
2452fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian      else if (img->bits_per_pixel == 16) {
2453fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian         format = GL_BGR;
2454fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian         type = GL_UNSIGNED_SHORT_5_6_5;
2455fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian         intFormat = GL_RGB;
2456fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian      }
2457fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian      else {
2458fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian         _mesa_problem(NULL, "Unexpected XImage format in XMesaBindTexImage");
2459fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian         return;
2460fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian      }
2461fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian      if (drawable->TextureFormat == GLX_TEXTURE_FORMAT_RGBA_EXT) {
2462fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian         intFormat = GL_RGBA;
2463fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian      }
2464fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian      else if (drawable->TextureFormat == GLX_TEXTURE_FORMAT_RGB_EXT) {
2465fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian         intFormat = GL_RGB;
2466fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian      }
2467fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian
2468fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian      _mesa_TexImage2D(GL_TEXTURE_2D, 0, intFormat, rb->Width, rb->Height, 0,
2469fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian                       format, type, img->data);
2470fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian
2471fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian      if (freeImg) {
2472fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian	 XMesaDestroyImage(img);
2473fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian      }
2474fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   }
2475fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian}
2476fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian
2477fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian
2478fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian
2479fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrianPUBLIC void
248024d965fab52f790188e5de6e67e7387809b1f145Michel DänzerXMesaReleaseTexImage(XMesaDisplay *dpy, XMesaBuffer drawable, int buffer)
2481fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian{
2482fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   const GLint b = xbuffer_to_renderbuffer(buffer);
2483fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   if (b < 0)
2484fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian      return;
2485fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian
2486fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian   /* no-op for now */
2487fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian}
2488fd54564f78d4aeae2c39ada7502ec659c14b3ecaBrian
2489