xm_api.c revision 1d01794e6efa2a366057412f24f82504cc3c2d87
17d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org/* $Id: xm_api.c,v 1.34 2002/03/12 21:55:50 brianp Exp $ */
27d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
37d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org/*
47d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * Mesa 3-D graphics library
57d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * Version:  4.1
67d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org *
77d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * Copyright (C) 1999-2002  Brian Paul   All Rights Reserved.
87d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org *
97d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a
107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * copy of this software and associated documentation files (the "Software"),
117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * to deal in the Software without restriction, including without limitation
127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense,
137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * and/or sell copies of the Software, and to permit persons to whom the
147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * Software is furnished to do so, subject to the following conditions:
157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org *
167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * The above copyright notice and this permission notice shall be included
177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * in all copies or substantial portions of the Software.
187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org *
19fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
24fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org */
267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org/* $XFree86: xc/extras/Mesa/src/X/xm_api.c,v 1.2 2002/02/26 23:37:31 tsi Exp $ */
277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org/*
297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * This file contains the implementations of all the XMesa* functions.
307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org *
317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org *
327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * NOTES:
337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org *
347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * The window coordinate system origin (0,0) is in the lower-left corner
357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * of the window.  X11's window coordinate origin is in the upper-left
367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * corner of the window.  Therefore, most drawing functions in this
377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * file have to flip Y coordinates.
387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org *
397d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * Define USE_XSHM in the Makefile with -DUSE_XSHM if you want to compile
407d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * in support for the MIT Shared Memory extension.  If enabled, when you
417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * use an Ximage for the back buffer in double buffered mode, the "swap"
427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * operation will be faster.  You must also link with -lXext.
437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org *
447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * Byte swapping:  If the Mesa host and the X display use a different
457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * byte order then there's some trickiness to be aware of when using
467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * XImages.  The byte ordering used for the XImage is that of the X
477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * display, not the Mesa host.
487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * The color-to-pixel encoding for True/DirectColor must be done
497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * according to the display's visual red_mask, green_mask, and blue_mask.
507d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * If XPutPixel is used to put a pixel into an XImage then XPutPixel will
517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * do byte swapping if needed.  If one wants to directly "poke" the pixel
527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * into the XImage's buffer then the pixel must be byte swapped first.  In
537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * Mesa, when byte swapping is needed we use the PF_TRUECOLOR pixel format
547d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * and use XPutPixel everywhere except in the implementation of
557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * glClear(GL_COLOR_BUFFER_BIT).  We want this function to be fast so
567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * instead of using XPutPixel we "poke" our values after byte-swapping
577d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * the clear pixel value if needed.
587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org *
597d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org */
607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
617d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#ifdef __CYGWIN__
627d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#undef WIN32
637d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#undef __WIN32__
647d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#endif
657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "glxheader.h"
677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "GL/xmesa.h"
687d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "xmesaP.h"
697d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#include "context.h"
70fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org#include "extensions.h"
71fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org#include "glthread.h"
72fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org#include "matrix.h"
73fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org#include "mem.h"
74fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org#include "mmath.h"
75fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org#include "mtypes.h"
76fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org#ifdef HAVE_CONFIG_H
77fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org#include "conf.h"
78fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org#endif
79fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org#include "macros.h"
80fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org#include "texformat.h"
81fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org#include "texstore.h"
82fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org#include "swrast/swrast.h"
83fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org#include "swrast_setup/swrast_setup.h"
84fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org#include "array_cache/acache.h"
85fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org#include "tnl/tnl.h"
86fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org
87fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org#ifndef GLX_NONE_EXT
88fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org#define GLX_NONE_EXT 0x8000
89fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org#endif
90fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org
91fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org
92fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org/*
93fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org * Global X driver lock
94fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org */
95fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org_glthread_Mutex _xmesa_lock;
96fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org
97fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org
98fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org
99fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org/*
100fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org * Lookup tables for HPCR pixel format:
101fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org */
102fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.orgstatic short hpcr_rgbTbl[3][256] = {
103fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org{
104fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org 16,  16,  17,  17,  18,  18,  19,  19,  20,  20,  21,  21,  22,  22,  23,  23,
105fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org 24,  24,  25,  25,  26,  26,  27,  27,  28,  28,  29,  29,  30,  30,  31,  31,
1067d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 32,  32,  33,  33,  34,  34,  35,  35,  36,  36,  37,  37,  38,  38,  39,  39,
1077d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,
1087d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,
1097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
11031c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org 80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95,
1117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 96,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
1125e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127,
1137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143,
1147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
1157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175,
1167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
1177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207,
1187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223,
1197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239
1205e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org},
12131c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org{
1227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 16,  16,  17,  17,  18,  18,  19,  19,  20,  20,  21,  21,  22,  22,  23,  23,
1235e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org 24,  24,  25,  25,  26,  26,  27,  27,  28,  28,  29,  29,  30,  30,  31,  31,
1245e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org 32,  32,  33,  33,  34,  34,  35,  35,  36,  36,  37,  37,  38,  38,  39,  39,
1257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,  45,  46,  47,
1267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,
1277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 64,  65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,  79,
1287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95,
1297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 96,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
1307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127,
1317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143,
1327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
1337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175,
1345e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
1357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207,
1367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223,
1377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239
1387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org},
1397d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org{
14031c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org 32,  32,  33,  33,  34,  34,  35,  35,  36,  36,  37,  37,  38,  38,  39,  39,
1417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 40,  40,  41,  41,  42,  42,  43,  43,  44,  44,  45,  45,  46,  46,  47,  47,
1427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 48,  48,  49,  49,  50,  50,  51,  51,  52,  52,  53,  53,  54,  54,  55,  55,
1437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 56,  56,  57,  57,  58,  58,  59,  59,  60,  60,  61,  61,  62,  62,  63,  63,
1447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 64,  64,  65,  65,  66,  66,  67,  67,  68,  68,  69,  69,  70,  70,  71,  71,
1457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 72,  72,  73,  73,  74,  74,  75,  75,  76,  76,  77,  77,  78,  78,  79,  79,
1467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 80,  80,  81,  81,  82,  82,  83,  83,  84,  84,  85,  85,  86,  86,  87,  87,
1477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95,
1487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org 96,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
1497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127,
1507d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143,
1517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
1527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175,
1537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191,
1547d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207,
1557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223
1567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
1577d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org};
1585e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
15931c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org
1607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1615e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org/**********************************************************************/
1627d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org/*****                     X Utility Functions                    *****/
1637d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org/**********************************************************************/
1647d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org/*
1677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * X/Mesa error reporting function:
1687d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org */
1695e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgstatic void error( const char *msg )
1705e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org{
17131c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org   (void)DitherValues;		/* Muffle compiler */
1727d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1735e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org   if (getenv("MESA_DEBUG"))
1747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      fprintf( stderr, "X/Mesa error: %s\n", msg );
1757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
1767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1787d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org/*
1797d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * Return the host's byte order as LSBFirst or MSBFirst ala X.
1807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org */
1817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#ifndef XFree86Server
1825e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgstatic int host_byte_order( void )
18331c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org{
1847d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   int i = 1;
1857d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   char *cptr = (char *) &i;
1867d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   return (*cptr==1) ? LSBFirst : MSBFirst;
1877d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
1887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#endif
1897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1917d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org/*
1927d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * Error handling.
1935e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org */
1945e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org#ifndef XFree86Server
19531c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.orgstatic int mesaXErrorFlag = 0;
1967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
1977d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgstatic int mesaHandleXError( XMesaDisplay *dpy, XErrorEvent *event )
1987d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org{
1997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   (void) dpy;
2007d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   (void) event;
2017d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   mesaXErrorFlag = 1;
2027d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   return 0;
2037d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
2047d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#endif
2055e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
2067d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
2077d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org/*
2085e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org * Check if the X Shared Memory extension is available.
2097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * Return:  0 = not available
2107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org *          1 = shared XImage support available
2117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org *          2 = shared Pixmap support available also
2127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org */
2137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#ifndef XFree86Server
2147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgstatic int check_for_xshm( XMesaDisplay *display )
21531c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org{
2167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#ifdef USE_XSHM
2177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   int major, minor, ignore;
2187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   Bool pixmaps;
2197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
2207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   if (XQueryExtension( display, "MIT-SHM", &ignore, &ignore, &ignore )) {
2217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      if (XShmQueryVersion( display, &major, &minor, &pixmaps )==True) {
2227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org	 return (pixmaps==True) ? 2 : 1;
2237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      }
2247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      else {
2257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org	 return 0;
2267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      }
2277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   }
2287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   else {
2295e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      return 0;
2307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   }
2317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#else
2325e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org   /* Can't compile XSHM support */
2337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   return 0;
2347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#endif
2357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
2367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#endif
2377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
2387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
23931c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org/*
2407d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * Return the width and height of the given drawable.
2417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org */
2427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgstatic void get_drawable_size( XMesaDisplay *dpy, XMesaDrawable d,
2437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                               unsigned int *width, unsigned int *height)
2447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org{
2457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#ifdef XFree86Server
2467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    (void) dpy;
2477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    *width = d->width;
2487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    *height = d->height;
2497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#else
2505e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org   Window root;
2517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   int x, y;
2527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   unsigned int bw, depth;
2535e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
2547d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   _glthread_LOCK_MUTEX(_xmesa_lock);
2557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   XGetGeometry( dpy, d, &root, &x, &y, width, height, &bw, &depth );
2567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   _glthread_UNLOCK_MUTEX(_xmesa_lock);
2577d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#endif
2587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
2597d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
26031c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org
2617d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org/*
2627d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * Apply gamma correction to an intensity value in [0..max].  Return the
2637d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * new intensity value.
2647d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org */
2657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgstatic GLint gamma_adjust( GLfloat gamma, GLint value, GLint max )
2667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org{
2677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   if (gamma == 1.0) {
2687d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      return value;
2697d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   }
2707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   else {
2717d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      double x = (double) value / (double) max;
2725e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      return IROUND_POS((GLfloat) max * pow(x, 1.0F/gamma));
2737d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   }
2747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
2757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
2767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
2777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
2785e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org/*
2797d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * Return the true number of bits per pixel for XImages.
2807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * For example, if we request a 24-bit deep visual we may actually need/get
2817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * 32bpp XImages.  This function returns the appropriate bpp.
2827d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * Input:  dpy - the X display
2837d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org *         visinfo - desribes the visual to be used for XImages
2847d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * Return:  true number of bits per pixel for XImages
2857d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org */
2867d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#define GET_BITS_PER_PIXEL(xmv) bits_per_pixel(xmv)
2877d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
2887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#ifdef XFree86Server
2897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
2907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgstatic int bits_per_pixel( XMesaVisual xmv )
2917d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org{
2927d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   XMesaVisualInfo visinfo = xmv->visinfo;
2937d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   const int depth = visinfo->nplanes;
2947d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   int i;
2957d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   for (i = 0; i < screenInfo.numPixmapFormats; i++) {
2967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      if (screenInfo.formats[i].depth == depth)
2977d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         return screenInfo.formats[i].bitsPerPixel;
2987d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   }
2997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   return depth;  /* should never get here, but this should be safe */
3007d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
3017d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
30231c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org#else
3037d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
3047d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgstatic int bits_per_pixel( XMesaVisual xmv )
3057d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org{
3067d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   XMesaDisplay *dpy = xmv->display;
3077d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   XMesaVisualInfo visinfo = xmv->visinfo;
3087d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   XMesaImage *img;
3097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   int bitsPerPixel;
3107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   /* Create a temporary XImage */
3117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   img = XCreateImage( dpy, visinfo->visual, visinfo->depth,
3127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org		       ZPixmap, 0,           /*format, offset*/
3137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org		       (char*) MALLOC(8),    /*data*/
3145e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org		       1, 1,                 /*width, height*/
3157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org		       32,                   /*bitmap_pad*/
3167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org		       0                     /*bytes_per_line*/
3177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                     );
3187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   assert(img);
3195e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org   /* grab the bits/pixel value */
3207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   bitsPerPixel = img->bits_per_pixel;
3217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   /* free the XImage */
3227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   FREE( img->data );
3237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   img->data = NULL;
3247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   XMesaDestroyImage( img );
3257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   return bitsPerPixel;
3267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
3277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#endif
3287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
32931c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org
3307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
3317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org/*
3327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * Determine if a given X window ID is valid (window exists).
3337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * Do this by calling XGetWindowAttributes() for the window and
3347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * checking if we catch an X error.
3357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * Input:  dpy - the display
3367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org *         win - the window to check for existance
3377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * Return:  GL_TRUE - window exists
3387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org *          GL_FALSE - window doesn't exist
3397d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org */
3407d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#ifndef XFree86Server
3417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgstatic GLboolean WindowExistsFlag;
3427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
3435e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.orgstatic int window_exists_err_handler( XMesaDisplay* dpy, XErrorEvent* xerr )
3447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org{
3457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   (void) dpy;
3467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   if (xerr->error_code == BadWindow) {
3477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      WindowExistsFlag = GL_FALSE;
3487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   }
3497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   return 0;
3505e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org}
3517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
3527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgstatic GLboolean window_exists( XMesaDisplay *dpy, Window win )
3537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org{
3547d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   XWindowAttributes wa;
3557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   int (*old_handler)( XMesaDisplay*, XErrorEvent* );
3567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   WindowExistsFlag = GL_TRUE;
3577d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   old_handler = XSetErrorHandler(window_exists_err_handler);
3587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   XGetWindowAttributes( dpy, win, &wa ); /* dummy request */
3597d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   XSetErrorHandler(old_handler);
3607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   return WindowExistsFlag;
3617d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
3627d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#endif
3637d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
36431c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org
3657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
3667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org/**********************************************************************/
3677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org/*****                Linked list of XMesaBuffers                 *****/
3687d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org/**********************************************************************/
3697d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
3707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgstatic XMesaBuffer XMesaBufferList = NULL;
3717d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
3727d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
3737d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org/* Allocate a new XMesaBuffer, add to linked list */
3747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgstatic XMesaBuffer alloc_xmesa_buffer(void)
3757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org{
3767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   XMesaBuffer b = (XMesaBuffer) CALLOC_STRUCT(xmesa_buffer);
3777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   if (b) {
3787d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      b->Next = XMesaBufferList;
3797d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      XMesaBufferList = b;
3807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   }
3817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   return b;
3827d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
3837d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
3845e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
3855e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org/*
3867d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * Find an XMesaBuffer by matching X display and colormap but NOT matching
3877d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * the notThis buffer.
3887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org */
3897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgstatic XMesaBuffer find_xmesa_buffer(XMesaDisplay *dpy,
3907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                                     XMesaColormap cmap,
39131c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org                                     XMesaBuffer notThis)
3927d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org{
3937d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   XMesaBuffer b;
3947d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   for (b=XMesaBufferList; b; b=b->Next) {
3957d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      if (b->display==dpy && b->cmap==cmap && b!=notThis) {
3967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         return b;
3977d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      }
3987d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   }
3997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   return NULL;
4007d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
4017d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
4027d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
4037d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org/*
4047d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * Free an XMesaBuffer, remove from linked list, perhaps free X colormap
4057d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * entries.
4067d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org */
4077d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgstatic void free_xmesa_buffer(int client, XMesaBuffer buffer)
4085e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org{
4097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   XMesaBuffer prev = NULL, b;
4105e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org   (void) client;
4117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   for (b=XMesaBufferList; b; b=b->Next) {
4127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      if (b==buffer) {
4137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         /* unlink bufer from list */
4147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         if (prev)
4157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org            prev->Next = buffer->Next;
4167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         else
41731c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org            XMesaBufferList = buffer->Next;
4187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         /* Check to free X colors */
4197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         if (buffer->num_alloced>0) {
4207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org            /* If no other buffer uses this X colormap then free the colors. */
4217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org            if (!find_xmesa_buffer(buffer->display, buffer->cmap, buffer)) {
4227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#ifdef XFree86Server
4237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org               (void)FreeColors(buffer->cmap, client,
4247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org				buffer->num_alloced, buffer->alloced_colors,
4257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org				0);
4267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#else
4277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org               XFreeColors(buffer->display, buffer->cmap,
4287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                           buffer->alloced_colors, buffer->num_alloced, 0);
4297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#endif
4307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org            }
4317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         }
4327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
4337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         _mesa_free_framebuffer_data(&buffer->mesa_buffer);
4347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         FREE(buffer);
4355e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
4365e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org         return;
4377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      }
4387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      /* continue search */
4397d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      prev = b;
4407d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   }
44131c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org   /* buffer not found in XMesaBufferList */
4427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   _mesa_problem(NULL,"free_xmesa_buffer() - buffer not found\n");
4437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
4447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
4457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
4467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org/* Copy X color table stuff from one XMesaBuffer to another. */
4477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgstatic void copy_colortable_info(XMesaBuffer dst, const XMesaBuffer src)
4487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org{
4497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   MEMCPY(dst->color_table, src->color_table, sizeof(src->color_table));
4507d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   MEMCPY(dst->pixel_to_r, src->pixel_to_r, sizeof(src->pixel_to_r));
4517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   MEMCPY(dst->pixel_to_g, src->pixel_to_g, sizeof(src->pixel_to_g));
4527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   MEMCPY(dst->pixel_to_b, src->pixel_to_b, sizeof(src->pixel_to_b));
4537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   dst->num_alloced = src->num_alloced;
4547d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   MEMCPY(dst->alloced_colors, src->alloced_colors,
4557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org          sizeof(src->alloced_colors));
4567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
4577d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
4587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
4595e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
4607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org/**********************************************************************/
4617d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org/*****                   Misc Private Functions                   *****/
4625e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org/**********************************************************************/
4637d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
4647d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
4657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org/*
4667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * Return number of bits set in n.
4677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org */
4687d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgstatic int bitcount( unsigned long n )
4697d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org{
4707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   int bits;
47131c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org   for (bits=0; n>0; n=n>>1) {
4727d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      if (n&1) {
4737d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         bits++;
4747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      }
4757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   }
4767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   return bits;
4777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
4787d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
4797d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
4807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
4817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org/*
4827d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * Allocate a shared memory XImage back buffer for the given XMesaBuffer.
4837d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * Return:  GL_TRUE if success, GL_FALSE if error
4847d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org */
4857d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#ifndef XFree86Server
4867d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgstatic GLboolean alloc_shm_back_buffer( XMesaBuffer b )
4877d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org{
4887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#ifdef USE_XSHM
4897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   /*
4907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    * We have to do a _lot_ of error checking here to be sure we can
4915e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    * really use the XSHM extension.  It seems different servers trigger
4925e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org    * errors at different points if the extension won't work.  Therefore
4937d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    * we have to be very careful...
4947d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    */
4957d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   GC gc;
4967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   int (*old_handler)( XMesaDisplay *, XErrorEvent * );
4977d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
4987d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   b->backimage = XShmCreateImage( b->xm_visual->display,
4997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                                   b->xm_visual->visinfo->visual,
5007d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                                   b->xm_visual->visinfo->depth,
50131c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org				   ZPixmap, NULL, &b->shminfo,
5027d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org				   b->width, b->height );
5037d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   if (b->backimage == NULL) {
5047d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      error("alloc_back_buffer: Shared memory error (XShmCreateImage), disabling.");
5057d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      b->shm = 0;
5067d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      return GL_FALSE;
5077d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   }
5087d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
5097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   b->shminfo.shmid = shmget( IPC_PRIVATE, b->backimage->bytes_per_line
5107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org			     * b->backimage->height, IPC_CREAT|0777 );
5117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   if (b->shminfo.shmid < 0) {
5127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      if (getenv("MESA_DEBUG"))
5137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org          perror("alloc_back_buffer");
5147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      XDestroyImage( b->backimage );
5157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      b->backimage = NULL;
5165e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      error("alloc_back_buffer: Shared memory error (shmget), disabling.");
5177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      b->shm = 0;
5185e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      return GL_FALSE;
5197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   }
5207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
5217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   b->shminfo.shmaddr = b->backimage->data
5227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                      = (char*)shmat( b->shminfo.shmid, 0, 0 );
5237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   if (b->shminfo.shmaddr == (char *) -1) {
5247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      if (getenv("MESA_DEBUG"))
5257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org          perror("alloc_back_buffer");
5267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      XDestroyImage( b->backimage );
5277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      shmctl( b->shminfo.shmid, IPC_RMID, 0 );
52831c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org      b->backimage = NULL;
5297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      error("alloc_back_buffer: Shared memory error (shmat), disabling.");
5307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      b->shm = 0;
5317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      return GL_FALSE;
5327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   }
5337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
5347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   b->shminfo.readOnly = False;
5357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   mesaXErrorFlag = 0;
5367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   old_handler = XSetErrorHandler( mesaHandleXError );
5377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   /* This may trigger the X protocol error we're ready to catch: */
5387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   XShmAttach( b->xm_visual->display, &b->shminfo );
5397d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   XSync( b->xm_visual->display, False );
5407d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
5417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   if (mesaXErrorFlag) {
5425e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      /* we are on a remote display, this error is normal, don't print it */
5435e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      XFlush( b->xm_visual->display );
5447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      mesaXErrorFlag = 0;
5457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      XDestroyImage( b->backimage );
5467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      shmdt( b->shminfo.shmaddr );
5477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      shmctl( b->shminfo.shmid, IPC_RMID, 0 );
5487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      b->backimage = NULL;
5497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      b->shm = 0;
5507d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      (void) XSetErrorHandler( old_handler );
5517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      return GL_FALSE;
5527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   }
5537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
5547d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   shmctl( b->shminfo.shmid, IPC_RMID, 0 ); /* nobody else needs it */
55531c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org
5567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   /* Finally, try an XShmPutImage to be really sure the extension works */
5577d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   gc = XCreateGC( b->xm_visual->display, b->frontbuffer, 0, NULL );
5587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   XShmPutImage( b->xm_visual->display, b->frontbuffer, gc,
5597d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org		 b->backimage, 0, 0, 0, 0, 1, 1 /*one pixel*/, False );
5607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   XSync( b->xm_visual->display, False );
5617d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   XFreeGC( b->xm_visual->display, gc );
5627d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   (void) XSetErrorHandler( old_handler );
5637d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   if (mesaXErrorFlag) {
5647d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      XFlush( b->xm_visual->display );
5657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      mesaXErrorFlag = 0;
5667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      XDestroyImage( b->backimage );
5677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      shmdt( b->shminfo.shmaddr );
5685e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      shmctl( b->shminfo.shmid, IPC_RMID, 0 );
5695e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org      b->backimage = NULL;
5707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      b->shm = 0;
5717d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      return GL_FALSE;
5727d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   }
5737d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
5747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   if (b->backimage) {
5757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      int height = b->backimage->height;
5767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      /* Needed by PIXELADDR1 macro */
5777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      b->ximage_width1 = b->backimage->bytes_per_line;
5787d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      b->ximage_origin1 = (GLubyte *) b->backimage->data
5797d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                        + b->ximage_width1 * (height-1);
5807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      /* Needed by PIXELADDR2 macro */
58131c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org      b->ximage_width2 = b->backimage->bytes_per_line / 2;
5827d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      b->ximage_origin2 = (GLushort *) b->backimage->data
5837d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                        + b->ximage_width2 * (height-1);
5847d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      /* Needed by PIXELADDR3 macro */
5857d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      b->ximage_width3 = b->backimage->bytes_per_line;
5867d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      b->ximage_origin3 = (GLubyte *) b->backimage->data
5877d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                        + b->ximage_width3 * (height-1);
5887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      /* Needed by PIXELADDR4 macro */
5897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      b->ximage_width4 = b->backimage->width;
5907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      b->ximage_origin4 = (GLuint *) b->backimage->data
5917d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                        + b->ximage_width4 * (height-1);
5927d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   }
5937d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
5947d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   return GL_TRUE;
5957d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#else
5967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   /* Can't compile XSHM support */
5977d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   return GL_FALSE;
5985e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org#endif
5997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
6007d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#endif
6015e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org
6027d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
6037d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
6047d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org/*
6057d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * Setup an off-screen pixmap or Ximage to use as the back buffer.
6067d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * Input:  b - the X/Mesa buffer
6077d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org */
6087d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgvoid xmesa_alloc_back_buffer( XMesaBuffer b )
6097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org{
6107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   if (b->db_state==BACK_XIMAGE) {
6117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      /* Deallocate the old backimage, if any */
61231c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org      if (b->backimage) {
6137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#if defined(USE_XSHM) && !defined(XFree86Server)
6147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org	 if (b->shm) {
6157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org	    XShmDetach( b->xm_visual->display, &b->shminfo );
6167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org	    XDestroyImage( b->backimage );
6177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org	    shmdt( b->shminfo.shmaddr );
6187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org	 }
6197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org	 else
6207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#endif
6217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org	   XMesaDestroyImage( b->backimage );
6227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org	 b->backimage = NULL;
6237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      }
6243e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org
6257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      /* Allocate new back buffer */
6267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#ifdef XFree86Server
62731c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org      {
6287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org	 /* Allocate a regular XImage for the back buffer. */
6297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org	 b->backimage = XMesaCreateImage(b->xm_visual->BitsPerPixel,
6307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org					 b->width, b->height, NULL);
6317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#else
6327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      if (b->shm==0
6337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org	  || alloc_shm_back_buffer(b)==GL_FALSE
6347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org	  ) {
6353e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org	 /* Allocate a regular XImage for the back buffer. */
6367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org	 b->backimage = XCreateImage( b->xm_visual->display,
6373e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org                                      b->xm_visual->visinfo->visual,
6387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                                      GET_VISUAL_DEPTH(b->xm_visual),
6397d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org				      ZPixmap, 0,   /* format, offset */
6407d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org				      NULL, b->width, b->height,
6417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org				      8, 0 );  /* pad, bytes_per_line */
64231c0e32e19ad3df48525fa9e7b2d1c0c07496d00machenbach@chromium.org#endif
6437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org	 if (!b->backimage) {
6447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org	    error("alloc_back_buffer: XCreateImage failed.");
6457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org	 }
6467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         b->backimage->data = (char *) MALLOC( b->backimage->height
6477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                                             * b->backimage->bytes_per_line );
6487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         if (!b->backimage->data) {
6497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org            error("alloc_back_buffer: MALLOC failed.");
6507d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org            XMesaDestroyImage( b->backimage );
6513e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org            b->backimage = NULL;
6527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         }
6533e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org      }
6543e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org      b->backpixmap = None;
6553e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org   }
6563e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org   else if (b->db_state==BACK_PIXMAP) {
6573e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org      XMesaPixmap old_pixmap = b->backpixmap;
6587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      /* Free the old back pixmap */
6597d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      if (b->backpixmap) {
6607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org	 XMesaFreePixmap( b->xm_visual->display, b->backpixmap );
6617d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      }
6627d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      /* Allocate new back pixmap */
6637d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      b->backpixmap = XMesaCreatePixmap( b->xm_visual->display, b->frontbuffer,
6647d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org					 b->width, b->height,
6657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org					 GET_VISUAL_DEPTH(b->xm_visual) );
6667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      b->backimage = NULL;
6677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      /* update other references to backpixmap */
6687d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      if (b->buffer==(XMesaDrawable)old_pixmap) {
669fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org	 b->buffer = (XMesaDrawable)b->backpixmap;
6707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      }
6717d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   }
6727d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
6737d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
6747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
6757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
6767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org/*
6777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * A replacement for XAllocColor.  This function should never
6787d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * fail to allocate a color.  When XAllocColor fails, we return
6792c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org * the nearest matching color.  If we have to allocate many colors
6807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * this function isn't too efficient; the XQueryColors() could be
6817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * done just once.
6827d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * Written by Michael Pichler, Brian Paul, Mark Kilgard
6831af4d9551ad496a28c342004b1a4e2a3840228f7machenbach@chromium.org * Input:  dpy - X display
6847d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org *         cmap - X colormap
6857d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org *         cmapSize - size of colormap
6867d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * In/Out: color - the XColor struct
6877d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * Output:  exact - 1=exact color match, 0=closest match
6887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org *          alloced - 1=XAlloc worked, 0=XAlloc failed
6897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org */
6907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgstatic void
6917d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgnoFaultXAllocColor( int client,
6927d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                    XMesaDisplay *dpy,
6933e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org                    XMesaColormap cmap,
6943e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org                    int cmapSize,
6953e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org                    XMesaColor *color,
6967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                    int *exact, int *alloced )
6977d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org{
6987d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#ifdef XFree86Server
6997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   Pixel *ppixIn;
7007d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   xrgb *ctable;
7017d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#else
7027d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   /* we'll try to cache ctable for better remote display performance */
7037d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   static Display *prevDisplay = NULL;
7047d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   static XMesaColormap prevCmap = 0;
7057d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   static int prevCmapSize = 0;
7067d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   static XMesaColor *ctable = NULL;
7077d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#endif
7087d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   XMesaColor subColor;
7097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   int i, bestmatch;
7107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   double mindist;       /* 3*2^16^2 exceeds long int precision. */
7117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
7127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   (void) client;
7137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
7147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   /* First try just using XAllocColor. */
7157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#ifdef XFree86Server
7167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   if (AllocColor(cmap,
7177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org		  &color->red, &color->green, &color->blue,
7187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org		  &color->pixel,
7193e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org		  client) == Success) {
7207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#else
7217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   if (XAllocColor(dpy, cmap, color)) {
7227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#endif
7233e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org      *exact = 1;
7247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      *alloced = 1;
7257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      return;
7267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   }
7277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
7287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   /* Alloc failed, search for closest match */
7297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
7307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   /* Retrieve color table entries. */
7317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   /* XXX alloca candidate. */
7327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#ifdef XFree86Server
7337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   ppixIn = (Pixel *) MALLOC(cmapSize * sizeof(Pixel));
7347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   ctable = (xrgb *) MALLOC(cmapSize * sizeof(xrgb));
7357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   for (i = 0; i < cmapSize; i++) {
7367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      ppixIn[i] = i;
7377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   }
7387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   QueryColors(cmap, cmapSize, ppixIn, ctable);
7397d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#else
7407d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   if (prevDisplay != dpy || prevCmap != cmap
7417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org       || prevCmapSize != cmapSize || !ctable) {
7427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      /* free previously cached color table */
7437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      if (ctable)
7447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         FREE(ctable);
7457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      /* Get the color table from X */
7467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      ctable = (XMesaColor *) MALLOC(cmapSize * sizeof(XMesaColor));
7477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      assert(ctable);
7487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      for (i = 0; i < cmapSize; i++) {
7497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         ctable[i].pixel = i;
7507d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      }
7517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      XQueryColors(dpy, cmap, ctable, cmapSize);
7527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      prevDisplay = dpy;
7537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      prevCmap = cmap;
7543e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org      prevCmapSize = cmapSize;
7557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   }
7567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#endif
7577d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
7587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   /* Find best match. */
7597d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   bestmatch = -1;
7607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   mindist = 0.0;
7617d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   for (i = 0; i < cmapSize; i++) {
7627d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      double dr = 0.30 * ((double) color->red - (double) ctable[i].red);
7637d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      double dg = 0.59 * ((double) color->green - (double) ctable[i].green);
7647d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      double db = 0.11 * ((double) color->blue - (double) ctable[i].blue);
7657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      double dist = dr * dr + dg * dg + db * db;
7667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      if (bestmatch < 0 || dist < mindist) {
7677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         bestmatch = i;
7687d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         mindist = dist;
7697d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      }
7707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   }
7717d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
7723e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org   /* Return result. */
7737d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   subColor.red   = ctable[bestmatch].red;
7747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   subColor.green = ctable[bestmatch].green;
7757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   subColor.blue  = ctable[bestmatch].blue;
7767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   /* Try to allocate the closest match color.  This should only
7777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    * fail if the cell is read/write.  Otherwise, we're incrementing
7787d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    * the cell's reference count.
7797d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    */
7807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#ifdef XFree86Server
7817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   if (AllocColor(cmap,
7827d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org		  &subColor.red, &subColor.green, &subColor.blue,
7837d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org		  &subColor.pixel,
7847d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org		  client) == Success) {
7857d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#else
7867d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   if (XAllocColor(dpy, cmap, &subColor)) {
7877d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#endif
7887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      *alloced = 1;
7897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   }
7907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   else {
7917d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      /* do this to work around a problem reported by Frank Ortega */
7927d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      subColor.pixel = (unsigned long) bestmatch;
7937d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      subColor.red   = ctable[bestmatch].red;
7947d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      subColor.green = ctable[bestmatch].green;
7957d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      subColor.blue  = ctable[bestmatch].blue;
7967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      subColor.flags = DoRed | DoGreen | DoBlue;
7977d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      *alloced = 0;
7987d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   }
7997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#ifdef XFree86Server
8007d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   FREE(ppixIn);
8017d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   FREE(ctable);
8027d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#else
8037d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   /* don't free table, save it for next time */
8047d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#endif
8057d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
8067d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   *color = subColor;
8077d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   *exact = 0;
8087d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
8097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
8107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
8117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
8127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
8137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org/*
814fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org * Do setup for PF_GRAYSCALE pixel format.
8157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * Note that buffer may be NULL.
8167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org */
8177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgstatic GLboolean setup_grayscale( int client, XMesaVisual v,
8187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                                  XMesaBuffer buffer, XMesaColormap cmap )
8197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org{
8207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   if (GET_VISUAL_DEPTH(v)<4 || GET_VISUAL_DEPTH(v)>16) {
8217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      return GL_FALSE;
8227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   }
8237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
8242c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org   if (buffer) {
8257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      XMesaBuffer prevBuffer;
8267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
8277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      if (!cmap) {
8281af4d9551ad496a28c342004b1a4e2a3840228f7machenbach@chromium.org         return GL_FALSE;
8297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      }
8307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
8317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      prevBuffer = find_xmesa_buffer(v->display, cmap, buffer);
8327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      if (prevBuffer &&
8337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org          (buffer->xm_visual->mesa_visual.rgbMode ==
8347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org           prevBuffer->xm_visual->mesa_visual.rgbMode)) {
8357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         /* Copy colormap stuff from previous XMesaBuffer which uses same
8367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org          * X colormap.  Do this to avoid time spent in noFaultXAllocColor.
8373e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org          */
8383e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org         copy_colortable_info(buffer, prevBuffer);
8393e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org      }
8407d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      else {
8417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         /* Allocate 256 shades of gray */
8427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         int gray;
8437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         int colorsfailed = 0;
8447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         for (gray=0;gray<256;gray++) {
8457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org            GLint r = gamma_adjust( v->RedGamma,   gray, 255 );
8467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org            GLint g = gamma_adjust( v->GreenGamma, gray, 255 );
84742ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org            GLint b = gamma_adjust( v->BlueGamma,  gray, 255 );
8487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org            int exact, alloced;
8497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org            XMesaColor xcol;
8507d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org            xcol.red   = (r << 8) | r;
8513e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org            xcol.green = (g << 8) | g;
8527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org            xcol.blue  = (b << 8) | b;
8537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org            noFaultXAllocColor( client, v->display,
8547d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                                cmap, GET_COLORMAP_SIZE(v),
8557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                                &xcol, &exact, &alloced );
8567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org            if (!exact) {
8577d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org               colorsfailed++;
8587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org            }
8597d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org            if (alloced) {
8607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org               assert(buffer->num_alloced<256);
8617d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org               buffer->alloced_colors[buffer->num_alloced] = xcol.pixel;
8627d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org               buffer->num_alloced++;
8637d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org            }
8647d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
8657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org            /*OLD
8667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org            assert(gray < 576);
8677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org            buffer->color_table[gray*3+0] = xcol.pixel;
8687d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org            buffer->color_table[gray*3+1] = xcol.pixel;
86942ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org            buffer->color_table[gray*3+2] = xcol.pixel;
8707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org            assert(xcol.pixel < 65536);
8717d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org            buffer->pixel_to_r[xcol.pixel] = gray * 30 / 100;
8727d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org            buffer->pixel_to_g[xcol.pixel] = gray * 59 / 100;
8733e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org            buffer->pixel_to_b[xcol.pixel] = gray * 11 / 100;
8747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org            */
8757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org            buffer->color_table[gray] = xcol.pixel;
8767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org            assert(xcol.pixel < 65536);
8777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org            buffer->pixel_to_r[xcol.pixel] = gray;
8787d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org            buffer->pixel_to_g[xcol.pixel] = gray;
8797d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org            buffer->pixel_to_b[xcol.pixel] = gray;
8807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         }
8817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
8827d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         if (colorsfailed && getenv("MESA_DEBUG")) {
8837d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org            fprintf( stderr,
8847d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                  "Note: %d out of 256 needed colors do not match exactly.\n",
8857d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                  colorsfailed );
8867d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         }
8877d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      }
8887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   }
8897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
8907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   v->dithered_pf = PF_GRAYSCALE;
8917d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   v->undithered_pf = PF_GRAYSCALE;
8927d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   return GL_TRUE;
8937d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
89442ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org
8957d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
8967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
8977d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org/*
8987d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * Setup RGB rendering for a window with a PseudoColor, StaticColor,
8997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * or 8-bit TrueColor visual visual.  We try to allocate a palette of 225
9007d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * colors (5 red, 9 green, 5 blue) and dither to approximate a 24-bit RGB
9017d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * color.  While this function was originally designed just for 8-bit
9027d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * visuals, it has also proven to work from 4-bit up to 16-bit visuals.
9037d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * Dithering code contributed by Bob Mercier.
9047d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org */
9057d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgstatic GLboolean setup_dithered_color( int client, XMesaVisual v,
9067d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                                       XMesaBuffer buffer, XMesaColormap cmap )
9077d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org{
9087d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   if (GET_VISUAL_DEPTH(v)<4 || GET_VISUAL_DEPTH(v)>16) {
9097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      return GL_FALSE;
9107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   }
9117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
9127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   if (buffer) {
9137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      XMesaBuffer prevBuffer;
9147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
9157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      if (!cmap) {
9167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         return GL_FALSE;
9177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      }
9187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
9197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      prevBuffer = find_xmesa_buffer(v->display, cmap, buffer);
9207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      if (prevBuffer &&
9217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org          (buffer->xm_visual->mesa_visual.rgbMode ==
9227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org           prevBuffer->xm_visual->mesa_visual.rgbMode)) {
9237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         /* Copy colormap stuff from previous, matching XMesaBuffer.
9247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org          * Do this to avoid time spent in noFaultXAllocColor.
9257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org          */
926fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org         copy_colortable_info(buffer, prevBuffer);
9277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      }
9287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      else {
9297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         /* Allocate X colors and initialize color_table[], red_table[], etc */
9307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         int r, g, b, i;
9317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         int colorsfailed = 0;
9327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         for (r = 0; r < _R; r++) {
9337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org            for (g = 0; g < _G; g++) {
9347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org               for (b = 0; b < _B; b++) {
9357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                  XMesaColor xcol;
9362c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org                  int exact, alloced;
9377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                  xcol.red  =gamma_adjust(v->RedGamma,   r*65535/(_R-1),65535);
9387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                  xcol.green=gamma_adjust(v->GreenGamma, g*65535/(_G-1),65535);
9397d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                  xcol.blue =gamma_adjust(v->BlueGamma,  b*65535/(_B-1),65535);
9401af4d9551ad496a28c342004b1a4e2a3840228f7machenbach@chromium.org                  noFaultXAllocColor( client, v->display,
9417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                                      cmap, GET_COLORMAP_SIZE(v),
9427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                                      &xcol, &exact, &alloced );
9437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                  if (!exact) {
9447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                     colorsfailed++;
9457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                  }
9467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                  if (alloced) {
9477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                     assert(buffer->num_alloced<256);
9487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                     buffer->alloced_colors[buffer->num_alloced] = xcol.pixel;
9497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                     buffer->num_alloced++;
9507d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                  }
9517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                  i = _MIX( r, g, b );
9527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                  assert(i < 576);
9537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                  buffer->color_table[i] = xcol.pixel;
9547d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                  assert(xcol.pixel < 65536);
9553e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org                  buffer->pixel_to_r[xcol.pixel] = r * 255 / (_R-1);
9563e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org                  buffer->pixel_to_g[xcol.pixel] = g * 255 / (_G-1);
9573e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org                  buffer->pixel_to_b[xcol.pixel] = b * 255 / (_B-1);
9587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org               }
9597d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org            }
9607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         }
9617d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
9627d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         if (colorsfailed && getenv("MESA_DEBUG")) {
9637d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org            fprintf( stderr,
9647d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                  "Note: %d out of %d needed colors do not match exactly.\n",
96542ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org                  colorsfailed, _R*_G*_B );
9667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         }
9677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      }
96842ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org   }
9697d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
9707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   v->dithered_pf = PF_DITHER;
9717d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   v->undithered_pf = PF_LOOKUP;
9723e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org   return GL_TRUE;
9737d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
9747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
97542ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org
9767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org/*
9777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * Setup for Hewlett Packard Color Recovery 8-bit TrueColor mode.
9787d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * HPCR simulates 24-bit color fidelity with an 8-bit frame buffer.
9797d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * Special dithering tables have to be initialized.
9807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org */
9817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgstatic void setup_8bit_hpcr( XMesaVisual v )
9827d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org{
9837d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   /* HP Color Recovery contributed by:  Alex De Bruyn (ad@lms.be)
9847d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    * To work properly, the atom _HP_RGB_SMOOTH_MAP_LIST must be defined
9857d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    * on the root window AND the colormap obtainable by XGetRGBColormaps
9867d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    * for that atom must be set on the window.  (see also tkInitWindow)
9877d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    * If that colormap is not set, the output will look stripy.
9887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    */
9897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
9907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   /* Setup color tables with gamma correction */
9917d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   int i;
9927d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   double g;
99342ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org
9947d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   g = 1.0 / v->RedGamma;
9957d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   for (i=0; i<256; i++) {
9967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      GLint red = IROUND_POS(255.0 * pow( hpcr_rgbTbl[0][i]/255.0, g ));
9973e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org      v->hpcr_rgbTbl[0][i] = CLAMP( red, 16, 239 );
9987d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   }
9997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
100042ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org   g = 1.0 / v->GreenGamma;
10017d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   for (i=0; i<256; i++) {
10027d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      GLint green = IROUND_POS(255.0 * pow( hpcr_rgbTbl[1][i]/255.0, g ));
10037d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      v->hpcr_rgbTbl[1][i] = CLAMP( green, 16, 239 );
10047d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   }
10057d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
10067d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   g = 1.0 / v->BlueGamma;
10077d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   for (i=0; i<256; i++) {
10087d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      GLint blue = IROUND_POS(255.0 * pow( hpcr_rgbTbl[2][i]/255.0, g ));
10097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      v->hpcr_rgbTbl[2][i] = CLAMP( blue, 32, 223 );
10107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   }
10117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   v->undithered_pf = PF_HPCR;  /* can't really disable dithering for now */
10127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   v->dithered_pf = PF_HPCR;
10137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
10147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   /* which method should I use to clear */
10157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   /* GL_FALSE: keep the ordinary method  */
10167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   /* GL_TRUE : clear with dither pattern */
10177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   v->hpcr_clear_flag = getenv("MESA_HPCR_CLEAR") ? GL_TRUE : GL_FALSE;
10187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
10197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   if (v->hpcr_clear_flag) {
10207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      v->hpcr_clear_pixmap = XMesaCreatePixmap(v->display,
10217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                                               DefaultRootWindow(v->display),
10227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                                               16, 2, 8);
10237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#ifndef XFree86Server
10247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      v->hpcr_clear_ximage = XGetImage(v->display, v->hpcr_clear_pixmap,
10257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                                       0, 0, 16, 2, AllPlanes, ZPixmap);
10267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#endif
10277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   }
102842ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org}
10297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
10307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
103142ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org/*
10327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * Setup RGB rendering for a window with a True/DirectColor visual.
10337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org */
10347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgstatic void setup_truecolor( XMesaVisual v, XMesaBuffer buffer,
10353e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org                             XMesaColormap cmap )
10367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org{
10377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   unsigned long rmask, gmask, bmask;
10387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   (void) buffer;
10397d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   (void) cmap;
10407d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
10417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   /* Compute red multiplier (mask) and bit shift */
10427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   v->rshift = 0;
10437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   rmask = GET_REDMASK(v);
10447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   while ((rmask & 1)==0) {
10457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      v->rshift++;
10467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      rmask = rmask >> 1;
10477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   }
10487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
10497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   /* Compute green multiplier (mask) and bit shift */
10507d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   v->gshift = 0;
10517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   gmask = GET_GREENMASK(v);
10527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   while ((gmask & 1)==0) {
10537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      v->gshift++;
10547d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      gmask = gmask >> 1;
10557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   }
10567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
10577d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   /* Compute blue multiplier (mask) and bit shift */
10587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   v->bshift = 0;
10597d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   bmask = GET_BLUEMASK(v);
10607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   while ((bmask & 1)==0) {
10617d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      v->bshift++;
10627d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      bmask = bmask >> 1;
10637d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   }
10647d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
10657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   /*
10667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    * Compute component-to-pixel lookup tables and dithering kernel
10677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    */
106842ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org   {
10697d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      static GLubyte kernel[16] = {
10707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org          0*16,  8*16,  2*16, 10*16,
10717d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         12*16,  4*16, 14*16,  6*16,
10727d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org          3*16, 11*16,  1*16,  9*16,
10737d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         15*16,  7*16, 13*16,  5*16,
10747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      };
10757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      GLint rBits = bitcount(rmask);
10767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      GLint gBits = bitcount(gmask);
10777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      GLint bBits = bitcount(bmask);
10787d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      GLint maxBits;
10797d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      GLuint i;
10807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
10817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      /* convert pixel components in [0,_mask] to RGB values in [0,255] */
10827d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      for (i=0; i<=rmask; i++)
10837d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         v->PixelToR[i] = (unsigned char) ((i * 255) / rmask);
10847d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      for (i=0; i<=gmask; i++)
10857d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         v->PixelToG[i] = (unsigned char) ((i * 255) / gmask);
10867d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      for (i=0; i<=bmask; i++)
10877d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         v->PixelToB[i] = (unsigned char) ((i * 255) / bmask);
10887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
108942ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org      /* convert RGB values from [0,255] to pixel components */
10907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
10917d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      for (i=0;i<256;i++) {
10927d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         GLint r = gamma_adjust(v->RedGamma,   i, 255);
10937d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         GLint g = gamma_adjust(v->GreenGamma, i, 255);
10947d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         GLint b = gamma_adjust(v->BlueGamma,  i, 255);
10957d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         v->RtoPixel[i] = (r >> (8-rBits)) << v->rshift;
10967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         v->GtoPixel[i] = (g >> (8-gBits)) << v->gshift;
10977d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         v->BtoPixel[i] = (b >> (8-bBits)) << v->bshift;
10987d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      }
10997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      /* overflow protection */
11007d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      for (i=256;i<512;i++) {
11017d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         v->RtoPixel[i] = v->RtoPixel[255];
11027d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         v->GtoPixel[i] = v->GtoPixel[255];
11037d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         v->BtoPixel[i] = v->BtoPixel[255];
11047d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      }
11057d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
11067d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      /* setup dithering kernel */
11077d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      maxBits = rBits;
11087d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      if (gBits > maxBits)  maxBits = gBits;
11097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      if (bBits > maxBits)  maxBits = bBits;
11107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      for (i=0;i<16;i++) {
11117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         v->Kernel[i] = kernel[i] >> maxBits;
11127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      }
11137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
11147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      v->undithered_pf = PF_TRUECOLOR;
11157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      v->dithered_pf = (GET_VISUAL_DEPTH(v)<24) ? PF_TRUEDITHER : PF_TRUECOLOR;
11167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   }
11177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
11187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   /*
11197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    * Now check for TrueColor visuals which we can optimize.
11207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    */
11217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   if (   GET_REDMASK(v)  ==0x0000ff
11227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org       && GET_GREENMASK(v)==0x00ff00
112342ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org       && GET_BLUEMASK(v) ==0xff0000
11247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org       && CHECK_BYTE_ORDER(v)
11257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org       && v->BitsPerPixel==32
11267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org       && sizeof(GLuint)==4
11277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org       && v->RedGamma==1.0 && v->GreenGamma==1.0 && v->BlueGamma==1.0) {
11287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      /* common 32 bpp config used on SGI, Sun */
11297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      v->undithered_pf = v->dithered_pf = PF_8A8B8G8R;
11307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   }
11317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   else if (GET_REDMASK(v)  ==0xff0000
11327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org       &&   GET_GREENMASK(v)==0x00ff00
11337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org       &&   GET_BLUEMASK(v) ==0x0000ff
11347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org       && CHECK_BYTE_ORDER(v)
11357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org       && v->BitsPerPixel==32
11367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org       && sizeof(GLuint)==4
11377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org       && v->RedGamma==1.0 && v->GreenGamma==1.0 && v->BlueGamma==1.0) {
11387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      /* common 32 bpp config used on Linux, HP, IBM */
11397d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      v->undithered_pf = v->dithered_pf = PF_8R8G8B;
11407d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   }
11417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   else if (GET_REDMASK(v)  ==0xff0000
11427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org       &&   GET_GREENMASK(v)==0x00ff00
11437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org       &&   GET_BLUEMASK(v) ==0x0000ff
11447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org       && CHECK_BYTE_ORDER(v)
11457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org       && v->BitsPerPixel==24
11467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org       && sizeof(GLuint)==4
11477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org       && v->RedGamma==1.0 && v->GreenGamma==1.0 && v->BlueGamma==1.0) {
11487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      /* common packed 24 bpp config used on Linux */
114942ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org      v->undithered_pf = v->dithered_pf = PF_8R8G8B24;
11507d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   }
11517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   else if (GET_REDMASK(v)  ==0xf800
11527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org       &&   GET_GREENMASK(v)==0x07e0
11537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org       &&   GET_BLUEMASK(v) ==0x001f
11547d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org       && CHECK_BYTE_ORDER(v)
11557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org       && v->BitsPerPixel==16
11567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org       && sizeof(GLushort)==2
11577d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org       && v->RedGamma==1.0 && v->GreenGamma==1.0 && v->BlueGamma==1.0) {
11587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      /* 5-6-5 color weight on common PC VGA boards */
11597d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      v->undithered_pf = PF_5R6G5B;
11607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      v->dithered_pf = PF_DITHER_5R6G5B;
11617d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   }
11627d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   else if (GET_REDMASK(v)  ==0xe0
11637d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org       &&   GET_GREENMASK(v)==0x1c
11647d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org       &&   GET_BLUEMASK(v) ==0x03
11657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org       && CHECK_FOR_HPCR(v)) {
11667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      setup_8bit_hpcr( v );
11677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   }
11687d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
11697d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
11707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
11717d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
11727d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org/*
1173fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org * Setup RGB rendering for a window with a monochrome visual.
11747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org */
11757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgstatic void setup_monochrome( XMesaVisual v, XMesaBuffer b )
11767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org{
11777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   (void) b;
11787d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   v->dithered_pf = v->undithered_pf = PF_1BIT;
11797d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   /* if black=1 then we must flip pixel values */
11807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   v->bitFlip = (GET_BLACK_PIXEL(v) != 0);
11817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
11827d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
11832c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org
11847d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
11857d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org/*
11867d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * When a context is "made current" for the first time, we can finally
11871af4d9551ad496a28c342004b1a4e2a3840228f7machenbach@chromium.org * finish initializing the context's visual and buffer information.
11887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * Input:  v - the XMesaVisual to initialize
11897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org *         b - the XMesaBuffer to initialize (may be NULL)
11907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org *         rgb_flag - TRUE = RGBA mode, FALSE = color index mode
11917d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org *         window - the window/pixmap we're rendering into
11927d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org *         cmap - the colormap associated with the window/pixmap
11937d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * Return:  GL_TRUE=success, GL_FALSE=failure
11947d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org */
11957d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgstatic GLboolean initialize_visual_and_buffer( int client,
11967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                                               XMesaVisual v,
11977d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                                               XMesaBuffer b,
11987d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                                               GLboolean rgb_flag,
11997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                                               XMesaDrawable window,
12007d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                                               XMesaColormap cmap
12017d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                                             )
12027d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org{
12037d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#ifndef XFree86Server
12043e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org   XGCValues gcvalues;
12053e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org#endif
12063e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org
12077d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   if (b) {
12087d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      assert(b->xm_visual == v);
12097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   }
12107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
12117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   /* Save true bits/pixel */
12127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   v->BitsPerPixel = GET_BITS_PER_PIXEL(v);
12137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   assert(v->BitsPerPixel > 0);
12147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
12157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
12167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   if (rgb_flag==GL_FALSE) {
121742ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org      /* COLOR-INDEXED WINDOW:
12187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org       * Even if the visual is TrueColor or DirectColor we treat it as
12197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org       * being color indexed.  This is weird but might be useful to someone.
12207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org       */
12213e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org      v->dithered_pf = v->undithered_pf = PF_INDEX;
12227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      v->index_bits = GET_VISUAL_DEPTH(v);
12237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   }
122442ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org   else {
12257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      /* RGB WINDOW:
12267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org       * We support RGB rendering into almost any kind of visual.
12277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org       */
12287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      int xclass;
12297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      xclass = GET_VISUAL_CLASS(v);
12307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      if (xclass==TrueColor || xclass==DirectColor) {
12317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org	 setup_truecolor( v, b, cmap );
12327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      }
12337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      else if (xclass==StaticGray && GET_VISUAL_DEPTH(v)==1) {
12347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org	 setup_monochrome( v, b );
12357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      }
12367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      else if (xclass==GrayScale || xclass==StaticGray) {
12377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         if (!setup_grayscale( client, v, b, cmap )) {
12387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org            return GL_FALSE;
12397d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         }
12407d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      }
12417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      else if ((xclass==PseudoColor || xclass==StaticColor)
124242ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org               && GET_VISUAL_DEPTH(v)>=4 && GET_VISUAL_DEPTH(v)<=16) {
12437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org	 if (!setup_dithered_color( client, v, b, cmap )) {
12447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org            return GL_FALSE;
12457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         }
12463e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org      }
12477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      else {
12487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org	 error("XMesa: RGB mode rendering not supported in given visual.");
124942ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org	 return GL_FALSE;
12507d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      }
12517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      v->index_bits = 0;
12527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
12537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      if (getenv("MESA_NO_DITHER")) {
12547d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org	 v->dithered_pf = v->undithered_pf;
12557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      }
12567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   }
12577d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
12587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
12597d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   /*
12607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    * If MESA_INFO env var is set print out some debugging info
12617d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    * which can help Brian figure out what's going on when a user
12627d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    * reports bugs.
12637d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    */
12647d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   if (getenv("MESA_INFO")) {
12657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      fprintf(stderr, "X/Mesa visual = %p\n", (void *) v);
12667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      fprintf(stderr, "X/Mesa dithered pf = %u\n", v->dithered_pf);
12677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      fprintf(stderr, "X/Mesa undithered pf = %u\n", v->undithered_pf);
12687d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      fprintf(stderr, "X/Mesa level = %d\n", v->level);
12697d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      fprintf(stderr, "X/Mesa depth = %d\n", GET_VISUAL_DEPTH(v));
12707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      fprintf(stderr, "X/Mesa bits per pixel = %d\n", v->BitsPerPixel);
12717d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   }
12727d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
12737d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   if (b && window) {
12747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      /* Do window-specific initializations */
12757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
12767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      /* Window dimensions */
12777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      unsigned int w, h;
12787d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      get_drawable_size( v->display, window, &w, &h );
12797d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      b->width = w;
12807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      b->height = h;
12817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
12827d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      b->frontbuffer = window;
12837d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
12847d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      /* Setup for single/double buffering */
12857d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      if (v->mesa_visual.doubleBufferMode) {
128642ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org         /* Double buffered */
12877d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#ifndef XFree86Server
12887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         b->shm = check_for_xshm( v->display );
12897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#endif
12907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         xmesa_alloc_back_buffer( b );
12917d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         if (b->db_state==BACK_PIXMAP) {
129242ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org            b->buffer = (XMesaDrawable)b->backpixmap;
12937d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         }
12947d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         else {
129542ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org            b->buffer = XIMAGE;
12967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         }
12977d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      }
12987d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      else {
12993e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org         /* Single Buffered */
13007d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         b->buffer = b->frontbuffer;
13017d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      }
130242ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org
13037d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      /* X11 graphics contexts */
13047d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#ifdef XFree86Server
13057d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      b->gc = CreateScratchGC(v->display, window->depth);
13067d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#else
13077d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      b->gc = XCreateGC( v->display, window, 0, NULL );
13087d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#endif
13097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      XMesaSetFunction( v->display, b->gc, GXcopy );
13107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
13117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      /* cleargc - for glClear() */
13127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#ifdef XFree86Server
13137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      b->cleargc = CreateScratchGC(v->display, window->depth);
13147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#else
13157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      b->cleargc = XCreateGC( v->display, window, 0, NULL );
13167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#endif
13177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      XMesaSetFunction( v->display, b->cleargc, GXcopy );
13187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
13197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      /*
13207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org       * Don't generate Graphics Expose/NoExpose events in swapbuffers().
13217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org       * Patch contributed by Michael Pichler May 15, 1995.
13227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org       */
13237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#ifdef XFree86Server
13247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      b->swapgc = CreateScratchGC(v->display, window->depth);
13257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      {
13267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org	  CARD32 v[1];
13277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org	  v[0] = FALSE;
13287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org	  dixChangeGC(NullClient, b->swapgc, GCGraphicsExposures, v, NULL);
13297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      }
13307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#else
13317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      gcvalues.graphics_exposures = False;
13327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      b->swapgc = XCreateGC( v->display, window,
13337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                              GCGraphicsExposures, &gcvalues);
13347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#endif
13357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      XMesaSetFunction( v->display, b->swapgc, GXcopy );
13367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      /*
13377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org       * Set fill style and tile pixmap once for all for HPCR stuff
13387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org       * (instead of doing it each time in clear_color_HPCR_pixmap())
13397d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org       * Initialize whole stuff
13407d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org       * Patch contributed by Jacques Leroy March 8, 1998.
13417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org       */
13427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      if (v->hpcr_clear_flag && b->buffer!=XIMAGE) {
13437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org	int i;
13447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org	for (i=0; i<16; i++)
13457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org        {
13467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org	   XMesaPutPixel(v->hpcr_clear_ximage, i, 0, 0);
13477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org	   XMesaPutPixel(v->hpcr_clear_ximage, i, 1, 0);
13487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org        }
13497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org        XMesaPutImage(b->display, (XMesaDrawable)v->hpcr_clear_pixmap,
13507d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org		      b->cleargc, v->hpcr_clear_ximage, 0, 0, 0, 0, 16, 2);
135142ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org	XMesaSetFillStyle( v->display, b->cleargc, FillTiled);
13527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org	XMesaSetTile( v->display, b->cleargc, v->hpcr_clear_pixmap );
13537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      }
135442ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org
13557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      /* Initialize the row buffer XImage for use in write_color_span() */
13567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#ifdef XFree86Server
13577d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      b->rowimage = XMesaCreateImage(GET_VISUAL_DEPTH(v), MAX_WIDTH, 1,
13587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org				     (char *)MALLOC(MAX_WIDTH*4));
13597d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#else
13607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      b->rowimage = XCreateImage( v->display,
136142ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org                                  v->visinfo->visual,
13627d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                                  v->visinfo->depth,
13637d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                                  ZPixmap, 0,           /*format, offset*/
13647d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                                  (char*) MALLOC(MAX_WIDTH*4),  /*data*/
13657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                                  MAX_WIDTH, 1,         /*width, height*/
13667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                                  32,                   /*bitmap_pad*/
13677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                                  0                     /*bytes_per_line*/ );
13687d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#endif
13697d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   }
13707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
13717d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   return GL_TRUE;
13727d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
13737d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
13747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
13757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
13767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org/*
13777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * Convert an RGBA color to a pixel value.
13787d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org */
13797d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgunsigned long
13807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgxmesa_color_to_pixel( XMesaContext xmesa, GLubyte r, GLubyte g, GLubyte b, GLubyte a,
13817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                      GLuint pixelFormat)
13827d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org{
13837d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   switch (pixelFormat) {
13847d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      case PF_INDEX:
13857d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         return 0;
13867d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      case PF_TRUECOLOR:
13877d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         {
13887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org            unsigned long p;
13897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org            PACK_TRUECOLOR( p, r, g, b );
13907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org            return p;
13917d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         }
13927d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      case PF_8A8B8G8R:
13937d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         return PACK_8A8B8G8R( r, g, b, a );
13947d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      case PF_8R8G8B:
13957d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         /* fall through */
13967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      case PF_8R8G8B24:
13977d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         return PACK_8R8G8B( r, g, b );
13987d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      case PF_5R6G5B:
13997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         return PACK_5R6G5B( r, g, b );
14007d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      case PF_DITHER:
14017d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         {
14027d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org            DITHER_SETUP;
14037d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org            return DITHER( 1, 0, r, g, b );
14047d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         }
14057d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      case PF_1BIT:
14067d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         /* 382 = (3*255)/2 */
14077d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         return ((r+g+b) > 382) ^ xmesa->xm_visual->bitFlip;
14087d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      case PF_HPCR:
14097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         return DITHER_HPCR(1, 1, r, g, b);
14107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      case PF_LOOKUP:
14117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         {
141242ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org            LOOKUP_SETUP;
14137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org            return LOOKUP( r, g, b );
14147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         }
14157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      case PF_GRAYSCALE:
14167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         return GRAY_RGB( r, g, b );
14177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      case PF_TRUEDITHER:
14187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         /* fall through */
14197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      case PF_DITHER_5R6G5B:
14207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         {
14217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org            unsigned long p;
14227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org            PACK_TRUEDITHER(p, 1, 0, r, g, b);
14237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org            return p;
14247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         }
14257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      default:
14267d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         _mesa_problem(NULL, "Bad pixel format in xmesa_color_to_pixel");
14277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   }
14287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   return 0;
14297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
14307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
14317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
14327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org/**********************************************************************/
14337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org/*****                       Public Functions                     *****/
14347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org/**********************************************************************/
14357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
14367d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
14377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org/*
14387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * Create a new X/Mesa visual.
14397d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * Input:  display - X11 display
14407d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org *         visinfo - an XVisualInfo pointer
14417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org *         rgb_flag - GL_TRUE = RGB mode,
14427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org *                    GL_FALSE = color index mode
14437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org *         alpha_flag - alpha buffer requested?
14447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org *         db_flag - GL_TRUE = double-buffered,
14457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org *                   GL_FALSE = single buffered
14467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org *         stereo_flag - stereo visual?
14477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org *         ximage_flag - GL_TRUE = use an XImage for back buffer,
14487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org *                       GL_FALSE = use an off-screen pixmap for back buffer
14497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org *         depth_size - requested bits/depth values, or zero
14507d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org *         stencil_size - requested bits/stencil values, or zero
14517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org *         accum_red_size - requested bits/red accum values, or zero
14527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org *         accum_green_size - requested bits/green accum values, or zero
14537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org *         accum_blue_size - requested bits/blue accum values, or zero
14547d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org *         accum_alpha_size - requested bits/alpha accum values, or zero
14557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org *         num_samples - number of samples/pixel if multisampling, or zero
14567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org *         level - visual level, usually 0
14577d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org *         visualCaveat - ala the GLX extension, usually GLX_NONE_EXT
14587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * Return;  a new XMesaVisual or 0 if error.
145942ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org */
14607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgXMesaVisual XMesaCreateVisual( XMesaDisplay *display,
14617d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                               XMesaVisualInfo visinfo,
14627d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                               GLboolean rgb_flag,
146342ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org                               GLboolean alpha_flag,
14647d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                               GLboolean db_flag,
14657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                               GLboolean stereo_flag,
14667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                               GLboolean ximage_flag,
14677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                               GLint depth_size,
14687d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                               GLint stencil_size,
14697d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                               GLint accum_red_size,
14707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                               GLint accum_green_size,
14717d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                               GLint accum_blue_size,
14727d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                               GLint accum_alpha_size,
14737d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                               GLint num_samples,
14747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                               GLint level,
14757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                               GLint visualCaveat )
14767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org{
14777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   char *gamma;
14787d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   XMesaVisual v;
14797d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   GLint red_bits, green_bits, blue_bits, alpha_bits;
14807d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
14817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   /* For debugging only */
14827d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   if (getenv("MESA_XSYNC")) {
14837d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      /* This makes debugging X easier.
14847d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org       * In your debugger, set a breakpoint on _XError to stop when an
14857d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org       * X protocol error is generated.
14867d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org       */
14877d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#ifdef XFree86Server
14887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      /* NOT_NEEDED */
14897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#else
14907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      XSynchronize( display, 1 );
14917d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#endif
14927d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   }
14937d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
14947d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   v = (XMesaVisual) CALLOC_STRUCT(xmesa_visual);
14957d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   if (!v) {
14967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      return NULL;
14977d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   }
14987d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
14997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   /*
15007d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    * In the X server, NULL is passed in for the display.  It will have
15017d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    * to be set before using this visual.  See XMesaSetVisualDisplay()
1502fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org    * below.
15037d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    */
15047d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   v->display = display;
15057d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
15067d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   /* Save a copy of the XVisualInfo struct because the user may XFREE()
15077d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    * the struct but we may need some of the information contained in it
15087d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    * at a later time.
15097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    */
15107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#ifdef XFree86Server
15117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   v->visinfo = visinfo;
15126313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org#else
15132c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org   v->visinfo = (XVisualInfo *) MALLOC(sizeof(*visinfo));
15147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   if(!v->visinfo) {
15157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      FREE(v);
15167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      return NULL;
15171af4d9551ad496a28c342004b1a4e2a3840228f7machenbach@chromium.org   }
15187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   MEMCPY(v->visinfo, visinfo, sizeof(*visinfo));
15197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
15207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   /* Save a copy of the pointer now so we can find this visual again
15217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    * if we need to search for it in find_glx_visual().
15227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    */
15237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   v->vishandle = visinfo;
15247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#endif
15257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
15263e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org#ifdef XFree86Server
15273e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org   /* Initialize the depth of the screen */
15283e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org   {
15297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org       PixmapFormatRec *format;
15307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
15317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org       for (format = screenInfo.formats;
15327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org	    format->depth != display->rootDepth;
15337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org	    format++)
15347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org	   ;
15357d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org       v->screen_depth = format->bitsPerPixel;
153642ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org   }
15377d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#endif
15387d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
15397d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   /* check for MESA_GAMMA environment variable */
15403e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org   gamma = getenv("MESA_GAMMA");
15417d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   if (gamma) {
15427d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      v->RedGamma = v->GreenGamma = v->BlueGamma = 0.0;
15437d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      sscanf( gamma, "%f %f %f", &v->RedGamma, &v->GreenGamma, &v->BlueGamma );
15447d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      if (v->RedGamma<=0.0)    v->RedGamma = 1.0;
15457d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      if (v->GreenGamma<=0.0)  v->GreenGamma = v->RedGamma;
15467d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      if (v->BlueGamma<=0.0)   v->BlueGamma = v->RedGamma;
15477d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   }
15487d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   else {
15497d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      v->RedGamma = v->GreenGamma = v->BlueGamma = 1.0;
155042ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org   }
15517d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
15527d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   v->ximage_flag = ximage_flag;
15537d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   v->level = level;
15543e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org   v->VisualCaveat = visualCaveat;
15557d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
15567d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   (void) initialize_visual_and_buffer( 0, v, NULL, rgb_flag, 0, 0 );
15577d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
15587d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   {
15597d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      int xclass;
15607d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      xclass = GET_VISUAL_CLASS(v);
15617d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      if (xclass==TrueColor || xclass==DirectColor) {
15627d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         red_bits   = bitcount(GET_REDMASK(v));
15637d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         green_bits = bitcount(GET_GREENMASK(v));
15647d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         blue_bits  = bitcount(GET_BLUEMASK(v));
15657d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         alpha_bits = 0;
15667d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      }
15677d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      else {
15687d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         /* this is an approximation */
15697d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         int depth;
15707d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         depth = GET_VISUAL_DEPTH(v);
15717d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         red_bits = depth / 3;
15727d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         depth -= red_bits;
15737d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         green_bits = depth / 2;
15747d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         depth -= green_bits;
15757d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         blue_bits = depth;
15767d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         alpha_bits = 0;
15777d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org         assert( red_bits + green_bits + blue_bits == GET_VISUAL_DEPTH(v) );
15787d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      }
15797d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   }
158042ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org
15817d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   if (alpha_flag && alpha_bits == 0)
15827d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      alpha_bits = 8;
15837d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
15847d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   _mesa_initialize_visual( &v->mesa_visual,
15857d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                            rgb_flag, db_flag, stereo_flag,
15867d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                            red_bits, green_bits,
15877d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                            blue_bits, alpha_bits,
15887d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                            v->index_bits,
15897d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                            depth_size,
15907d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                            stencil_size,
15917d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                            accum_red_size, accum_green_size,
15927d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                            accum_blue_size, accum_alpha_size,
15937d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org                            0 );
15947d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   return v;
15957d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
15967d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
15977d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
159842ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.orgvoid XMesaSetVisualDisplay( XMesaDisplay *dpy, XMesaVisual v )
15997d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org{
16007d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org    v->display = dpy;
16017d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
16023e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org
16037d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
16047d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgvoid XMesaDestroyVisual( XMesaVisual v )
16057d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org{
16067d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#ifndef XFree86Server
16077d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   FREE(v->visinfo);
16087d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org#endif
16097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   FREE(v);
16107d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org}
16117d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
16127d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
16137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
16147d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org/*
16157d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * Create a new XMesaContext.
16167d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * Input:  v - XMesaVisual
16177d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org *         share_list - another XMesaContext with which to share display
16187d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org *                      lists or NULL if no sharing is wanted.
16197d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org * Return:  an XMesaContext or NULL if error.
16207d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org */
16217d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.orgXMesaContext XMesaCreateContext( XMesaVisual v, XMesaContext share_list )
16227d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org{
16237d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   XMesaContext c;
16247d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   GLcontext *ctx;
16257d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   GLboolean direct = GL_TRUE; /* XXXX */
1626fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org   /* NOT_DONE: should this be GL_FALSE??? */
16277d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   static GLboolean firstTime = GL_TRUE;
16287d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
16297d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   if (firstTime) {
16307d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      _glthread_INIT_MUTEX(_xmesa_lock);
16317d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org      firstTime = GL_FALSE;
16327d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   }
16337d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org
16347d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org   c = (XMesaContext) CALLOC_STRUCT(xmesa_context);
1635fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org   if (!c) {
1636fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org      return NULL;
1637fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org   }
1638fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org
1639fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org   ctx = c->gl_ctx = _mesa_create_context( &v->mesa_visual,
1640fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org                      share_list ? share_list->gl_ctx : (GLcontext *) NULL,
1641fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org                      (void *) c, direct );
1642fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org   if (!c->gl_ctx) {
164342ed2fc449e83fab2ccbf1b769a5e83715c9d783machenbach@chromium.org      FREE(c);
1644fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org      return NULL;
1645fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org   }
1646fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org
1647fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org   _mesa_enable_sw_extensions(ctx);
1648fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org   _mesa_enable_1_3_extensions(ctx);
1649fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org
1650fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org   if (CHECK_BYTE_ORDER(v)) {
1651fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org      c->swapbytes = GL_FALSE;
1652fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org   }
1653fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org   else {
1654fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org      c->swapbytes = GL_TRUE;
1655fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org   }
1656fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org
1657fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org   c->xm_visual = v;
1658fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org   c->xm_buffer = NULL;   /* set later by XMesaMakeCurrent */
1659fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org   c->display = v->display;
1660fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org   c->pixelformat = v->dithered_pf;      /* Dithering is enabled by default */
1661fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org
1662fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org   ctx->Driver.UpdateState = xmesa_update_state;
1663fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org
1664fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org   /* Initialize the software rasterizer and helper modules.
1665fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org    */
1666fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org   _swrast_CreateContext( ctx );
1667fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org   _ac_CreateContext( ctx );
1668fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org   _tnl_CreateContext( ctx );
1669fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org   _swsetup_CreateContext( ctx );
1670fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org
16716313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org   xmesa_register_swrast_functions( ctx );
1672fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org
1673fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org   /* Set up some constant pointers:
1674fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org    */
1675fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org   xmesa_init_pointers( ctx );
1676fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org
1677fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org
1678fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org   /* Run the config file
1679fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org    */
1680fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org   _mesa_read_config_file( ctx );
1681fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org
1682fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org
1683fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org   return c;
1684fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org}
1685fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org
1686fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org
1687fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org
1688fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org
1689fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.orgvoid XMesaDestroyContext( XMesaContext c )
1690fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org{
1691fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org#ifdef FX
1692fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org   if (c->xm_buffer && c->xm_buffer->FXctx)
1693fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org      fxMesaDestroyContext(c->xm_buffer->FXctx);
16946313e220249748eb26e1ddcee2bbe857fef03b42machenbach@chromium.org#endif
1695fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org   if (c->gl_ctx) {
1696fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org      _swsetup_DestroyContext( c->gl_ctx );
1697fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org      _swrast_DestroyContext( c->gl_ctx );
1698fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org      _tnl_DestroyContext( c->gl_ctx );
1699fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org      _ac_DestroyContext( c->gl_ctx );
1700fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org      _mesa_destroy_context( c->gl_ctx );
1701fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org   }
1702fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org
1703fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org   FREE( c );
1704fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org}
1705fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org
1706fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org
1707fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org
1708fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org/*
1709fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org * XXX this isn't a public function!  It's a hack for the 3Dfx driver.
1710fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org * Create a new XMesaBuffer from an X window.
1711fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org * Input:  v - the XMesaVisual
1712fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org *         w - the window
17137d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org *         c - the context
1714 * Return:  new XMesaBuffer or NULL if error
1715 */
1716XMesaBuffer XMesaCreateWindowBuffer2( XMesaVisual v, XMesaWindow w,
1717                                      XMesaContext c )
1718{
1719#ifndef XFree86Server
1720   XWindowAttributes attr;
1721#endif
1722#ifdef FX
1723   char *fxEnvVar;
1724#endif
1725   int client = 0;
1726
1727   XMesaBuffer b = alloc_xmesa_buffer();
1728   if (!b) {
1729      return NULL;
1730   }
1731
1732   (void) c;
1733
1734#ifdef XFree86Server
1735   client = CLIENT_ID(((XMesaDrawable)w)->id);
1736#endif
1737
1738   assert(v);
1739
1740#ifdef XFree86Server
1741   if (GET_VISUAL_DEPTH(v) != ((XMesaDrawable)w)->depth) {
1742#else
1743   XGetWindowAttributes( v->display, w, &attr );
1744
1745   if (GET_VISUAL_DEPTH(v) != attr.depth) {
1746#endif
1747      if (getenv("MESA_DEBUG")) {
1748         fprintf(stderr, "XMesaCreateWindowBuffer: depth mismatch between visual and window!\n");
1749      }
1750      return NULL;
1751   }
1752
1753   b->xm_visual = v;
1754   b->pixmap_flag = GL_FALSE;
1755   b->display = v->display;
1756#ifdef XFree86Server
1757   b->cmap = (ColormapPtr)LookupIDByType(wColormap(w), RT_COLORMAP);
1758#else
1759   if (attr.colormap) {
1760      b->cmap = attr.colormap;
1761   }
1762   else {
1763      if (getenv("MESA_DEBUG")) {
1764         fprintf(stderr, "Window %u has no colormap!\n", (unsigned int) w);
1765      }
1766      /* this is weird, a window w/out a colormap!? */
1767      /* OK, let's just allocate a new one and hope for the best */
1768      b->cmap = XCreateColormap(v->display, w, attr.visual, AllocNone);
1769   }
1770#endif
1771
1772   /* determine back buffer implementation */
1773   if (v->mesa_visual.doubleBufferMode) {
1774      if (v->ximage_flag) {
1775	 b->db_state = BACK_XIMAGE;
1776      }
1777      else {
1778	 b->db_state = BACK_PIXMAP;
1779      }
1780   }
1781   else {
1782      b->db_state = 0;
1783   }
1784
1785   _mesa_initialize_framebuffer(&b->mesa_buffer,
1786                                &v->mesa_visual,
1787                                v->mesa_visual.depthBits > 0,
1788                                v->mesa_visual.stencilBits > 0,
1789                                v->mesa_visual.accumRedBits > 0,
1790                                v->mesa_visual.alphaBits > 0 );
1791
1792   if (!initialize_visual_and_buffer( client, v, b, v->mesa_visual.rgbMode,
1793                                      (XMesaDrawable)w, b->cmap )) {
1794      free_xmesa_buffer(client, b);
1795      return NULL;
1796   }
1797
1798#ifdef FX
1799   fxEnvVar = getenv("MESA_GLX_FX");
1800   if (fxEnvVar) {
1801     if (fxEnvVar[0]!='d') {
1802       int attribs[100];
1803       int numAttribs = 0;
1804       int hw;
1805       if (v->mesa_visual.depthBits > 0) {
1806	 attribs[numAttribs++] = FXMESA_DEPTH_SIZE;
1807	 attribs[numAttribs++] = 1;
1808       }
1809       if (v->mesa_visual.doubleBufferMode) {
1810	 attribs[numAttribs++] = FXMESA_DOUBLEBUFFER;
1811       }
1812       if (v->mesa_visual.accumRedBits > 0) {
1813	 attribs[numAttribs++] = FXMESA_ACCUM_SIZE;
1814	 attribs[numAttribs++] = v->mesa_visual.accumRedBits;
1815       }
1816       if (v->mesa_visual.stencilBits > 0) {
1817         attribs[numAttribs++] = FXMESA_STENCIL_SIZE;
1818         attribs[numAttribs++] = v->mesa_visual.stencilBits;
1819       }
1820       if (v->mesa_visual.alphaBits > 0) {
1821         attribs[numAttribs++] = FXMESA_ALPHA_SIZE;
1822         attribs[numAttribs++] = 1;
1823       }
1824       if (c->gl_ctx) {
1825#define FXMESA_SHARE_CONTEXT 990099  /* keep in sync with fxapi.c! */
1826         attribs[numAttribs++] = FXMESA_SHARE_CONTEXT;
1827         attribs[numAttribs++] = (int) c->gl_ctx;
1828       }
1829       attribs[numAttribs++] = FXMESA_NONE;
1830
1831       if ((hw = fxQueryHardware())==GR_SSTTYPE_VOODOO) {
1832         b->FXctx = fxMesaCreateBestContext(0, b->width, b->height, attribs);
1833         if ((v->undithered_pf!=PF_INDEX) && (b->backimage)) {
1834	   b->FXisHackUsable = b->FXctx ? GL_TRUE : GL_FALSE;
1835	   if (fxEnvVar[0]=='w' || fxEnvVar[0]=='W')
1836	     b->FXwindowHack = b->FXctx ? GL_TRUE : GL_FALSE;
1837	   else
1838	     b->FXwindowHack = GL_FALSE;
1839         }
1840       }
1841       else {
1842         if (fxEnvVar[0]=='w' || fxEnvVar[0]=='W')
1843	   b->FXctx = fxMesaCreateContext(w, GR_RESOLUTION_NONE,
1844					  GR_REFRESH_75Hz, attribs);
1845         else
1846	   b->FXctx = fxMesaCreateBestContext(0, b->width, b->height, attribs);
1847         b->FXisHackUsable = GL_FALSE;
1848         b->FXwindowHack = GL_FALSE;
1849       }
1850       /*
1851       fprintf(stderr,
1852               "voodoo %d, wid %d height %d hack: usable %d active %d\n",
1853               hw, b->width, b->height, b->FXisHackUsable, b->FXwindowHack);
1854       */
1855     }
1856   }
1857   else {
1858      fprintf(stderr,"WARNING: This Mesa Library includes the Glide driver but\n");
1859      fprintf(stderr,"         you have not defined the MESA_GLX_FX env. var.\n");
1860      fprintf(stderr,"         (check the README.3DFX file for more information).\n\n");
1861      fprintf(stderr,"         you can disable this message with a 'export MESA_GLX_FX=disable'.\n");
1862   }
1863#endif
1864
1865   return b;
1866}
1867
1868
1869XMesaBuffer XMesaCreateWindowBuffer( XMesaVisual v, XMesaWindow w )
1870{
1871   return XMesaCreateWindowBuffer2( v, w, NULL );
1872}
1873
1874
1875/*
1876 * Create a new XMesaBuffer from an X pixmap.
1877 * Input:  v - the XMesaVisual
1878 *         p - the pixmap
1879 *         cmap - the colormap, may be 0 if using a TrueColor or DirectColor
1880 *                visual for the pixmap
1881 * Return:  new XMesaBuffer or NULL if error
1882 */
1883XMesaBuffer XMesaCreatePixmapBuffer( XMesaVisual v,
1884				     XMesaPixmap p, XMesaColormap cmap )
1885{
1886   int client = 0;
1887   XMesaBuffer b = alloc_xmesa_buffer();
1888   if (!b) {
1889      return NULL;
1890   }
1891
1892
1893#ifdef XFree86Server
1894   client = CLIENT_ID(((XMesaDrawable)p)->id);
1895#endif
1896
1897   assert(v);
1898
1899   b->xm_visual = v;
1900   b->pixmap_flag = GL_TRUE;
1901   b->display = v->display;
1902   b->cmap = cmap;
1903
1904   /* determine back buffer implementation */
1905   if (v->mesa_visual.doubleBufferMode) {
1906      if (v->ximage_flag) {
1907	 b->db_state = BACK_XIMAGE;
1908      }
1909      else {
1910	 b->db_state = BACK_PIXMAP;
1911      }
1912   }
1913   else {
1914      b->db_state = 0;
1915   }
1916
1917   _mesa_initialize_framebuffer(&b->mesa_buffer,
1918                                &v->mesa_visual,
1919                                v->mesa_visual.depthBits > 0,
1920                                v->mesa_visual.stencilBits > 0,
1921                                v->mesa_visual.accumRedBits +
1922                                v->mesa_visual.accumGreenBits +
1923                                v->mesa_visual.accumBlueBits > 0,
1924                                v->mesa_visual.alphaBits > 0 );
1925
1926   if (!initialize_visual_and_buffer(client, v, b, v->mesa_visual.rgbMode,
1927				     (XMesaDrawable)p, cmap)) {
1928      free_xmesa_buffer(client, b);
1929      return NULL;
1930   }
1931
1932   return b;
1933}
1934
1935
1936
1937#if 0 /* not done */
1938XMesaBuffer XMesaCreatePBuffer( XMesaVisual v, XMesaColormap cmap,
1939                                unsigned int width, unsigned int height )
1940{
1941   int client = 0;
1942   XMesaBuffer b = alloc_xmesa_buffer();
1943   if (!b) {
1944      return NULL;
1945   }
1946
1947   b->xm_visual = v;
1948   b->pbuffer_flag = GL_TRUE;
1949   b->display = v->display;
1950   b->cmap = cmap;
1951
1952   /* determine back buffer implementation */
1953   if (v->mesa_visual.doubleBufferMode) {
1954      if (v->ximage_flag) {
1955	 b->db_state = BACK_XIMAGE;
1956      }
1957      else {
1958	 b->db_state = BACK_PIXMAP;
1959      }
1960   }
1961   else {
1962      b->db_state = 0;
1963   }
1964
1965   _mesa_initialize_framebuffer(&b->mesa_buffer,
1966                                &v->mesa_visual,
1967                                v->mesa_visual.depthBits > 0,
1968                                v->mesa_visual.stencilBits > 0,
1969                                v->mesa_visual.accumRedBits +
1970                                v->mesa_visual.accumGreenBits +
1971                                v->mesa_visual.accumBlueBits > 0,
1972                                v->mesa_visual.alphaBits > 0 );
1973
1974   if (!initialize_visual_and_buffer(client, v, b, v->mesa_visual.rgbMode,
1975				     0, cmap)) {
1976      free_xmesa_buffer(client, b);
1977      return NULL;
1978   }
1979
1980   return b;
1981}
1982#endif
1983
1984
1985
1986/*
1987 * Deallocate an XMesaBuffer structure and all related info.
1988 */
1989void XMesaDestroyBuffer( XMesaBuffer b )
1990{
1991   int client = 0;
1992
1993#ifdef XFree86Server
1994   if (b->frontbuffer)
1995       client = CLIENT_ID(b->frontbuffer->id);
1996#endif
1997
1998   if (b->gc)  XMesaFreeGC( b->xm_visual->display, b->gc );
1999   if (b->cleargc)  XMesaFreeGC( b->xm_visual->display, b->cleargc );
2000   if (b->swapgc)  XMesaFreeGC( b->xm_visual->display, b->swapgc );
2001
2002   if (b->backimage) {
2003#if defined(USE_XSHM) && !defined(XFree86Server)
2004       if (b->shm) {
2005	   XShmDetach( b->xm_visual->display, &b->shminfo );
2006	   XDestroyImage( b->backimage );
2007	   shmdt( b->shminfo.shmaddr );
2008       }
2009       else
2010#endif
2011	   XMesaDestroyImage( b->backimage );
2012   }
2013   if (b->backpixmap) {
2014      XMesaFreePixmap( b->xm_visual->display, b->backpixmap );
2015      if (b->xm_visual->hpcr_clear_flag) {
2016	XMesaFreePixmap( b->xm_visual->display,
2017			 b->xm_visual->hpcr_clear_pixmap );
2018	XMesaDestroyImage( b->xm_visual->hpcr_clear_ximage );
2019      }
2020   }
2021   if (b->rowimage) {
2022      FREE( b->rowimage->data );
2023      b->rowimage->data = NULL;
2024      XMesaDestroyImage( b->rowimage );
2025   }
2026
2027   free_xmesa_buffer(client, b);
2028}
2029
2030
2031
2032/*
2033 * Bind buffer b to context c and make c the current rendering context.
2034 */
2035GLboolean XMesaMakeCurrent( XMesaContext c, XMesaBuffer b )
2036{
2037   return XMesaMakeCurrent2( c, b, b );
2038}
2039
2040
2041/*
2042 * Bind buffer b to context c and make c the current rendering context.
2043 */
2044GLboolean XMesaMakeCurrent2( XMesaContext c, XMesaBuffer drawBuffer,
2045                             XMesaBuffer readBuffer )
2046{
2047   if (c) {
2048      if (!drawBuffer || !readBuffer)
2049         return GL_FALSE;  /* must specify buffers! */
2050
2051#ifdef FX
2052      if (drawBuffer->FXctx) {
2053         fxMesaMakeCurrent(drawBuffer->FXctx);
2054
2055         c->xm_buffer = drawBuffer;
2056         c->xm_read_buffer = readBuffer;
2057         c->use_read_buffer = (drawBuffer != readBuffer);
2058
2059         return GL_TRUE;
2060      }
2061#endif
2062      if (c->gl_ctx == _mesa_get_current_context()
2063          && c->xm_buffer == drawBuffer
2064          && c->xm_read_buffer == readBuffer
2065          && c->xm_buffer->wasCurrent) {
2066         /* same context and buffer, do nothing */
2067         return GL_TRUE;
2068      }
2069
2070      c->xm_buffer = drawBuffer;
2071      c->xm_read_buffer = readBuffer;
2072      c->use_read_buffer = (drawBuffer != readBuffer);
2073
2074      _mesa_make_current2(c->gl_ctx,
2075                          &drawBuffer->mesa_buffer,
2076                          &readBuffer->mesa_buffer);
2077
2078      if (c->gl_ctx->Viewport.Width == 0) {
2079	 /* initialize viewport to window size */
2080	 _mesa_Viewport( 0, 0, drawBuffer->width, drawBuffer->height );
2081	 c->gl_ctx->Scissor.Width = drawBuffer->width;
2082	 c->gl_ctx->Scissor.Height = drawBuffer->height;
2083      }
2084
2085      if (c->xm_visual->mesa_visual.rgbMode) {
2086         /*
2087          * Must recompute and set these pixel values because colormap
2088          * can be different for different windows.
2089          */
2090         c->clearpixel = xmesa_color_to_pixel( c,
2091                                               c->clearcolor[0],
2092                                               c->clearcolor[1],
2093                                               c->clearcolor[2],
2094                                               c->clearcolor[3],
2095                                               c->xm_visual->undithered_pf);
2096         XMesaSetForeground(c->display, c->xm_buffer->cleargc, c->clearpixel);
2097      }
2098
2099      /* Solution to Stephane Rehel's problem with glXReleaseBuffersMESA(): */
2100      c->xm_buffer->wasCurrent = GL_TRUE;
2101   }
2102   else {
2103      /* Detach */
2104      _mesa_make_current2( NULL, NULL, NULL );
2105   }
2106   return GL_TRUE;
2107}
2108
2109
2110/*
2111 * Unbind the context c from its buffer.
2112 */
2113GLboolean XMesaUnbindContext( XMesaContext c )
2114{
2115   /* A no-op for XFree86 integration purposes */
2116   return GL_TRUE;
2117}
2118
2119
2120XMesaContext XMesaGetCurrentContext( void )
2121{
2122   GET_CURRENT_CONTEXT(ctx);
2123   if (ctx) {
2124      XMesaContext xmesa = (XMesaContext) ctx->DriverCtx;
2125      return xmesa;
2126   }
2127   else {
2128      return 0;
2129   }
2130}
2131
2132
2133XMesaBuffer XMesaGetCurrentBuffer( void )
2134{
2135   GET_CURRENT_CONTEXT(ctx);
2136   if (ctx) {
2137      XMesaContext xmesa = (XMesaContext) ctx->DriverCtx;
2138      return xmesa->xm_buffer;
2139   }
2140   else {
2141      return 0;
2142   }
2143}
2144
2145
2146/* New in Mesa 3.1 */
2147XMesaBuffer XMesaGetCurrentReadBuffer( void )
2148{
2149   GET_CURRENT_CONTEXT(ctx);
2150   if (ctx) {
2151      XMesaContext xmesa = (XMesaContext) ctx->DriverCtx;
2152      return xmesa->xm_buffer;
2153   }
2154   else {
2155      return 0;
2156   }
2157}
2158
2159
2160GLboolean XMesaForceCurrent(XMesaContext c)
2161{
2162   if (c) {
2163      if (c->gl_ctx != _mesa_get_current_context()) {
2164	 _mesa_make_current(c->gl_ctx, &c->xm_buffer->mesa_buffer);
2165      }
2166   }
2167   else {
2168      _mesa_make_current(NULL, NULL);
2169   }
2170   return GL_TRUE;
2171}
2172
2173
2174GLboolean XMesaLoseCurrent(XMesaContext c)
2175{
2176   (void) c;
2177   _mesa_make_current(NULL, NULL);
2178   return GL_TRUE;
2179}
2180
2181
2182/*
2183 * Switch 3Dfx support hack between window and full-screen mode.
2184 */
2185GLboolean XMesaSetFXmode( GLint mode )
2186{
2187#ifdef FX
2188   const char *fx = getenv("MESA_GLX_FX");
2189   if (fx && fx[0] != 'd') {
2190      GET_CURRENT_CONTEXT(ctx);
2191      GrHwConfiguration hw;
2192      if (!FX_grSstQueryHardware(&hw)) {
2193         /*fprintf(stderr, "!grSstQueryHardware\n");*/
2194         return GL_FALSE;
2195      }
2196      if (hw.num_sst < 1) {
2197         /*fprintf(stderr, "hw.num_sst < 1\n");*/
2198         return GL_FALSE;
2199      }
2200      if (ctx) {
2201         XMesaContext xmesa = (XMesaContext) ctx->DriverCtx;
2202         if (mode == XMESA_FX_WINDOW) {
2203	    if (xmesa->xm_buffer->FXisHackUsable) {
2204	       FX_grSstControl(GR_CONTROL_DEACTIVATE);
2205	       xmesa->xm_buffer->FXwindowHack = GL_TRUE;
2206	       return GL_TRUE;
2207	    }
2208	 }
2209	 else if (mode == XMESA_FX_FULLSCREEN) {
2210	    FX_grSstControl(GR_CONTROL_ACTIVATE);
2211	    xmesa->xm_buffer->FXwindowHack = GL_FALSE;
2212	    return GL_TRUE;
2213	 }
2214	 else {
2215	    /* Error: Bad mode value */
2216	 }
2217      }
2218   }
2219   /*fprintf(stderr, "fallthrough\n");*/
2220#else
2221   (void) mode;
2222#endif
2223   return GL_FALSE;
2224}
2225
2226
2227
2228#ifdef FX
2229/*
2230 * Read image from VooDoo frame buffer into X/Mesa's back XImage.
2231 */
2232static void FXgetImage( XMesaBuffer b )
2233{
2234   GET_CURRENT_CONTEXT(ctx);
2235   static unsigned short pixbuf[MAX_WIDTH];
2236   GLuint x, y;
2237   int xpos, ypos;
2238   XMesaWindow root;
2239   unsigned int bw, depth, width, height;
2240   XMesaContext xmesa = (XMesaContext) ctx->DriverCtx;
2241
2242   assert(xmesa->xm_buffer->FXctx);
2243
2244#ifdef XFree86Server
2245   x = b->frontbuffer->x;
2246   y = b->frontbuffer->y;
2247   width = b->frontbuffer->width;
2248   height = b->frontbuffer->height;
2249   depth = b->frontbuffer->depth;
2250#else
2251   XGetGeometry( xmesa->xm_visual->display, b->frontbuffer,
2252                 &root, &xpos, &ypos, &width, &height, &bw, &depth);
2253#endif
2254   if (b->width != width || b->height != height) {
2255      b->width = MIN2((int)width, xmesa->xm_buffer->FXctx->width);
2256      b->height = MIN2((int)height, xmesa->xm_buffer->FXctx->height);
2257      if (b->width & 1)
2258         b->width--;  /* prevent odd width */
2259      xmesa_alloc_back_buffer( b );
2260   }
2261
2262   grLfbWriteColorFormat(GR_COLORFORMAT_ARGB);
2263   if (xmesa->xm_visual->undithered_pf==PF_5R6G5B) {
2264      /* Special case: 16bpp RGB */
2265      grLfbReadRegion( GR_BUFFER_FRONTBUFFER,       /* src buffer */
2266                       0, xmesa->xm_buffer->FXctx->height - b->height,  /*pos*/
2267                       b->width, b->height,         /* size */
2268                       b->width * sizeof(GLushort), /* stride */
2269                       b->backimage->data);         /* dest buffer */
2270   }
2271   else if (xmesa->xm_visual->dithered_pf==PF_DITHER
2272	    && GET_VISUAL_DEPTH(xmesa->xm_visual)==8) {
2273      /* Special case: 8bpp RGB */
2274      for (y=0;y<b->height;y++) {
2275         GLubyte *ptr = (GLubyte*) xmesa->xm_buffer->backimage->data
2276                        + xmesa->xm_buffer->backimage->bytes_per_line * y;
2277         XDITHER_SETUP(y);
2278
2279         /* read row from 3Dfx frame buffer */
2280         grLfbReadRegion( GR_BUFFER_FRONTBUFFER,
2281                          0, xmesa->xm_buffer->FXctx->height-(b->height-y),
2282                          b->width, 1,
2283                          0,
2284                          pixbuf );
2285
2286         /* write to XImage back buffer */
2287         for (x=0;x<b->width;x++) {
2288            GLubyte r = (pixbuf[x] & 0xf800) >> 8;
2289            GLubyte g = (pixbuf[x] & 0x07e0) >> 3;
2290            GLubyte b = (pixbuf[x] & 0x001f) << 3;
2291            *ptr++ = XDITHER( x, r, g, b);
2292         }
2293      }
2294   }
2295   else {
2296      /* General case: slow! */
2297      for (y=0;y<b->height;y++) {
2298         /* read row from 3Dfx frame buffer */
2299         grLfbReadRegion( GR_BUFFER_FRONTBUFFER,
2300                          0, xmesa->xm_buffer->FXctx->height-(b->height-y),
2301                          b->width, 1,
2302                          0,
2303                          pixbuf );
2304
2305         /* write to XImage back buffer */
2306         for (x=0;x<b->width;x++) {
2307            XMesaPutPixel(b->backimage,x,y,
2308			  xmesa_color_to_pixel(xmesa,
2309					       (pixbuf[x] & 0xf800) >> 8,
2310					       (pixbuf[x] & 0x07e0) >> 3,
2311					       (pixbuf[x] & 0x001f) << 3,
2312					       0xff, xmesa->pixelformat));
2313         }
2314      }
2315   }
2316   grLfbWriteColorFormat(GR_COLORFORMAT_ABGR);
2317}
2318#endif
2319
2320
2321/*
2322 * Copy the back buffer to the front buffer.  If there's no back buffer
2323 * this is a no-op.
2324 */
2325void XMesaSwapBuffers( XMesaBuffer b )
2326{
2327   GET_CURRENT_CONTEXT(ctx);
2328
2329   /* If we're swapping the buffer associated with the current context
2330    * we have to flush any pending rendering commands first.
2331    */
2332   if (ctx && ctx->DrawBuffer == &(b->mesa_buffer)) {
2333      _mesa_swapbuffers(ctx);
2334   }
2335
2336   if (b->db_state) {
2337#ifdef FX
2338      if (b->FXctx) {
2339         fxMesaSwapBuffers();
2340
2341         if (b->FXwindowHack)
2342            FXgetImage(b);
2343         else
2344            return;
2345      }
2346#endif
2347     if (b->backimage) {
2348	 /* Copy Ximage from host's memory to server's window */
2349#if defined(USE_XSHM) && !defined(XFree86Server)
2350	 if (b->shm) {
2351            /*_glthread_LOCK_MUTEX(_xmesa_lock);*/
2352	    XShmPutImage( b->xm_visual->display, b->frontbuffer,
2353			  b->swapgc,
2354			  b->backimage, 0, 0,
2355			  0, 0, b->width, b->height, False );
2356            /*_glthread_UNLOCK_MUTEX(_xmesa_lock);*/
2357	 }
2358	 else
2359#endif
2360         {
2361            /*_glthread_LOCK_MUTEX(_xmesa_lock);*/
2362            XMesaPutImage( b->xm_visual->display, b->frontbuffer,
2363			   b->swapgc,
2364			   b->backimage, 0, 0,
2365			   0, 0, b->width, b->height );
2366            /*_glthread_UNLOCK_MUTEX(_xmesa_lock);*/
2367         }
2368      }
2369      else {
2370	 /* Copy pixmap to window on server */
2371         /*_glthread_LOCK_MUTEX(_xmesa_lock);*/
2372	 XMesaCopyArea( b->xm_visual->display,
2373			b->backpixmap,   /* source drawable */
2374			b->frontbuffer,  /* dest. drawable */
2375			b->swapgc,
2376			0, 0, b->width, b->height,  /* source region */
2377			0, 0                 /* dest region */
2378		      );
2379         /*_glthread_UNLOCK_MUTEX(_xmesa_lock);*/
2380      }
2381   }
2382#if !defined(XFree86Server)
2383   XSync( b->xm_visual->display, False );
2384#endif
2385}
2386
2387
2388
2389/*
2390 * Copy sub-region of back buffer to front buffer
2391 */
2392void XMesaCopySubBuffer( XMesaBuffer b, int x, int y, int width, int height )
2393{
2394   GET_CURRENT_CONTEXT(ctx);
2395
2396   /* If we're swapping the buffer associated with the current context
2397    * we have to flush any pending rendering commands first.
2398    */
2399   if (ctx && ctx->DrawBuffer == &(b->mesa_buffer))
2400      _mesa_swapbuffers(ctx);
2401
2402   if (b->db_state) {
2403      int yTop = b->height - y - height;
2404#ifdef FX
2405      if (b->FXctx) {
2406         fxMesaSwapBuffers();
2407         if (b->FXwindowHack)
2408            FXgetImage(b);
2409         else
2410            return;
2411      }
2412#endif
2413      if (b->backimage) {
2414         /* Copy Ximage from host's memory to server's window */
2415#if defined(USE_XSHM) && !defined(XFree86Server)
2416         if (b->shm) {
2417            /* XXX assuming width and height aren't too large! */
2418            XShmPutImage( b->xm_visual->display, b->frontbuffer,
2419                          b->swapgc,
2420                          b->backimage, x, yTop,
2421                          x, yTop, width, height, False );
2422            /* wait for finished event??? */
2423         }
2424         else
2425#endif
2426         {
2427            /* XXX assuming width and height aren't too large! */
2428            XMesaPutImage( b->xm_visual->display, b->frontbuffer,
2429			   b->swapgc,
2430			   b->backimage, x, yTop,
2431			   x, yTop, width, height );
2432         }
2433      }
2434      else {
2435         /* Copy pixmap to window on server */
2436         XMesaCopyArea( b->xm_visual->display,
2437			b->backpixmap,           /* source drawable */
2438			b->frontbuffer,          /* dest. drawable */
2439			b->swapgc,
2440			x, yTop, width, height,  /* source region */
2441			x, yTop                  /* dest region */
2442                      );
2443      }
2444   }
2445}
2446
2447
2448/*
2449 * Return a pointer to the XMesa backbuffer Pixmap or XImage.  This function
2450 * is a way to get "under the hood" of X/Mesa so one can manipulate the
2451 * back buffer directly.
2452 * Output:  pixmap - pointer to back buffer's Pixmap, or 0
2453 *          ximage - pointer to back buffer's XImage, or NULL
2454 * Return:  GL_TRUE = context is double buffered
2455 *          GL_FALSE = context is single buffered
2456 */
2457GLboolean XMesaGetBackBuffer( XMesaBuffer b,
2458                              XMesaPixmap *pixmap,
2459                              XMesaImage **ximage )
2460{
2461   if (b->db_state) {
2462      if (pixmap)  *pixmap = b->backpixmap;
2463      if (ximage)  *ximage = b->backimage;
2464      return GL_TRUE;
2465   }
2466   else {
2467      *pixmap = 0;
2468      *ximage = NULL;
2469      return GL_FALSE;
2470   }
2471}
2472
2473
2474/*
2475 * Return the depth buffer associated with an XMesaBuffer.
2476 * Input:  b - the XMesa buffer handle
2477 * Output:  width, height - size of buffer in pixels
2478 *          bytesPerValue - bytes per depth value (2 or 4)
2479 *          buffer - pointer to depth buffer values
2480 * Return:  GL_TRUE or GL_FALSE to indicate success or failure.
2481 */
2482GLboolean XMesaGetDepthBuffer( XMesaBuffer b, GLint *width, GLint *height,
2483                               GLint *bytesPerValue, void **buffer )
2484{
2485   if (!b->mesa_buffer.DepthBuffer) {
2486      *width = 0;
2487      *height = 0;
2488      *bytesPerValue = 0;
2489      *buffer = 0;
2490      return GL_FALSE;
2491   }
2492   else {
2493      *width = b->mesa_buffer.Width;
2494      *height = b->mesa_buffer.Height;
2495      *bytesPerValue = sizeof(GLdepth);
2496      *buffer = b->mesa_buffer.DepthBuffer;
2497      return GL_TRUE;
2498   }
2499}
2500
2501
2502void XMesaFlush( XMesaContext c )
2503{
2504   if (c && c->xm_visual) {
2505#ifdef XFree86Server
2506      /* NOT_NEEDED */
2507#else
2508      XSync( c->xm_visual->display, False );
2509#endif
2510   }
2511}
2512
2513
2514
2515const char *XMesaGetString( XMesaContext c, int name )
2516{
2517   (void) c;
2518   if (name==XMESA_VERSION) {
2519      return "3.5";
2520   }
2521   else if (name==XMESA_EXTENSIONS) {
2522      return "";
2523   }
2524   else {
2525      return NULL;
2526   }
2527}
2528
2529
2530
2531XMesaBuffer XMesaFindBuffer( XMesaDisplay *dpy, XMesaDrawable d )
2532{
2533   XMesaBuffer b;
2534   for (b=XMesaBufferList; b; b=b->Next) {
2535      if (b->frontbuffer==d && b->display==dpy) {
2536         return b;
2537      }
2538   }
2539   return NULL;
2540}
2541
2542
2543
2544/*
2545 * Look for XMesaBuffers whose X window has been destroyed.
2546 * Deallocate any such XMesaBuffers.
2547 */
2548void XMesaGarbageCollect( void )
2549{
2550   XMesaBuffer b, next;
2551   for (b=XMesaBufferList; b; b=next) {
2552      next = b->Next;
2553      if (b->display && b->frontbuffer && !b->pixmap_flag) {
2554#ifdef XFree86Server
2555	 /* NOT_NEEDED */
2556#else
2557         XSync(b->display, False);
2558         if (!window_exists( b->display, b->frontbuffer )) {
2559            /* found a dead window, free the ancillary info */
2560            XMesaDestroyBuffer( b );
2561         }
2562#endif
2563      }
2564   }
2565}
2566
2567
2568void XMesaReset( void )
2569{
2570    while (XMesaBufferList)
2571	XMesaDestroyBuffer(XMesaBufferList);
2572
2573    XMesaBufferList = NULL;
2574}
2575
2576
2577unsigned long XMesaDitherColor( XMesaContext xmesa, GLint x, GLint y,
2578                                GLfloat red, GLfloat green,
2579                                GLfloat blue, GLfloat alpha )
2580{
2581   GLint r = (GLint) (red   * 255.0F);
2582   GLint g = (GLint) (green * 255.0F);
2583   GLint b = (GLint) (blue  * 255.0F);
2584   GLint a = (GLint) (alpha * 255.0F);
2585
2586   switch (xmesa->pixelformat) {
2587      case PF_INDEX:
2588         return 0;
2589      case PF_TRUECOLOR:
2590         {
2591            unsigned long p;
2592            PACK_TRUECOLOR( p, r, g, b );
2593            return p;
2594         }
2595      case PF_8A8B8G8R:
2596         return PACK_8A8B8G8R( r, g, b, a );
2597      case PF_8R8G8B:
2598         return PACK_8R8G8B( r, g, b );
2599      case PF_5R6G5B:
2600         return PACK_5R6G5B( r, g, b );
2601      case PF_DITHER:
2602         {
2603            DITHER_SETUP;
2604            return DITHER( x, y, r, g, b );
2605         }
2606      case PF_1BIT:
2607         /* 382 = (3*255)/2 */
2608         return ((r+g+b) > 382) ^ xmesa->xm_visual->bitFlip;
2609      case PF_HPCR:
2610         return DITHER_HPCR(x, y, r, g, b);
2611      case PF_LOOKUP:
2612         {
2613            LOOKUP_SETUP;
2614            return LOOKUP( r, g, b );
2615         }
2616      case PF_GRAYSCALE:
2617         return GRAY_RGB( r, g, b );
2618      case PF_DITHER_5R6G5B:
2619         /* fall through */
2620      case PF_TRUEDITHER:
2621         {
2622            unsigned long p;
2623            PACK_TRUEDITHER(p, x, y, r, g, b);
2624            return p;
2625         }
2626      default:
2627         _mesa_problem(NULL, "Bad pixel format in XMesaDitherColor");
2628   }
2629   return 0;
2630}
2631
2632
2633