xm_api.c revision d3fd7ba8af15bead2f770d68a893449adeb11397
1693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/* 2693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Mesa 3-D graphics library 3d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul * Version: 6.1 45e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * 5d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul * Copyright (C) 1999-2004 Brian Paul All Rights Reserved. 65e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * 7693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Permission is hereby granted, free of charge, to any person obtaining a 8693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * copy of this software and associated documentation files (the "Software"), 9693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * to deal in the Software without restriction, including without limitation 10693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * the rights to use, copy, modify, merge, publish, distribute, sublicense, 11693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * and/or sell copies of the Software, and to permit persons to whom the 12693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Software is furnished to do so, subject to the following conditions: 135e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * 14693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * The above copyright notice and this permission notice shall be included 15693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * in all copies or substantial portions of the Software. 165e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * 17693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 21693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 22693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 24693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 25693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/* 26693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * This file contains the implementations of all the XMesa* functions. 27693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * 28693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * 29693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * NOTES: 30693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * 31693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * The window coordinate system origin (0,0) is in the lower-left corner 32693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * of the window. X11's window coordinate origin is in the upper-left 33693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * corner of the window. Therefore, most drawing functions in this 34693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * file have to flip Y coordinates. 35693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * 36693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Define USE_XSHM in the Makefile with -DUSE_XSHM if you want to compile 37693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * in support for the MIT Shared Memory extension. If enabled, when you 38693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * use an Ximage for the back buffer in double buffered mode, the "swap" 39693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * operation will be faster. You must also link with -lXext. 40693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * 41693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Byte swapping: If the Mesa host and the X display use a different 42693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * byte order then there's some trickiness to be aware of when using 43693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * XImages. The byte ordering used for the XImage is that of the X 44693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * display, not the Mesa host. 45693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * The color-to-pixel encoding for True/DirectColor must be done 46693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * according to the display's visual red_mask, green_mask, and blue_mask. 47693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * If XPutPixel is used to put a pixel into an XImage then XPutPixel will 48693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * do byte swapping if needed. If one wants to directly "poke" the pixel 49693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * into the XImage's buffer then the pixel must be byte swapped first. In 50693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Mesa, when byte swapping is needed we use the PF_TRUECOLOR pixel format 51693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * and use XPutPixel everywhere except in the implementation of 52693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * glClear(GL_COLOR_BUFFER_BIT). We want this function to be fast so 53693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * instead of using XPutPixel we "poke" our values after byte-swapping 54693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * the clear pixel value if needed. 55693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * 56693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 57693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 58693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef __CYGWIN__ 59693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#undef WIN32 60693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#undef __WIN32__ 61693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif 62693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 63693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#include "glxheader.h" 64693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#include "GL/xmesa.h" 65693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#include "xmesaP.h" 66693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#include "context.h" 67693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#include "extensions.h" 68693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#include "glthread.h" 699a33a11d714c90162d32781ebbd2c1dfab52cfd1Brian Paul#include "imports.h" 70693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#include "matrix.h" 715e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen#include "mtypes.h" 72a4575499679d9d91055a35c7673b81872ec127cbJouk Jansen#include "macros.h" 73e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul#include "texformat.h" 741e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul#include "texobj.h" 75e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul#include "texstore.h" 76724abeb058ca9372c5a9b9e38ee43dde1accaa41Keith Whitwell#include "swrast/swrast.h" 77ec0585883a85a495d94e24970d64e5d6fc889147Keith Whitwell#include "swrast_setup/swrast_setup.h" 78cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell#include "array_cache/acache.h" 7923caf20169ac38436ee9c13914f1d6aa7cf6bb5eKeith Whitwell#include "tnl/tnl.h" 80d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul#include "tnl/t_context.h" 81d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul#include "tnl/t_pipeline.h" 82d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul#include "drivers/common/driverfuncs.h" 83d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul 84693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 85693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifndef GLX_NONE_EXT 86693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#define GLX_NONE_EXT 0x8000 87693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif 88693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 89693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 90693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/* 91693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Global X driver lock 92693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 93693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul_glthread_Mutex _xmesa_lock; 94693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 95693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 96693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 97693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/* 98693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Lookup tables for HPCR pixel format: 99693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 100693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic short hpcr_rgbTbl[3][256] = { 101693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 102693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 103693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 30, 30, 31, 31, 104693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 32, 32, 33, 33, 34, 34, 35, 35, 36, 36, 37, 37, 38, 38, 39, 39, 105693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 106693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 107693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 108693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 109693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 110693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 111693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 112693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 113693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 114693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 115693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 116693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 117693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239 118693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}, 119693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 120693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 121693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 30, 30, 31, 31, 122693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 32, 32, 33, 33, 34, 34, 35, 35, 36, 36, 37, 37, 38, 38, 39, 39, 123693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 124693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 125693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 126693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 127693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 128693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 129693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 130693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 131693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 132693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 133693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 134693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 135693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239 136693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}, 137693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 138693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 32, 32, 33, 33, 34, 34, 35, 35, 36, 36, 37, 37, 38, 38, 39, 39, 139693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 40, 40, 41, 41, 42, 42, 43, 43, 44, 44, 45, 45, 46, 46, 47, 47, 140693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 48, 48, 49, 49, 50, 50, 51, 51, 52, 52, 53, 53, 54, 54, 55, 55, 141693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 56, 56, 57, 57, 58, 58, 59, 59, 60, 60, 61, 61, 62, 62, 63, 63, 142693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 64, 64, 65, 65, 66, 66, 67, 67, 68, 68, 69, 69, 70, 70, 71, 71, 143693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 72, 72, 73, 73, 74, 74, 75, 75, 76, 76, 77, 77, 78, 78, 79, 79, 144693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 80, 80, 81, 81, 82, 82, 83, 83, 84, 84, 85, 85, 86, 86, 87, 87, 145693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 146693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 147693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 148693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 149693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 150693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 151693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 152693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 153693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223 1545e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen} 155693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul}; 156693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 157693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 158693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 159693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/**********************************************************************/ 160693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/***** X Utility Functions *****/ 161693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/**********************************************************************/ 162693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 163693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 164693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/* 165693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return the host's byte order as LSBFirst or MSBFirst ala X. 166693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 167693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifndef XFree86Server 168693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic int host_byte_order( void ) 169693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 170693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul int i = 1; 171693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul char *cptr = (char *) &i; 172693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return (*cptr==1) ? LSBFirst : MSBFirst; 173693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 174693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif 175693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 176693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 177693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/* 178693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Error handling. 179693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 180693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifndef XFree86Server 181b1ca87a565033a767042120288b2c45723cf79ccAlan Hourihanestatic volatile int mesaXErrorFlag = 0; 182693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 183693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic int mesaHandleXError( XMesaDisplay *dpy, XErrorEvent *event ) 184693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 185693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul (void) dpy; 186693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul (void) event; 187693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul mesaXErrorFlag = 1; 188693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return 0; 189693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 190693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif 191693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 192693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 193693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/* 194693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Check if the X Shared Memory extension is available. 195693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return: 0 = not available 196693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * 1 = shared XImage support available 197693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * 2 = shared Pixmap support available also 198693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 199693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifndef XFree86Server 200693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic int check_for_xshm( XMesaDisplay *display ) 201693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 202693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef USE_XSHM 203693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul int major, minor, ignore; 204693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul Bool pixmaps; 205693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 206693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (XQueryExtension( display, "MIT-SHM", &ignore, &ignore, &ignore )) { 207693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (XShmQueryVersion( display, &major, &minor, &pixmaps )==True) { 208693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return (pixmaps==True) ? 2 : 1; 209693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 210693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul else { 211693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return 0; 212693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 213693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 214693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul else { 215693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return 0; 216693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 217693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else 218693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* Can't compile XSHM support */ 219693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return 0; 220693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif 221693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 222693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif 223693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 224693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 225693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/* 226693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return the width and height of the given drawable. 227693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 228693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic void get_drawable_size( XMesaDisplay *dpy, XMesaDrawable d, 229693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul unsigned int *width, unsigned int *height) 230693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 231693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server 232693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul (void) dpy; 233693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *width = d->width; 234693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *height = d->height; 235693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else 236693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul Window root; 237693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul int x, y; 238693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul unsigned int bw, depth; 239693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 240693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul _glthread_LOCK_MUTEX(_xmesa_lock); 241693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XGetGeometry( dpy, d, &root, &x, &y, width, height, &bw, &depth ); 242693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul _glthread_UNLOCK_MUTEX(_xmesa_lock); 243693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif 244693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 245693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 246693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 247693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/* 248693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Apply gamma correction to an intensity value in [0..max]. Return the 249693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * new intensity value. 250693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 251693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic GLint gamma_adjust( GLfloat gamma, GLint value, GLint max ) 252693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 253693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (gamma == 1.0) { 254693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return value; 255693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 256693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul else { 257693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul double x = (double) value / (double) max; 258367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul return IROUND_POS((GLfloat) max * _mesa_pow(x, 1.0F/gamma)); 259693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 260693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 261693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 262693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 263693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 264693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/* 265693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return the true number of bits per pixel for XImages. 266693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * For example, if we request a 24-bit deep visual we may actually need/get 267693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * 32bpp XImages. This function returns the appropriate bpp. 268693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Input: dpy - the X display 269693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * visinfo - desribes the visual to be used for XImages 270693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return: true number of bits per pixel for XImages 271693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 272693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server 273693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 274693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic int bits_per_pixel( XMesaVisual xmv ) 275693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 276693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaVisualInfo visinfo = xmv->visinfo; 277693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul const int depth = visinfo->nplanes; 278693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul int i; 279693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul for (i = 0; i < screenInfo.numPixmapFormats; i++) { 280693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (screenInfo.formats[i].depth == depth) 281693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return screenInfo.formats[i].bitsPerPixel; 282693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 283693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return depth; /* should never get here, but this should be safe */ 284693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 285693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 286693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else 287693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 288693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic int bits_per_pixel( XMesaVisual xmv ) 289693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 290693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaDisplay *dpy = xmv->display; 291693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaVisualInfo visinfo = xmv->visinfo; 292693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaImage *img; 293693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul int bitsPerPixel; 294693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* Create a temporary XImage */ 295693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul img = XCreateImage( dpy, visinfo->visual, visinfo->depth, 296693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul ZPixmap, 0, /*format, offset*/ 297693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul (char*) MALLOC(8), /*data*/ 298693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1, 1, /*width, height*/ 299693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 32, /*bitmap_pad*/ 300693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 0 /*bytes_per_line*/ 301693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul ); 302693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul assert(img); 303693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* grab the bits/pixel value */ 304693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul bitsPerPixel = img->bits_per_pixel; 305693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* free the XImage */ 306693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul FREE( img->data ); 307693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul img->data = NULL; 308693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaDestroyImage( img ); 309693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return bitsPerPixel; 310693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 311693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif 312693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 313693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 314693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 315693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/* 316693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Determine if a given X window ID is valid (window exists). 317693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Do this by calling XGetWindowAttributes() for the window and 318693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * checking if we catch an X error. 319693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Input: dpy - the display 320693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * win - the window to check for existance 321693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return: GL_TRUE - window exists 322693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * GL_FALSE - window doesn't exist 323693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 324693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifndef XFree86Server 325693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic GLboolean WindowExistsFlag; 326693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 327693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic int window_exists_err_handler( XMesaDisplay* dpy, XErrorEvent* xerr ) 328693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 329693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul (void) dpy; 330693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (xerr->error_code == BadWindow) { 331693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul WindowExistsFlag = GL_FALSE; 332693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 333693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return 0; 334693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 335693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 336693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic GLboolean window_exists( XMesaDisplay *dpy, Window win ) 337693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 338693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XWindowAttributes wa; 339693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul int (*old_handler)( XMesaDisplay*, XErrorEvent* ); 340693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul WindowExistsFlag = GL_TRUE; 341693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul old_handler = XSetErrorHandler(window_exists_err_handler); 342693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XGetWindowAttributes( dpy, win, &wa ); /* dummy request */ 343693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XSetErrorHandler(old_handler); 344693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return WindowExistsFlag; 345693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 346693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif 347693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 348693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 349693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 350693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/**********************************************************************/ 351693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/***** Linked list of XMesaBuffers *****/ 352693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/**********************************************************************/ 353693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 354693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic XMesaBuffer XMesaBufferList = NULL; 355693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 356693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 357693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/* Allocate a new XMesaBuffer, add to linked list */ 358693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic XMesaBuffer alloc_xmesa_buffer(void) 359693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 360693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaBuffer b = (XMesaBuffer) CALLOC_STRUCT(xmesa_buffer); 361693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (b) { 362693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->Next = XMesaBufferList; 363693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaBufferList = b; 364693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 365693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return b; 366693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 367693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 368693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 369693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/* 370693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Find an XMesaBuffer by matching X display and colormap but NOT matching 371693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * the notThis buffer. 372693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 373693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic XMesaBuffer find_xmesa_buffer(XMesaDisplay *dpy, 374693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaColormap cmap, 375693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaBuffer notThis) 376693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 377693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaBuffer b; 378693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul for (b=XMesaBufferList; b; b=b->Next) { 379693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (b->display==dpy && b->cmap==cmap && b!=notThis) { 380693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return b; 381693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 382693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 383693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return NULL; 384693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 385693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 386693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 387693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/* 388693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Free an XMesaBuffer, remove from linked list, perhaps free X colormap 389693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * entries. 390693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 391693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic void free_xmesa_buffer(int client, XMesaBuffer buffer) 392693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 393693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaBuffer prev = NULL, b; 394693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul (void) client; 395693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul for (b=XMesaBufferList; b; b=b->Next) { 396693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (b==buffer) { 397693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* unlink bufer from list */ 398693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (prev) 399693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul prev->Next = buffer->Next; 400693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul else 401693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaBufferList = buffer->Next; 402693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* Check to free X colors */ 403693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (buffer->num_alloced>0) { 404693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* If no other buffer uses this X colormap then free the colors. */ 405693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (!find_xmesa_buffer(buffer->display, buffer->cmap, buffer)) { 406693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server 407693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul (void)FreeColors(buffer->cmap, client, 408693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul buffer->num_alloced, buffer->alloced_colors, 409693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 0); 410693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else 411693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XFreeColors(buffer->display, buffer->cmap, 412693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul buffer->alloced_colors, buffer->num_alloced, 0); 413693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif 414693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 415693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 4161832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul 4171832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul _mesa_free_framebuffer_data(&buffer->mesa_buffer); 418693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul FREE(buffer); 4191832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul 420693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return; 421693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 422693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* continue search */ 423693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul prev = b; 424693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 425693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* buffer not found in XMesaBufferList */ 42608836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(NULL,"free_xmesa_buffer() - buffer not found\n"); 427693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 428693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 429693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 430693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/* Copy X color table stuff from one XMesaBuffer to another. */ 431693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic void copy_colortable_info(XMesaBuffer dst, const XMesaBuffer src) 432693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 433693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul MEMCPY(dst->color_table, src->color_table, sizeof(src->color_table)); 434693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul MEMCPY(dst->pixel_to_r, src->pixel_to_r, sizeof(src->pixel_to_r)); 435693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul MEMCPY(dst->pixel_to_g, src->pixel_to_g, sizeof(src->pixel_to_g)); 436693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul MEMCPY(dst->pixel_to_b, src->pixel_to_b, sizeof(src->pixel_to_b)); 437693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul dst->num_alloced = src->num_alloced; 438693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul MEMCPY(dst->alloced_colors, src->alloced_colors, 439693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul sizeof(src->alloced_colors)); 440693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 441693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 442693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 443693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 444693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/**********************************************************************/ 445693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/***** Misc Private Functions *****/ 446693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/**********************************************************************/ 447693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 448693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 449693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/* 450693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return number of bits set in n. 451693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 452693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic int bitcount( unsigned long n ) 453693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 454693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul int bits; 455693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul for (bits=0; n>0; n=n>>1) { 456693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (n&1) { 457693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul bits++; 458693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 459693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 460693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return bits; 461693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 462693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 463693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 464693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 465693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/* 466693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Allocate a shared memory XImage back buffer for the given XMesaBuffer. 467693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return: GL_TRUE if success, GL_FALSE if error 468693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 469693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifndef XFree86Server 470693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic GLboolean alloc_shm_back_buffer( XMesaBuffer b ) 471693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 472693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef USE_XSHM 473693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* 474693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * We have to do a _lot_ of error checking here to be sure we can 475693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * really use the XSHM extension. It seems different servers trigger 476693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * errors at different points if the extension won't work. Therefore 477693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * we have to be very careful... 478693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 479693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GC gc; 480693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul int (*old_handler)( XMesaDisplay *, XErrorEvent * ); 481693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 482693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->backimage = XShmCreateImage( b->xm_visual->display, 483693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->xm_visual->visinfo->visual, 484693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->xm_visual->visinfo->depth, 485693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul ZPixmap, NULL, &b->shminfo, 486693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->width, b->height ); 487693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (b->backimage == NULL) { 4882ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul _mesa_warning(NULL, "alloc_back_buffer: Shared memory error (XShmCreateImage), disabling."); 489693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->shm = 0; 490693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return GL_FALSE; 491693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 492693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 493693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->shminfo.shmid = shmget( IPC_PRIVATE, b->backimage->bytes_per_line 494693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * b->backimage->height, IPC_CREAT|0777 ); 495693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (b->shminfo.shmid < 0) { 4962ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul _mesa_warning(NULL, "shmget failed while allocating back buffer"); 497693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XDestroyImage( b->backimage ); 498693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->backimage = NULL; 4992ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul _mesa_warning(NULL, "alloc_back_buffer: Shared memory error (shmget), disabling."); 500693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->shm = 0; 501693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return GL_FALSE; 502693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 503693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 504693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->shminfo.shmaddr = b->backimage->data 505693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul = (char*)shmat( b->shminfo.shmid, 0, 0 ); 506693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (b->shminfo.shmaddr == (char *) -1) { 5072ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul _mesa_warning(NULL, "shmat() failed while allocating back buffer"); 508693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XDestroyImage( b->backimage ); 509693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul shmctl( b->shminfo.shmid, IPC_RMID, 0 ); 510693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->backimage = NULL; 5112ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul _mesa_warning(NULL, "alloc_back_buffer: Shared memory error (shmat), disabling."); 512693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->shm = 0; 513693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return GL_FALSE; 514693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 515693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 516693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->shminfo.readOnly = False; 517693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul mesaXErrorFlag = 0; 518693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul old_handler = XSetErrorHandler( mesaHandleXError ); 519693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* This may trigger the X protocol error we're ready to catch: */ 520693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XShmAttach( b->xm_visual->display, &b->shminfo ); 521693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XSync( b->xm_visual->display, False ); 522693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 523693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (mesaXErrorFlag) { 524693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* we are on a remote display, this error is normal, don't print it */ 525693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XFlush( b->xm_visual->display ); 526693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul mesaXErrorFlag = 0; 527693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XDestroyImage( b->backimage ); 528693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul shmdt( b->shminfo.shmaddr ); 529693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul shmctl( b->shminfo.shmid, IPC_RMID, 0 ); 530693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->backimage = NULL; 531693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->shm = 0; 532693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul (void) XSetErrorHandler( old_handler ); 533693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return GL_FALSE; 534693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 535693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 536693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul shmctl( b->shminfo.shmid, IPC_RMID, 0 ); /* nobody else needs it */ 537693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 538693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* Finally, try an XShmPutImage to be really sure the extension works */ 539693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul gc = XCreateGC( b->xm_visual->display, b->frontbuffer, 0, NULL ); 540693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XShmPutImage( b->xm_visual->display, b->frontbuffer, gc, 541693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->backimage, 0, 0, 0, 0, 1, 1 /*one pixel*/, False ); 542693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XSync( b->xm_visual->display, False ); 543693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XFreeGC( b->xm_visual->display, gc ); 544693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul (void) XSetErrorHandler( old_handler ); 545693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (mesaXErrorFlag) { 546693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XFlush( b->xm_visual->display ); 547693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul mesaXErrorFlag = 0; 548693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XDestroyImage( b->backimage ); 549693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul shmdt( b->shminfo.shmaddr ); 550693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul shmctl( b->shminfo.shmid, IPC_RMID, 0 ); 551693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->backimage = NULL; 552693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->shm = 0; 553693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return GL_FALSE; 554693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 555693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 556693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (b->backimage) { 557693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul int height = b->backimage->height; 558693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* Needed by PIXELADDR1 macro */ 559693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->ximage_width1 = b->backimage->bytes_per_line; 560693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->ximage_origin1 = (GLubyte *) b->backimage->data 561693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul + b->ximage_width1 * (height-1); 562693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* Needed by PIXELADDR2 macro */ 563693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->ximage_width2 = b->backimage->bytes_per_line / 2; 564693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->ximage_origin2 = (GLushort *) b->backimage->data 565693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul + b->ximage_width2 * (height-1); 566693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* Needed by PIXELADDR3 macro */ 567693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->ximage_width3 = b->backimage->bytes_per_line; 568693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->ximage_origin3 = (GLubyte *) b->backimage->data 569693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul + b->ximage_width3 * (height-1); 570693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* Needed by PIXELADDR4 macro */ 571693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->ximage_width4 = b->backimage->width; 572693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->ximage_origin4 = (GLuint *) b->backimage->data 573693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul + b->ximage_width4 * (height-1); 574693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 575693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 576693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return GL_TRUE; 577693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else 578693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* Can't compile XSHM support */ 579693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return GL_FALSE; 580693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif 581693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 582693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif 583693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 584693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 585693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 586693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/* 587693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Setup an off-screen pixmap or Ximage to use as the back buffer. 588693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Input: b - the X/Mesa buffer 589693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 590693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulvoid xmesa_alloc_back_buffer( XMesaBuffer b ) 591693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 592693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (b->db_state==BACK_XIMAGE) { 593693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* Deallocate the old backimage, if any */ 594693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (b->backimage) { 595693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#if defined(USE_XSHM) && !defined(XFree86Server) 596693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (b->shm) { 597693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XShmDetach( b->xm_visual->display, &b->shminfo ); 598693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XDestroyImage( b->backimage ); 599693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul shmdt( b->shminfo.shmaddr ); 600693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 601693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul else 602693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif 603693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaDestroyImage( b->backimage ); 604693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->backimage = NULL; 605693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 606693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 607693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* Allocate new back buffer */ 608693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server 609693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul { 610693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* Allocate a regular XImage for the back buffer. */ 611693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->backimage = XMesaCreateImage(b->xm_visual->BitsPerPixel, 612693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->width, b->height, NULL); 613693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else 614e4656003caee346d9c4eb23256d73409271291a7Brian Paul if (b->shm==0 || alloc_shm_back_buffer(b)==GL_FALSE) { 615693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* Allocate a regular XImage for the back buffer. */ 616693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->backimage = XCreateImage( b->xm_visual->display, 617693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->xm_visual->visinfo->visual, 618693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GET_VISUAL_DEPTH(b->xm_visual), 619693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul ZPixmap, 0, /* format, offset */ 620693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul NULL, b->width, b->height, 621693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 8, 0 ); /* pad, bytes_per_line */ 622693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif 623693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (!b->backimage) { 6242ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul _mesa_warning(NULL, "alloc_back_buffer: XCreateImage failed."); 625693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 626693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->backimage->data = (char *) MALLOC( b->backimage->height 627693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * b->backimage->bytes_per_line ); 628693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (!b->backimage->data) { 6292ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul _mesa_warning(NULL, "alloc_back_buffer: MALLOC failed."); 630693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaDestroyImage( b->backimage ); 631693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->backimage = NULL; 632693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 633693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 634693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->backpixmap = None; 635693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 636693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul else if (b->db_state==BACK_PIXMAP) { 637693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaPixmap old_pixmap = b->backpixmap; 638693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* Free the old back pixmap */ 639693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (b->backpixmap) { 640693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaFreePixmap( b->xm_visual->display, b->backpixmap ); 641693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 642693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* Allocate new back pixmap */ 643693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->backpixmap = XMesaCreatePixmap( b->xm_visual->display, b->frontbuffer, 644693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->width, b->height, 645693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GET_VISUAL_DEPTH(b->xm_visual) ); 646693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->backimage = NULL; 647693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* update other references to backpixmap */ 648693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (b->buffer==(XMesaDrawable)old_pixmap) { 649693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->buffer = (XMesaDrawable)b->backpixmap; 650693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 651693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 652693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 653693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 654693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 655693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 656693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/* 657693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * A replacement for XAllocColor. This function should never 658693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * fail to allocate a color. When XAllocColor fails, we return 659693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * the nearest matching color. If we have to allocate many colors 660693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * this function isn't too efficient; the XQueryColors() could be 661693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * done just once. 662693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Written by Michael Pichler, Brian Paul, Mark Kilgard 663693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Input: dpy - X display 664693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * cmap - X colormap 665693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * cmapSize - size of colormap 666693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * In/Out: color - the XColor struct 667693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Output: exact - 1=exact color match, 0=closest match 668693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * alloced - 1=XAlloc worked, 0=XAlloc failed 669693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 670693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic void 671693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulnoFaultXAllocColor( int client, 672693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaDisplay *dpy, 673693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaColormap cmap, 674693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul int cmapSize, 675693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaColor *color, 676693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul int *exact, int *alloced ) 677693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 678693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server 679693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul Pixel *ppixIn; 680693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul xrgb *ctable; 681693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else 682693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* we'll try to cache ctable for better remote display performance */ 683693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul static Display *prevDisplay = NULL; 684693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul static XMesaColormap prevCmap = 0; 685693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul static int prevCmapSize = 0; 686693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul static XMesaColor *ctable = NULL; 687693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif 688693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaColor subColor; 689693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul int i, bestmatch; 690693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul double mindist; /* 3*2^16^2 exceeds long int precision. */ 691693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 692693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul (void) client; 693693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 694693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* First try just using XAllocColor. */ 695693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server 696693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (AllocColor(cmap, 697693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul &color->red, &color->green, &color->blue, 698693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul &color->pixel, 699693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul client) == Success) { 700693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else 701693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (XAllocColor(dpy, cmap, color)) { 702693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif 703693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *exact = 1; 704693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *alloced = 1; 705693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return; 706693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 707693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 708693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* Alloc failed, search for closest match */ 709693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 710693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* Retrieve color table entries. */ 711693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* XXX alloca candidate. */ 712693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server 713693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul ppixIn = (Pixel *) MALLOC(cmapSize * sizeof(Pixel)); 714693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul ctable = (xrgb *) MALLOC(cmapSize * sizeof(xrgb)); 715693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul for (i = 0; i < cmapSize; i++) { 716693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul ppixIn[i] = i; 717693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 718693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul QueryColors(cmap, cmapSize, ppixIn, ctable); 719693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else 720693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (prevDisplay != dpy || prevCmap != cmap 721693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul || prevCmapSize != cmapSize || !ctable) { 722693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* free previously cached color table */ 723693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (ctable) 724693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul FREE(ctable); 725693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* Get the color table from X */ 726693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul ctable = (XMesaColor *) MALLOC(cmapSize * sizeof(XMesaColor)); 727693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul assert(ctable); 728693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul for (i = 0; i < cmapSize; i++) { 729693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul ctable[i].pixel = i; 730693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 731693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XQueryColors(dpy, cmap, ctable, cmapSize); 732693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul prevDisplay = dpy; 733693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul prevCmap = cmap; 734693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul prevCmapSize = cmapSize; 735693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 736693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif 737693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 738693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* Find best match. */ 739693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul bestmatch = -1; 740693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul mindist = 0.0; 741693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul for (i = 0; i < cmapSize; i++) { 742693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul double dr = 0.30 * ((double) color->red - (double) ctable[i].red); 743693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul double dg = 0.59 * ((double) color->green - (double) ctable[i].green); 744693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul double db = 0.11 * ((double) color->blue - (double) ctable[i].blue); 745693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul double dist = dr * dr + dg * dg + db * db; 746693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (bestmatch < 0 || dist < mindist) { 747693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul bestmatch = i; 748693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul mindist = dist; 749693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 750693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 751693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 752693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* Return result. */ 753693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul subColor.red = ctable[bestmatch].red; 754693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul subColor.green = ctable[bestmatch].green; 755693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul subColor.blue = ctable[bestmatch].blue; 756693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* Try to allocate the closest match color. This should only 757693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * fail if the cell is read/write. Otherwise, we're incrementing 758693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * the cell's reference count. 759693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 760693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server 761693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (AllocColor(cmap, 762693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul &subColor.red, &subColor.green, &subColor.blue, 763693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul &subColor.pixel, 764693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul client) == Success) { 765693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else 766693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (XAllocColor(dpy, cmap, &subColor)) { 767693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif 768693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *alloced = 1; 769693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 770693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul else { 771693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* do this to work around a problem reported by Frank Ortega */ 772693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul subColor.pixel = (unsigned long) bestmatch; 773693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul subColor.red = ctable[bestmatch].red; 774693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul subColor.green = ctable[bestmatch].green; 7755e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen subColor.blue = ctable[bestmatch].blue; 776693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul subColor.flags = DoRed | DoGreen | DoBlue; 777693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *alloced = 0; 778693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 779693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server 780693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul FREE(ppixIn); 781693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul FREE(ctable); 782693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else 783693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* don't free table, save it for next time */ 784693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif 785693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 786693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *color = subColor; 787693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *exact = 0; 788693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 789693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 790693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 791693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 792693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 793693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/* 794693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Do setup for PF_GRAYSCALE pixel format. 795693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Note that buffer may be NULL. 796693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 797693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic GLboolean setup_grayscale( int client, XMesaVisual v, 798693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaBuffer buffer, XMesaColormap cmap ) 799693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 800693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (GET_VISUAL_DEPTH(v)<4 || GET_VISUAL_DEPTH(v)>16) { 801693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return GL_FALSE; 802693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 803693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 804693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (buffer) { 805693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaBuffer prevBuffer; 806693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 807693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (!cmap) { 808693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return GL_FALSE; 809693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 810693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 811693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul prevBuffer = find_xmesa_buffer(v->display, cmap, buffer); 812693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (prevBuffer && 8131832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul (buffer->xm_visual->mesa_visual.rgbMode == 8141832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul prevBuffer->xm_visual->mesa_visual.rgbMode)) { 815693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* Copy colormap stuff from previous XMesaBuffer which uses same 816693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * X colormap. Do this to avoid time spent in noFaultXAllocColor. 817693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 818693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul copy_colortable_info(buffer, prevBuffer); 819693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 820693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul else { 821693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* Allocate 256 shades of gray */ 822693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul int gray; 823693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul int colorsfailed = 0; 824693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul for (gray=0;gray<256;gray++) { 825693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GLint r = gamma_adjust( v->RedGamma, gray, 255 ); 826693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GLint g = gamma_adjust( v->GreenGamma, gray, 255 ); 827693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GLint b = gamma_adjust( v->BlueGamma, gray, 255 ); 828693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul int exact, alloced; 829693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaColor xcol; 830693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul xcol.red = (r << 8) | r; 831693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul xcol.green = (g << 8) | g; 832693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul xcol.blue = (b << 8) | b; 833693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul noFaultXAllocColor( client, v->display, 834693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul cmap, GET_COLORMAP_SIZE(v), 835693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul &xcol, &exact, &alloced ); 836693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (!exact) { 837693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul colorsfailed++; 838693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 839693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (alloced) { 840693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul assert(buffer->num_alloced<256); 841693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul buffer->alloced_colors[buffer->num_alloced] = xcol.pixel; 842693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul buffer->num_alloced++; 843693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 844693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 845693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /*OLD 846693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul assert(gray < 576); 847693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul buffer->color_table[gray*3+0] = xcol.pixel; 848693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul buffer->color_table[gray*3+1] = xcol.pixel; 849693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul buffer->color_table[gray*3+2] = xcol.pixel; 850693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul assert(xcol.pixel < 65536); 851693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul buffer->pixel_to_r[xcol.pixel] = gray * 30 / 100; 852693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul buffer->pixel_to_g[xcol.pixel] = gray * 59 / 100; 853693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul buffer->pixel_to_b[xcol.pixel] = gray * 11 / 100; 854693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 855693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul buffer->color_table[gray] = xcol.pixel; 856693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul assert(xcol.pixel < 65536); 857693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul buffer->pixel_to_r[xcol.pixel] = gray; 858693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul buffer->pixel_to_g[xcol.pixel] = gray; 859693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul buffer->pixel_to_b[xcol.pixel] = gray; 860693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 861693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 862367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul if (colorsfailed && _mesa_getenv("MESA_DEBUG")) { 8632ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul _mesa_warning(NULL, 864693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul "Note: %d out of 256 needed colors do not match exactly.\n", 865693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul colorsfailed ); 866693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 867693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 868693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 869693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 870449e47f06a46c42fb9895d13f37b599600225e56Brian Paul v->dithered_pf = PF_Grayscale; 871449e47f06a46c42fb9895d13f37b599600225e56Brian Paul v->undithered_pf = PF_Grayscale; 872693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return GL_TRUE; 873693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 874693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 875693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 876693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 877693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/* 878693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Setup RGB rendering for a window with a PseudoColor, StaticColor, 879693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * or 8-bit TrueColor visual visual. We try to allocate a palette of 225 880693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * colors (5 red, 9 green, 5 blue) and dither to approximate a 24-bit RGB 881693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * color. While this function was originally designed just for 8-bit 882693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * visuals, it has also proven to work from 4-bit up to 16-bit visuals. 883693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Dithering code contributed by Bob Mercier. 884693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 885693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic GLboolean setup_dithered_color( int client, XMesaVisual v, 886693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaBuffer buffer, XMesaColormap cmap ) 887693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 888b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul (void) DitherValues; /* silence warning */ 889b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul 890693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (GET_VISUAL_DEPTH(v)<4 || GET_VISUAL_DEPTH(v)>16) { 891693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return GL_FALSE; 892693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 893693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 894693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (buffer) { 895693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaBuffer prevBuffer; 896693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 897693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (!cmap) { 898693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return GL_FALSE; 899693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 900693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 901693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul prevBuffer = find_xmesa_buffer(v->display, cmap, buffer); 902693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (prevBuffer && 9031832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul (buffer->xm_visual->mesa_visual.rgbMode == 9041832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul prevBuffer->xm_visual->mesa_visual.rgbMode)) { 905693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* Copy colormap stuff from previous, matching XMesaBuffer. 906693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Do this to avoid time spent in noFaultXAllocColor. 907693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 908693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul copy_colortable_info(buffer, prevBuffer); 909693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 910693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul else { 911693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* Allocate X colors and initialize color_table[], red_table[], etc */ 912693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul int r, g, b, i; 913693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul int colorsfailed = 0; 914d737ad52720f2c6b10ea02cef1e3c046e52bee15Brian Paul for (r = 0; r < DITH_R; r++) { 915d737ad52720f2c6b10ea02cef1e3c046e52bee15Brian Paul for (g = 0; g < DITH_G; g++) { 916d737ad52720f2c6b10ea02cef1e3c046e52bee15Brian Paul for (b = 0; b < DITH_B; b++) { 917693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaColor xcol; 918693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul int exact, alloced; 919d737ad52720f2c6b10ea02cef1e3c046e52bee15Brian Paul xcol.red =gamma_adjust(v->RedGamma, r*65535/(DITH_R-1),65535); 920d737ad52720f2c6b10ea02cef1e3c046e52bee15Brian Paul xcol.green=gamma_adjust(v->GreenGamma, g*65535/(DITH_G-1),65535); 921d737ad52720f2c6b10ea02cef1e3c046e52bee15Brian Paul xcol.blue =gamma_adjust(v->BlueGamma, b*65535/(DITH_B-1),65535); 922693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul noFaultXAllocColor( client, v->display, 923693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul cmap, GET_COLORMAP_SIZE(v), 924693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul &xcol, &exact, &alloced ); 925693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (!exact) { 926693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul colorsfailed++; 927693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 928693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (alloced) { 929693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul assert(buffer->num_alloced<256); 930693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul buffer->alloced_colors[buffer->num_alloced] = xcol.pixel; 931693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul buffer->num_alloced++; 932693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 933d737ad52720f2c6b10ea02cef1e3c046e52bee15Brian Paul i = DITH_MIX( r, g, b ); 934693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul assert(i < 576); 935693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul buffer->color_table[i] = xcol.pixel; 936693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul assert(xcol.pixel < 65536); 937d737ad52720f2c6b10ea02cef1e3c046e52bee15Brian Paul buffer->pixel_to_r[xcol.pixel] = r * 255 / (DITH_R-1); 938d737ad52720f2c6b10ea02cef1e3c046e52bee15Brian Paul buffer->pixel_to_g[xcol.pixel] = g * 255 / (DITH_G-1); 939d737ad52720f2c6b10ea02cef1e3c046e52bee15Brian Paul buffer->pixel_to_b[xcol.pixel] = b * 255 / (DITH_B-1); 940693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 941693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 942693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 943693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 944367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul if (colorsfailed && _mesa_getenv("MESA_DEBUG")) { 9452ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul _mesa_warning(NULL, 946693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul "Note: %d out of %d needed colors do not match exactly.\n", 947d737ad52720f2c6b10ea02cef1e3c046e52bee15Brian Paul colorsfailed, DITH_R * DITH_G * DITH_B ); 948693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 949693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 950693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 951693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 952449e47f06a46c42fb9895d13f37b599600225e56Brian Paul v->dithered_pf = PF_Dither; 953449e47f06a46c42fb9895d13f37b599600225e56Brian Paul v->undithered_pf = PF_Lookup; 954693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return GL_TRUE; 955693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 956693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 957693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 958693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/* 959693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Setup for Hewlett Packard Color Recovery 8-bit TrueColor mode. 960693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * HPCR simulates 24-bit color fidelity with an 8-bit frame buffer. 961693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Special dithering tables have to be initialized. 962693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 963693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic void setup_8bit_hpcr( XMesaVisual v ) 964693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 965693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* HP Color Recovery contributed by: Alex De Bruyn (ad@lms.be) 966693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * To work properly, the atom _HP_RGB_SMOOTH_MAP_LIST must be defined 967693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * on the root window AND the colormap obtainable by XGetRGBColormaps 968693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * for that atom must be set on the window. (see also tkInitWindow) 969693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * If that colormap is not set, the output will look stripy. 970693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 971693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 972693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* Setup color tables with gamma correction */ 973693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul int i; 974693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul double g; 975693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 9765e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen g = 1.0 / v->RedGamma; 9775e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen for (i=0; i<256; i++) { 978367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul GLint red = IROUND_POS(255.0 * _mesa_pow( hpcr_rgbTbl[0][i]/255.0, g )); 979693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul v->hpcr_rgbTbl[0][i] = CLAMP( red, 16, 239 ); 980693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 981693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 982693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul g = 1.0 / v->GreenGamma; 983693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul for (i=0; i<256; i++) { 984367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul GLint green = IROUND_POS(255.0 * _mesa_pow( hpcr_rgbTbl[1][i]/255.0, g )); 985693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul v->hpcr_rgbTbl[1][i] = CLAMP( green, 16, 239 ); 986693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 987693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 988693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul g = 1.0 / v->BlueGamma; 989693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul for (i=0; i<256; i++) { 990367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul GLint blue = IROUND_POS(255.0 * _mesa_pow( hpcr_rgbTbl[2][i]/255.0, g )); 991693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul v->hpcr_rgbTbl[2][i] = CLAMP( blue, 32, 223 ); 992693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 993693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul v->undithered_pf = PF_HPCR; /* can't really disable dithering for now */ 994693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul v->dithered_pf = PF_HPCR; 995693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 996693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* which method should I use to clear */ 997693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* GL_FALSE: keep the ordinary method */ 998693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* GL_TRUE : clear with dither pattern */ 999367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul v->hpcr_clear_flag = _mesa_getenv("MESA_HPCR_CLEAR") ? GL_TRUE : GL_FALSE; 1000693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1001693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (v->hpcr_clear_flag) { 1002693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul v->hpcr_clear_pixmap = XMesaCreatePixmap(v->display, 1003693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul DefaultRootWindow(v->display), 1004693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 16, 2, 8); 1005693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifndef XFree86Server 1006693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul v->hpcr_clear_ximage = XGetImage(v->display, v->hpcr_clear_pixmap, 1007693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 0, 0, 16, 2, AllPlanes, ZPixmap); 1008693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif 1009693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1010693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 1011693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1012693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1013693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/* 1014693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Setup RGB rendering for a window with a True/DirectColor visual. 1015693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 1016693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic void setup_truecolor( XMesaVisual v, XMesaBuffer buffer, 1017190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul XMesaColormap cmap ) 1018693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 1019693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul unsigned long rmask, gmask, bmask; 1020693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul (void) buffer; 1021693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul (void) cmap; 1022693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1023693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* Compute red multiplier (mask) and bit shift */ 1024693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul v->rshift = 0; 1025693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul rmask = GET_REDMASK(v); 1026693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul while ((rmask & 1)==0) { 1027693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul v->rshift++; 1028693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul rmask = rmask >> 1; 1029693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1030693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1031693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* Compute green multiplier (mask) and bit shift */ 1032693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul v->gshift = 0; 1033693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul gmask = GET_GREENMASK(v); 1034693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul while ((gmask & 1)==0) { 1035693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul v->gshift++; 1036693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul gmask = gmask >> 1; 1037693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1038693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1039693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* Compute blue multiplier (mask) and bit shift */ 1040693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul v->bshift = 0; 1041693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul bmask = GET_BLUEMASK(v); 1042693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul while ((bmask & 1)==0) { 1043693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul v->bshift++; 1044693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul bmask = bmask >> 1; 1045693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1046693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1047693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* 1048693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Compute component-to-pixel lookup tables and dithering kernel 1049693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 1050693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul { 1051693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul static GLubyte kernel[16] = { 1052693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 0*16, 8*16, 2*16, 10*16, 1053693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 12*16, 4*16, 14*16, 6*16, 1054693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 3*16, 11*16, 1*16, 9*16, 1055693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 15*16, 7*16, 13*16, 5*16, 1056693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul }; 1057693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GLint rBits = bitcount(rmask); 1058693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GLint gBits = bitcount(gmask); 1059693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GLint bBits = bitcount(bmask); 10603cbbef53bcf9a74beec3d6699a03e8d0c2eb24e2Brian Paul GLint maxBits; 1061693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GLuint i; 1062693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1063693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* convert pixel components in [0,_mask] to RGB values in [0,255] */ 1064693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul for (i=0; i<=rmask; i++) 1065693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul v->PixelToR[i] = (unsigned char) ((i * 255) / rmask); 1066693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul for (i=0; i<=gmask; i++) 1067693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul v->PixelToG[i] = (unsigned char) ((i * 255) / gmask); 1068693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul for (i=0; i<=bmask; i++) 1069693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul v->PixelToB[i] = (unsigned char) ((i * 255) / bmask); 1070693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1071693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* convert RGB values from [0,255] to pixel components */ 1072693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1073693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul for (i=0;i<256;i++) { 1074693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GLint r = gamma_adjust(v->RedGamma, i, 255); 1075693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GLint g = gamma_adjust(v->GreenGamma, i, 255); 1076693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GLint b = gamma_adjust(v->BlueGamma, i, 255); 1077693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul v->RtoPixel[i] = (r >> (8-rBits)) << v->rshift; 1078693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul v->GtoPixel[i] = (g >> (8-gBits)) << v->gshift; 1079693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul v->BtoPixel[i] = (b >> (8-bBits)) << v->bshift; 1080693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1081693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* overflow protection */ 1082693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul for (i=256;i<512;i++) { 1083693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul v->RtoPixel[i] = v->RtoPixel[255]; 1084693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul v->GtoPixel[i] = v->GtoPixel[255]; 1085693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul v->BtoPixel[i] = v->BtoPixel[255]; 1086693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1087693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1088693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* setup dithering kernel */ 10893cbbef53bcf9a74beec3d6699a03e8d0c2eb24e2Brian Paul maxBits = rBits; 10903cbbef53bcf9a74beec3d6699a03e8d0c2eb24e2Brian Paul if (gBits > maxBits) maxBits = gBits; 10913cbbef53bcf9a74beec3d6699a03e8d0c2eb24e2Brian Paul if (bBits > maxBits) maxBits = bBits; 1092693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul for (i=0;i<16;i++) { 10933cbbef53bcf9a74beec3d6699a03e8d0c2eb24e2Brian Paul v->Kernel[i] = kernel[i] >> maxBits; 1094693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1095693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1096449e47f06a46c42fb9895d13f37b599600225e56Brian Paul v->undithered_pf = PF_Truecolor; 1097449e47f06a46c42fb9895d13f37b599600225e56Brian Paul v->dithered_pf = (GET_VISUAL_DEPTH(v)<24) ? PF_Dither_True : PF_Truecolor; 1098693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1099693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1100693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* 1101693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Now check for TrueColor visuals which we can optimize. 1102693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 1103693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if ( GET_REDMASK(v) ==0x0000ff 1104693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul && GET_GREENMASK(v)==0x00ff00 1105693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul && GET_BLUEMASK(v) ==0xff0000 1106693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul && CHECK_BYTE_ORDER(v) 1107693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul && v->BitsPerPixel==32 1108693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul && sizeof(GLuint)==4 1109693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul && v->RedGamma==1.0 && v->GreenGamma==1.0 && v->BlueGamma==1.0) { 1110693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* common 32 bpp config used on SGI, Sun */ 1111693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul v->undithered_pf = v->dithered_pf = PF_8A8B8G8R; 1112693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1113693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul else if (GET_REDMASK(v) ==0xff0000 1114693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul && GET_GREENMASK(v)==0x00ff00 1115693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul && GET_BLUEMASK(v) ==0x0000ff 1116693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul && CHECK_BYTE_ORDER(v) 1117693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul && v->BitsPerPixel==32 1118693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul && sizeof(GLuint)==4 1119693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul && v->RedGamma==1.0 && v->GreenGamma==1.0 && v->BlueGamma==1.0) { 1120693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* common 32 bpp config used on Linux, HP, IBM */ 1121693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul v->undithered_pf = v->dithered_pf = PF_8R8G8B; 1122693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1123693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul else if (GET_REDMASK(v) ==0xff0000 1124693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul && GET_GREENMASK(v)==0x00ff00 1125693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul && GET_BLUEMASK(v) ==0x0000ff 1126693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul && CHECK_BYTE_ORDER(v) 1127693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul && v->BitsPerPixel==24 1128693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul && sizeof(GLuint)==4 1129693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul && v->RedGamma==1.0 && v->GreenGamma==1.0 && v->BlueGamma==1.0) { 1130693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* common packed 24 bpp config used on Linux */ 1131693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul v->undithered_pf = v->dithered_pf = PF_8R8G8B24; 1132693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1133693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul else if (GET_REDMASK(v) ==0xf800 1134693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul && GET_GREENMASK(v)==0x07e0 1135693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul && GET_BLUEMASK(v) ==0x001f 1136693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul && CHECK_BYTE_ORDER(v) 1137693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul && v->BitsPerPixel==16 1138693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul && sizeof(GLushort)==2 1139693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul && v->RedGamma==1.0 && v->GreenGamma==1.0 && v->BlueGamma==1.0) { 1140693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* 5-6-5 color weight on common PC VGA boards */ 1141693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul v->undithered_pf = PF_5R6G5B; 1142449e47f06a46c42fb9895d13f37b599600225e56Brian Paul v->dithered_pf = PF_Dither_5R6G5B; 1143693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1144693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul else if (GET_REDMASK(v) ==0xe0 1145693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul && GET_GREENMASK(v)==0x1c 1146693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul && GET_BLUEMASK(v) ==0x03 1147693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul && CHECK_FOR_HPCR(v)) { 1148693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul setup_8bit_hpcr( v ); 1149693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1150693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 1151693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1152693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1153693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1154693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/* 1155693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Setup RGB rendering for a window with a monochrome visual. 1156693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 1157693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic void setup_monochrome( XMesaVisual v, XMesaBuffer b ) 1158693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 1159693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul (void) b; 1160449e47f06a46c42fb9895d13f37b599600225e56Brian Paul v->dithered_pf = v->undithered_pf = PF_1Bit; 1161693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* if black=1 then we must flip pixel values */ 1162693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul v->bitFlip = (GET_BLACK_PIXEL(v) != 0); 1163693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 1164693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1165693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1166693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1167693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/* 1168693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * When a context is "made current" for the first time, we can finally 1169693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * finish initializing the context's visual and buffer information. 1170693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Input: v - the XMesaVisual to initialize 1171693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * b - the XMesaBuffer to initialize (may be NULL) 1172693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * rgb_flag - TRUE = RGBA mode, FALSE = color index mode 1173693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * window - the window/pixmap we're rendering into 1174693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * cmap - the colormap associated with the window/pixmap 1175693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return: GL_TRUE=success, GL_FALSE=failure 1176693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 1177693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic GLboolean initialize_visual_and_buffer( int client, 1178693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaVisual v, 1179693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaBuffer b, 1180693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GLboolean rgb_flag, 1181693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaDrawable window, 11823265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul XMesaColormap cmap ) 1183693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 1184693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifndef XFree86Server 1185693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XGCValues gcvalues; 1186693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif 1187693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1188693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (b) { 1189693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul assert(b->xm_visual == v); 1190693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1191693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1192693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* Save true bits/pixel */ 1193a078d75a27b99252ede6520e24b145106ab98aa2Brian Paul v->BitsPerPixel = bits_per_pixel(v); 1194693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul assert(v->BitsPerPixel > 0); 1195693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1196693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1197693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (rgb_flag==GL_FALSE) { 1198693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* COLOR-INDEXED WINDOW: 1199693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Even if the visual is TrueColor or DirectColor we treat it as 1200693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * being color indexed. This is weird but might be useful to someone. 1201693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 1202449e47f06a46c42fb9895d13f37b599600225e56Brian Paul v->dithered_pf = v->undithered_pf = PF_Index; 1203693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul v->index_bits = GET_VISUAL_DEPTH(v); 1204693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1205693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul else { 1206693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* RGB WINDOW: 1207693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * We support RGB rendering into almost any kind of visual. 1208693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 1209693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul int xclass; 1210693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul xclass = GET_VISUAL_CLASS(v); 1211693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (xclass==TrueColor || xclass==DirectColor) { 1212190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul setup_truecolor( v, b, cmap ); 1213693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1214693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul else if (xclass==StaticGray && GET_VISUAL_DEPTH(v)==1) { 1215693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul setup_monochrome( v, b ); 1216693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1217693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul else if (xclass==GrayScale || xclass==StaticGray) { 1218693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (!setup_grayscale( client, v, b, cmap )) { 1219693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return GL_FALSE; 1220693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1221693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1222693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul else if ((xclass==PseudoColor || xclass==StaticColor) 1223693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul && GET_VISUAL_DEPTH(v)>=4 && GET_VISUAL_DEPTH(v)<=16) { 1224693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (!setup_dithered_color( client, v, b, cmap )) { 1225693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return GL_FALSE; 1226693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1227693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1228693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul else { 12292ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul _mesa_warning(NULL, "XMesa: RGB mode rendering not supported in given visual."); 1230693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return GL_FALSE; 1231693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1232693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul v->index_bits = 0; 1233693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1234367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul if (_mesa_getenv("MESA_NO_DITHER")) { 1235693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul v->dithered_pf = v->undithered_pf; 1236693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1237693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1238693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1239693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1240693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* 1241693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * If MESA_INFO env var is set print out some debugging info 1242693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * which can help Brian figure out what's going on when a user 1243693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * reports bugs. 1244693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 1245367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul if (_mesa_getenv("MESA_INFO")) { 12462ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul _mesa_printf("X/Mesa visual = %p\n", (void *) v); 12472ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul _mesa_printf("X/Mesa dithered pf = %u\n", v->dithered_pf); 12482ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul _mesa_printf("X/Mesa undithered pf = %u\n", v->undithered_pf); 12492ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul _mesa_printf("X/Mesa level = %d\n", v->level); 12502ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul _mesa_printf("X/Mesa depth = %d\n", GET_VISUAL_DEPTH(v)); 12512ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul _mesa_printf("X/Mesa bits per pixel = %d\n", v->BitsPerPixel); 1252693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1253693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1254693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (b && window) { 1255693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* Do window-specific initializations */ 1256693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1257693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* Window dimensions */ 1258693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul unsigned int w, h; 1259693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul get_drawable_size( v->display, window, &w, &h ); 1260693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->width = w; 1261693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->height = h; 1262693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1263693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->frontbuffer = window; 1264693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1265693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* Setup for single/double buffering */ 12661832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul if (v->mesa_visual.doubleBufferMode) { 1267693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* Double buffered */ 1268693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifndef XFree86Server 1269693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->shm = check_for_xshm( v->display ); 1270693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif 1271693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul xmesa_alloc_back_buffer( b ); 1272693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (b->db_state==BACK_PIXMAP) { 1273693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->buffer = (XMesaDrawable)b->backpixmap; 1274693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1275693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul else { 1276693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->buffer = XIMAGE; 1277693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1278693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1279693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul else { 1280693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* Single Buffered */ 1281693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->buffer = b->frontbuffer; 1282693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1283693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1284693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* X11 graphics contexts */ 1285693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server 1286c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul b->gc = CreateScratchGC(v->display, window->depth); 1287693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else 1288c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul b->gc = XCreateGC( v->display, window, 0, NULL ); 1289693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif 1290c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul XMesaSetFunction( v->display, b->gc, GXcopy ); 1291693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 12929ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul /* cleargc - for glClear() */ 12939ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul#ifdef XFree86Server 12949ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul b->cleargc = CreateScratchGC(v->display, window->depth); 12959ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul#else 12969ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul b->cleargc = XCreateGC( v->display, window, 0, NULL ); 12979ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul#endif 12989ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul XMesaSetFunction( v->display, b->cleargc, GXcopy ); 12999ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul 1300693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* 1301693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Don't generate Graphics Expose/NoExpose events in swapbuffers(). 1302693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Patch contributed by Michael Pichler May 15, 1995. 1303693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 1304693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server 13059ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul b->swapgc = CreateScratchGC(v->display, window->depth); 1306693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul { 1307693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul CARD32 v[1]; 1308693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul v[0] = FALSE; 13099ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul dixChangeGC(NullClient, b->swapgc, GCGraphicsExposures, v, NULL); 1310693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1311693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else 1312693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul gcvalues.graphics_exposures = False; 13139ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul b->swapgc = XCreateGC( v->display, window, 1314693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GCGraphicsExposures, &gcvalues); 1315693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif 13169ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul XMesaSetFunction( v->display, b->swapgc, GXcopy ); 1317693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* 1318693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Set fill style and tile pixmap once for all for HPCR stuff 1319693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * (instead of doing it each time in clear_color_HPCR_pixmap()) 1320693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Initialize whole stuff 1321693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Patch contributed by Jacques Leroy March 8, 1998. 1322693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 1323693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (v->hpcr_clear_flag && b->buffer!=XIMAGE) { 1324693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul int i; 1325693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul for (i=0; i<16; i++) 1326693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul { 1327693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaPutPixel(v->hpcr_clear_ximage, i, 0, 0); 1328693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaPutPixel(v->hpcr_clear_ximage, i, 1, 0); 1329693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1330693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaPutImage(b->display, (XMesaDrawable)v->hpcr_clear_pixmap, 1331693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->cleargc, v->hpcr_clear_ximage, 0, 0, 0, 0, 16, 2); 1332693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaSetFillStyle( v->display, b->cleargc, FillTiled); 1333693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaSetTile( v->display, b->cleargc, v->hpcr_clear_pixmap ); 1334693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1335693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1336693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* Initialize the row buffer XImage for use in write_color_span() */ 1337693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server 1338693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->rowimage = XMesaCreateImage(GET_VISUAL_DEPTH(v), MAX_WIDTH, 1, 1339693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul (char *)MALLOC(MAX_WIDTH*4)); 1340693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else 1341693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->rowimage = XCreateImage( v->display, 1342693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul v->visinfo->visual, 1343693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul v->visinfo->depth, 1344693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul ZPixmap, 0, /*format, offset*/ 1345693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul (char*) MALLOC(MAX_WIDTH*4), /*data*/ 1346693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul MAX_WIDTH, 1, /*width, height*/ 1347693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 32, /*bitmap_pad*/ 1348693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 0 /*bytes_per_line*/ ); 1349693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif 1350693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1351693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1352693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return GL_TRUE; 1353693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 1354693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1355693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1356693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1357693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/* 1358693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Convert an RGBA color to a pixel value. 1359693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 1360693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulunsigned long 1361693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulxmesa_color_to_pixel( XMesaContext xmesa, GLubyte r, GLubyte g, GLubyte b, GLubyte a, 1362693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GLuint pixelFormat) 1363693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 1364693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul switch (pixelFormat) { 1365449e47f06a46c42fb9895d13f37b599600225e56Brian Paul case PF_Index: 1366693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return 0; 1367449e47f06a46c42fb9895d13f37b599600225e56Brian Paul case PF_Truecolor: 1368693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul { 1369693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul unsigned long p; 1370693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul PACK_TRUECOLOR( p, r, g, b ); 1371693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return p; 1372693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1373693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul case PF_8A8B8G8R: 1374693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return PACK_8A8B8G8R( r, g, b, a ); 1375693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul case PF_8R8G8B: 1376693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* fall through */ 1377693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul case PF_8R8G8B24: 1378693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return PACK_8R8G8B( r, g, b ); 1379693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul case PF_5R6G5B: 1380693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return PACK_5R6G5B( r, g, b ); 1381449e47f06a46c42fb9895d13f37b599600225e56Brian Paul case PF_Dither: 1382693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul { 1383693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul DITHER_SETUP; 1384693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return DITHER( 1, 0, r, g, b ); 1385693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1386449e47f06a46c42fb9895d13f37b599600225e56Brian Paul case PF_1Bit: 1387693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* 382 = (3*255)/2 */ 1388693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return ((r+g+b) > 382) ^ xmesa->xm_visual->bitFlip; 1389693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul case PF_HPCR: 1390693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return DITHER_HPCR(1, 1, r, g, b); 1391449e47f06a46c42fb9895d13f37b599600225e56Brian Paul case PF_Lookup: 1392693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul { 1393693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul LOOKUP_SETUP; 1394693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return LOOKUP( r, g, b ); 1395693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1396449e47f06a46c42fb9895d13f37b599600225e56Brian Paul case PF_Grayscale: 1397693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return GRAY_RGB( r, g, b ); 1398449e47f06a46c42fb9895d13f37b599600225e56Brian Paul case PF_Dither_True: 1399693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* fall through */ 1400449e47f06a46c42fb9895d13f37b599600225e56Brian Paul case PF_Dither_5R6G5B: 1401693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul { 1402693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul unsigned long p; 1403693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul PACK_TRUEDITHER(p, 1, 0, r, g, b); 1404693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return p; 1405693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1406693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul default: 140708836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(NULL, "Bad pixel format in xmesa_color_to_pixel"); 1408693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1409693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return 0; 1410693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 1411693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1412693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1413693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/**********************************************************************/ 1414693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/***** Public Functions *****/ 1415693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/**********************************************************************/ 1416693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1417693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1418693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/* 1419693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Create a new X/Mesa visual. 1420693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Input: display - X11 display 1421693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * visinfo - an XVisualInfo pointer 1422693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * rgb_flag - GL_TRUE = RGB mode, 1423693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * GL_FALSE = color index mode 1424693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * alpha_flag - alpha buffer requested? 1425693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * db_flag - GL_TRUE = double-buffered, 1426693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * GL_FALSE = single buffered 1427693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * stereo_flag - stereo visual? 1428693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * ximage_flag - GL_TRUE = use an XImage for back buffer, 1429693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * GL_FALSE = use an off-screen pixmap for back buffer 1430693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * depth_size - requested bits/depth values, or zero 1431693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * stencil_size - requested bits/stencil values, or zero 1432693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * accum_red_size - requested bits/red accum values, or zero 1433693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * accum_green_size - requested bits/green accum values, or zero 1434693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * accum_blue_size - requested bits/blue accum values, or zero 1435693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * accum_alpha_size - requested bits/alpha accum values, or zero 1436693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * num_samples - number of samples/pixel if multisampling, or zero 1437693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * level - visual level, usually 0 1438693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * visualCaveat - ala the GLX extension, usually GLX_NONE_EXT 1439693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return; a new XMesaVisual or 0 if error. 1440693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 1441693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulXMesaVisual XMesaCreateVisual( XMesaDisplay *display, 1442693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaVisualInfo visinfo, 1443693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GLboolean rgb_flag, 1444693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GLboolean alpha_flag, 1445693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GLboolean db_flag, 1446693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GLboolean stereo_flag, 1447693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GLboolean ximage_flag, 1448693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GLint depth_size, 1449693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GLint stencil_size, 1450693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GLint accum_red_size, 1451693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GLint accum_green_size, 1452693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GLint accum_blue_size, 1453693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GLint accum_alpha_size, 1454693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GLint num_samples, 1455693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GLint level, 1456693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GLint visualCaveat ) 1457693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 1458693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul char *gamma; 1459693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaVisual v; 1460693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GLint red_bits, green_bits, blue_bits, alpha_bits; 1461693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1462693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* For debugging only */ 1463367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul if (_mesa_getenv("MESA_XSYNC")) { 1464693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* This makes debugging X easier. 1465693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * In your debugger, set a breakpoint on _XError to stop when an 1466693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * X protocol error is generated. 1467693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 1468693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server 1469693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* NOT_NEEDED */ 1470693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else 1471693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XSynchronize( display, 1 ); 1472693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif 1473693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1474693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1475693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul v = (XMesaVisual) CALLOC_STRUCT(xmesa_visual); 1476693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (!v) { 1477693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return NULL; 1478693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1479693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1480693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* 1481693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * In the X server, NULL is passed in for the display. It will have 1482693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * to be set before using this visual. See XMesaSetVisualDisplay() 1483693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * below. 1484693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 1485693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul v->display = display; 1486693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1487693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* Save a copy of the XVisualInfo struct because the user may XFREE() 1488693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * the struct but we may need some of the information contained in it 1489693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * at a later time. 1490693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 1491693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server 1492693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul v->visinfo = visinfo; 1493693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else 1494693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul v->visinfo = (XVisualInfo *) MALLOC(sizeof(*visinfo)); 1495693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if(!v->visinfo) { 1496693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul FREE(v); 1497693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return NULL; 1498693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1499693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul MEMCPY(v->visinfo, visinfo, sizeof(*visinfo)); 1500693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif 1501693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1502693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server 1503693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* Initialize the depth of the screen */ 1504693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul { 1505693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul PixmapFormatRec *format; 1506693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1507693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul for (format = screenInfo.formats; 1508693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul format->depth != display->rootDepth; 1509693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul format++) 1510693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul ; 1511693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul v->screen_depth = format->bitsPerPixel; 1512693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1513693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif 1514693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1515693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* check for MESA_GAMMA environment variable */ 1516367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul gamma = _mesa_getenv("MESA_GAMMA"); 1517693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (gamma) { 1518693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul v->RedGamma = v->GreenGamma = v->BlueGamma = 0.0; 1519693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul sscanf( gamma, "%f %f %f", &v->RedGamma, &v->GreenGamma, &v->BlueGamma ); 1520693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (v->RedGamma<=0.0) v->RedGamma = 1.0; 1521693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (v->GreenGamma<=0.0) v->GreenGamma = v->RedGamma; 1522693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (v->BlueGamma<=0.0) v->BlueGamma = v->RedGamma; 1523693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1524693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul else { 1525693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul v->RedGamma = v->GreenGamma = v->BlueGamma = 1.0; 1526693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1527693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1528693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul v->ximage_flag = ximage_flag; 1529693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul v->level = level; 1530693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul v->VisualCaveat = visualCaveat; 1531693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1532693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul (void) initialize_visual_and_buffer( 0, v, NULL, rgb_flag, 0, 0 ); 1533693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1534693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul { 1535693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul int xclass; 1536693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul xclass = GET_VISUAL_CLASS(v); 1537693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (xclass==TrueColor || xclass==DirectColor) { 1538693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul red_bits = bitcount(GET_REDMASK(v)); 1539693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul green_bits = bitcount(GET_GREENMASK(v)); 1540693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul blue_bits = bitcount(GET_BLUEMASK(v)); 1541693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul alpha_bits = 0; 1542693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1543693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul else { 1544693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* this is an approximation */ 1545693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul int depth; 1546693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul depth = GET_VISUAL_DEPTH(v); 1547693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul red_bits = depth / 3; 1548693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul depth -= red_bits; 1549693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul green_bits = depth / 2; 1550693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul depth -= green_bits; 1551693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul blue_bits = depth; 1552693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul alpha_bits = 0; 1553693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul assert( red_bits + green_bits + blue_bits == GET_VISUAL_DEPTH(v) ); 1554693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1555693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1556693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1557693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (alpha_flag && alpha_bits == 0) 1558693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul alpha_bits = 8; 1559693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 15601832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul _mesa_initialize_visual( &v->mesa_visual, 15611832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul rgb_flag, db_flag, stereo_flag, 15621832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul red_bits, green_bits, 15631832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul blue_bits, alpha_bits, 15641832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul v->index_bits, 15651832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul depth_size, 15661832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul stencil_size, 15671832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul accum_red_size, accum_green_size, 15681832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul accum_blue_size, accum_alpha_size, 15691832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul 0 ); 1570693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return v; 1571693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 1572693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1573693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1574693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulvoid XMesaSetVisualDisplay( XMesaDisplay *dpy, XMesaVisual v ) 1575693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 1576693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul v->display = dpy; 1577693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 1578693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1579693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1580693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulvoid XMesaDestroyVisual( XMesaVisual v ) 1581693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 1582693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifndef XFree86Server 1583693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul FREE(v->visinfo); 1584693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif 1585693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul FREE(v); 1586693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 1587693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1588693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1589693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1590d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul/** 1591693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Create a new XMesaContext. 1592d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul * \param v the XMesaVisual 1593d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul * \param share_list another XMesaContext with which to share display 1594d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul * lists or NULL if no sharing is wanted. 1595d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul * \return an XMesaContext or NULL if error. 1596693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 15977a1f3a37a10b162b067239dafa19fc6865a41f14Keith WhitwellXMesaContext XMesaCreateContext( XMesaVisual v, XMesaContext share_list ) 1598693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 15999a33a11d714c90162d32781ebbd2c1dfab52cfd1Brian Paul static GLboolean firstTime = GL_TRUE; 1600693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaContext c; 16011e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul GLcontext *mesaCtx; 1602d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul struct dd_function_table functions; 1603d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul TNLcontext *tnl; 1604693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1605693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (firstTime) { 1606693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul _glthread_INIT_MUTEX(_xmesa_lock); 1607693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul firstTime = GL_FALSE; 1608693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1609693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1610d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul /* Note: the XMesaContext contains a Mesa GLcontext struct (inheritance) */ 1611693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul c = (XMesaContext) CALLOC_STRUCT(xmesa_context); 1612d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul if (!c) 1613693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return NULL; 1614693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 16151e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul mesaCtx = &(c->mesa); 16161e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul 1617d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul /* initialize with default driver functions, then plug in XMesa funcs */ 1618d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul _mesa_init_driver_functions(&functions); 1619d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul xmesa_init_driver_functions(v, &functions); 16201e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul if (!_mesa_initialize_context(mesaCtx, &v->mesa_visual, 16211e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul share_list ? &(share_list->mesa) : (GLcontext *) NULL, 1622d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul &functions, (void *) c)) { 1623693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul FREE(c); 1624693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return NULL; 1625693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1626693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 16271e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul _mesa_enable_sw_extensions(mesaCtx); 16281e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul _mesa_enable_1_3_extensions(mesaCtx); 16291e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul _mesa_enable_1_4_extensions(mesaCtx); 163084351999ec6ad07e0cfc31c0b3a8c86da4134bfeBrian Paul _mesa_enable_1_5_extensions(mesaCtx); 1631693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1632d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul /* finish up xmesa context initializations */ 1633d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul c->swapbytes = CHECK_BYTE_ORDER(v) ? GL_FALSE : GL_TRUE; 1634693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul c->xm_visual = v; 16353b4fbbc129c711a5aec8d653d5c6eb2e195f947cBrian Paul c->xm_draw_buffer = NULL; /* set later by XMesaMakeCurrent */ 16363b4fbbc129c711a5aec8d653d5c6eb2e195f947cBrian Paul c->xm_read_buffer = NULL; /* set later by XMesaMakeCurrent */ 1637693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul c->xm_buffer = NULL; /* set later by XMesaMakeCurrent */ 1638693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul c->display = v->display; 1639693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul c->pixelformat = v->dithered_pf; /* Dithering is enabled by default */ 1640693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1641ec0585883a85a495d94e24970d64e5d6fc889147Keith Whitwell /* Initialize the software rasterizer and helper modules. 1642ec0585883a85a495d94e24970d64e5d6fc889147Keith Whitwell */ 16431e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul _swrast_CreateContext( mesaCtx ); 16441e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul _ac_CreateContext( mesaCtx ); 16451e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul _tnl_CreateContext( mesaCtx ); 16461e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul _swsetup_CreateContext( mesaCtx ); 1647ec0585883a85a495d94e24970d64e5d6fc889147Keith Whitwell 1648d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul /* tnl setup */ 1649d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul tnl = TNL_CONTEXT(mesaCtx); 1650d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul tnl->Driver.RunPipeline = _tnl_run_pipeline; 1651d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul /* swrast setup */ 16521e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul xmesa_register_swrast_functions( mesaCtx ); 1653d3fd7ba8af15bead2f770d68a893449adeb11397Brian Paul _swsetup_Wakeup(mesaCtx); 1654709892459922a32096fe9dd8261d0d92337bb02fKeith Whitwell 16557a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell return c; 1656693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 1657693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1658693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1659693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1660693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulvoid XMesaDestroyContext( XMesaContext c ) 1661693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 16621e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul GLcontext *mesaCtx = &c->mesa; 1663693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef FX 16643b4fbbc129c711a5aec8d653d5c6eb2e195f947cBrian Paul if (c->xm_draw_buffer && c->xm_buffer->FXctx) 16653b4fbbc129c711a5aec8d653d5c6eb2e195f947cBrian Paul fxMesaDestroyContext(c->xm_draw_buffer->FXctx); 1666693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif 16671e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul _swsetup_DestroyContext( mesaCtx ); 16681e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul _swrast_DestroyContext( mesaCtx ); 16691e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul _tnl_DestroyContext( mesaCtx ); 16701e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul _ac_DestroyContext( mesaCtx ); 16710983163fde91f1026146903155fd414725a79879Brian Paul _mesa_free_context_data( mesaCtx ); 16720983163fde91f1026146903155fd414725a79879Brian Paul _mesa_free( c ); 1673693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 1674693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1675693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1676693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1677693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/* 1678693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * XXX this isn't a public function! It's a hack for the 3Dfx driver. 1679693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Create a new XMesaBuffer from an X window. 1680693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Input: v - the XMesaVisual 1681693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * w - the window 1682693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * c - the context 1683693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return: new XMesaBuffer or NULL if error 1684693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 1685693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulXMesaBuffer XMesaCreateWindowBuffer2( XMesaVisual v, XMesaWindow w, 1686693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaContext c ) 1687693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 1688693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifndef XFree86Server 1689693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XWindowAttributes attr; 1690693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif 1691693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef FX 1692693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul char *fxEnvVar; 1693693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif 1694693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul int client = 0; 1695693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1696693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaBuffer b = alloc_xmesa_buffer(); 1697693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (!b) { 1698693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return NULL; 1699693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1700693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1701693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul (void) c; 1702693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1703693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server 1704693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul client = CLIENT_ID(((XMesaDrawable)w)->id); 1705693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif 1706693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1707693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul assert(v); 1708693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1709693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server 17107a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell if (GET_VISUAL_DEPTH(v) != ((XMesaDrawable)w)->depth) { 1711693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else 17127a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell XGetWindowAttributes( v->display, w, &attr ); 17137a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell 17147a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell if (GET_VISUAL_DEPTH(v) != attr.depth) { 1715693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif 17162ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul _mesa_warning(NULL, "XMesaCreateWindowBuffer: depth mismatch between visual and window!\n"); 1717693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return NULL; 1718693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1719693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1720693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->xm_visual = v; 1721a078d75a27b99252ede6520e24b145106ab98aa2Brian Paul b->type = WINDOW; 1722693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->display = v->display; 1723693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server 1724693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->cmap = (ColormapPtr)LookupIDByType(wColormap(w), RT_COLORMAP); 1725693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else 1726693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (attr.colormap) { 1727693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->cmap = attr.colormap; 1728693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1729693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul else { 17302ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul _mesa_warning(NULL, "Window %u has no colormap!\n", (unsigned int) w); 1731693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* this is weird, a window w/out a colormap!? */ 1732693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* OK, let's just allocate a new one and hope for the best */ 1733693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->cmap = XCreateColormap(v->display, w, attr.visual, AllocNone); 1734693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1735693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif 1736693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1737693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* determine back buffer implementation */ 17381832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul if (v->mesa_visual.doubleBufferMode) { 1739693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (v->ximage_flag) { 1740693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->db_state = BACK_XIMAGE; 1741693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1742693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul else { 1743693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->db_state = BACK_PIXMAP; 1744693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1745693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1746693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul else { 1747693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->db_state = 0; 1748693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1749693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 17501832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul _mesa_initialize_framebuffer(&b->mesa_buffer, 17511832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul &v->mesa_visual, 17521832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul v->mesa_visual.depthBits > 0, 17531832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul v->mesa_visual.stencilBits > 0, 17541832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul v->mesa_visual.accumRedBits > 0, 17551832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul v->mesa_visual.alphaBits > 0 ); 1756693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 17571832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul if (!initialize_visual_and_buffer( client, v, b, v->mesa_visual.rgbMode, 1758693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul (XMesaDrawable)w, b->cmap )) { 1759693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul free_xmesa_buffer(client, b); 1760693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return NULL; 1761693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1762693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1763693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef FX 1764367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul fxEnvVar = _mesa_getenv("MESA_GLX_FX"); 1765693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (fxEnvVar) { 17667a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell if (fxEnvVar[0]!='d') { 17677a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell int attribs[100]; 17687a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell int numAttribs = 0; 17697a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell int hw; 17701832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul if (v->mesa_visual.depthBits > 0) { 17717a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell attribs[numAttribs++] = FXMESA_DEPTH_SIZE; 1772fd83bc2b33f34195f05300eee6ebfe18570177a0Daniel Borca attribs[numAttribs++] = v->mesa_visual.depthBits; 17737a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell } 17741832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul if (v->mesa_visual.doubleBufferMode) { 17757a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell attribs[numAttribs++] = FXMESA_DOUBLEBUFFER; 17767a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell } 17771832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul if (v->mesa_visual.accumRedBits > 0) { 17787a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell attribs[numAttribs++] = FXMESA_ACCUM_SIZE; 17791832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul attribs[numAttribs++] = v->mesa_visual.accumRedBits; 17807a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell } 17811832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul if (v->mesa_visual.stencilBits > 0) { 17827a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell attribs[numAttribs++] = FXMESA_STENCIL_SIZE; 17831832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul attribs[numAttribs++] = v->mesa_visual.stencilBits; 17847a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell } 17851832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul if (v->mesa_visual.alphaBits > 0) { 17867a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell attribs[numAttribs++] = FXMESA_ALPHA_SIZE; 1787fd83bc2b33f34195f05300eee6ebfe18570177a0Daniel Borca attribs[numAttribs++] = v->mesa_visual.alphaBits; 17887a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell } 17891e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul if (1) { 17907a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell attribs[numAttribs++] = FXMESA_SHARE_CONTEXT; 17911e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul attribs[numAttribs++] = (int) &(c->mesa); 17927a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell } 17937a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell attribs[numAttribs++] = FXMESA_NONE; 17947a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell 1795e9e98405e720845f06f7a375585491e938f4dacdDaniel Borca /* [dBorca] we should take an envvar for `fxMesaSelectCurrentBoard'!!! */ 1796e9e98405e720845f06f7a375585491e938f4dacdDaniel Borca if ((hw = fxMesaSelectCurrentBoard(0))==GR_SSTTYPE_VOODOO) { 17977a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell b->FXctx = fxMesaCreateBestContext(0, b->width, b->height, attribs); 1798449e47f06a46c42fb9895d13f37b599600225e56Brian Paul if ((v->undithered_pf!=PF_Index) && (b->backimage)) { 17997a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell b->FXisHackUsable = b->FXctx ? GL_TRUE : GL_FALSE; 18007a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell if (fxEnvVar[0]=='w' || fxEnvVar[0]=='W') 18017a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell b->FXwindowHack = b->FXctx ? GL_TRUE : GL_FALSE; 18027a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell else 18037a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell b->FXwindowHack = GL_FALSE; 18047a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell } 18057a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell } 1806e9e98405e720845f06f7a375585491e938f4dacdDaniel Borca else { 18077a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell if (fxEnvVar[0]=='w' || fxEnvVar[0]=='W') 18087a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell b->FXctx = fxMesaCreateContext(w, GR_RESOLUTION_NONE, 18097a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell GR_REFRESH_75Hz, attribs); 18107a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell else 18117a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell b->FXctx = fxMesaCreateBestContext(0, b->width, b->height, attribs); 18127a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell b->FXisHackUsable = GL_FALSE; 18137a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell b->FXwindowHack = GL_FALSE; 18147a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell } 18157a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell /* 18167a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell fprintf(stderr, 18177a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell "voodoo %d, wid %d height %d hack: usable %d active %d\n", 18187a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell hw, b->width, b->height, b->FXisHackUsable, b->FXwindowHack); 18197a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell */ 18207a1f3a37a10b162b067239dafa19fc6865a41f14Keith Whitwell } 1821693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1822693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul else { 18232ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul _mesa_warning(NULL, "WARNING: This Mesa Library includes the Glide driver but\n"); 18242ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul _mesa_warning(NULL, " you have not defined the MESA_GLX_FX env. var.\n"); 18252ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul _mesa_warning(NULL, " (check the README.3DFX file for more information).\n\n"); 18262ad5921cf3c9737796c3485bd5b9f738fb4a3cb9Brian Paul _mesa_warning(NULL, " you can disable this message with a 'export MESA_GLX_FX=disable'.\n"); 1827693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1828693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif 1829693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1830693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return b; 1831693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 1832693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1833693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1834693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulXMesaBuffer XMesaCreateWindowBuffer( XMesaVisual v, XMesaWindow w ) 1835693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 1836693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return XMesaCreateWindowBuffer2( v, w, NULL ); 1837693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 1838693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1839693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1840693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/* 1841693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Create a new XMesaBuffer from an X pixmap. 1842693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Input: v - the XMesaVisual 1843693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * p - the pixmap 1844693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * cmap - the colormap, may be 0 if using a TrueColor or DirectColor 1845693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * visual for the pixmap 1846693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return: new XMesaBuffer or NULL if error 1847693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 1848693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulXMesaBuffer XMesaCreatePixmapBuffer( XMesaVisual v, 1849693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaPixmap p, XMesaColormap cmap ) 1850693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 1851693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul int client = 0; 1852693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaBuffer b = alloc_xmesa_buffer(); 1853693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (!b) { 1854693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return NULL; 1855693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1856693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1857693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1858693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server 1859693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul client = CLIENT_ID(((XMesaDrawable)p)->id); 1860693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif 1861693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1862693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul assert(v); 1863693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1864693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->xm_visual = v; 1865a078d75a27b99252ede6520e24b145106ab98aa2Brian Paul b->type = PIXMAP; 1866693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->display = v->display; 1867693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->cmap = cmap; 1868693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1869693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* determine back buffer implementation */ 18701832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul if (v->mesa_visual.doubleBufferMode) { 1871693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (v->ximage_flag) { 1872693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->db_state = BACK_XIMAGE; 1873693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1874693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul else { 1875693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->db_state = BACK_PIXMAP; 1876693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1877693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1878693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul else { 1879693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->db_state = 0; 1880693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1881693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 18821832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul _mesa_initialize_framebuffer(&b->mesa_buffer, 18831832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul &v->mesa_visual, 18841832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul v->mesa_visual.depthBits > 0, 18851832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul v->mesa_visual.stencilBits > 0, 18861832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul v->mesa_visual.accumRedBits + 18871832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul v->mesa_visual.accumGreenBits + 18881832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul v->mesa_visual.accumBlueBits > 0, 18891832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul v->mesa_visual.alphaBits > 0 ); 1890693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 18911832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul if (!initialize_visual_and_buffer(client, v, b, v->mesa_visual.rgbMode, 1892693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul (XMesaDrawable)p, cmap)) { 1893693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul free_xmesa_buffer(client, b); 1894693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return NULL; 1895693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1896693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1897693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return b; 1898693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 1899693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1900693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1901693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1902190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian PaulXMesaBuffer XMesaCreatePBuffer( XMesaVisual v, XMesaColormap cmap, 1903190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul unsigned int width, unsigned int height ) 1904190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul{ 1905f2c5296dd7c990f566187621835414c3015058a1Brian Paul#ifdef XFree86Server 1906f2c5296dd7c990f566187621835414c3015058a1Brian Paul return 0; 1907f2c5296dd7c990f566187621835414c3015058a1Brian Paul#else 1908190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul int client = 0; 1909e4656003caee346d9c4eb23256d73409271291a7Brian Paul XMesaWindow root; 1910e4656003caee346d9c4eb23256d73409271291a7Brian Paul XMesaDrawable drawable; /* X Pixmap Drawable */ 1911190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul XMesaBuffer b = alloc_xmesa_buffer(); 1912190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul if (!b) { 1913190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul return NULL; 1914190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul } 1915190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul 1916190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul b->xm_visual = v; 19173265fe5f8e47bfa42dd9e5e4a0e717816ad058a0Brian Paul b->type = PBUFFER; 1918190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul b->display = v->display; 1919190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul b->cmap = cmap; 1920190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul 1921e4656003caee346d9c4eb23256d73409271291a7Brian Paul /* allocate pixmap for front buffer */ 1922e4656003caee346d9c4eb23256d73409271291a7Brian Paul root = RootWindow( v->display, v->visinfo->screen ); 1923e4656003caee346d9c4eb23256d73409271291a7Brian Paul drawable = XCreatePixmap( v->display, root, width, height, v->visinfo->depth ); 1924e4656003caee346d9c4eb23256d73409271291a7Brian Paul 1925190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul /* determine back buffer implementation */ 1926190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul if (v->mesa_visual.doubleBufferMode) { 1927190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul if (v->ximage_flag) { 1928190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul b->db_state = BACK_XIMAGE; 1929190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul } 1930190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul else { 1931190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul b->db_state = BACK_PIXMAP; 1932190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul } 1933190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul } 1934190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul else { 1935190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul b->db_state = 0; 1936190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul } 1937190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul 1938190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul _mesa_initialize_framebuffer(&b->mesa_buffer, 1939190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul &v->mesa_visual, 1940190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul v->mesa_visual.depthBits > 0, 1941190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul v->mesa_visual.stencilBits > 0, 1942190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul v->mesa_visual.accumRedBits + 1943190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul v->mesa_visual.accumGreenBits + 1944190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul v->mesa_visual.accumBlueBits > 0, 1945190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul v->mesa_visual.alphaBits > 0 ); 1946190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul 1947190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul if (!initialize_visual_and_buffer(client, v, b, v->mesa_visual.rgbMode, 1948e4656003caee346d9c4eb23256d73409271291a7Brian Paul drawable, cmap)) { 1949190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul free_xmesa_buffer(client, b); 1950190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul return NULL; 1951190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul } 1952190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul 1953190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul return b; 1954f2c5296dd7c990f566187621835414c3015058a1Brian Paul#endif 1955190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul} 1956190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul 1957190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul 1958190d34874cdf2a074364980d1cf2d3fa201ac7a1Brian Paul 1959693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/* 1960693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Deallocate an XMesaBuffer structure and all related info. 1961693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 1962693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulvoid XMesaDestroyBuffer( XMesaBuffer b ) 1963693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 1964693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul int client = 0; 1965693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1966693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server 1967693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (b->frontbuffer) 1968693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul client = CLIENT_ID(b->frontbuffer->id); 1969693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif 1970693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1971c19d783e0715ac01ad4d3fd0705500d2bf6f7039Brian Paul if (b->gc) XMesaFreeGC( b->xm_visual->display, b->gc ); 1972693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (b->cleargc) XMesaFreeGC( b->xm_visual->display, b->cleargc ); 19739ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul if (b->swapgc) XMesaFreeGC( b->xm_visual->display, b->swapgc ); 1974693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 1975693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (b->backimage) { 1976693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#if defined(USE_XSHM) && !defined(XFree86Server) 1977693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (b->shm) { 1978693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XShmDetach( b->xm_visual->display, &b->shminfo ); 1979693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XDestroyImage( b->backimage ); 1980693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul shmdt( b->shminfo.shmaddr ); 1981693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1982693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul else 1983693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif 1984693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaDestroyImage( b->backimage ); 1985693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1986693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (b->backpixmap) { 1987693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaFreePixmap( b->xm_visual->display, b->backpixmap ); 1988693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (b->xm_visual->hpcr_clear_flag) { 1989693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaFreePixmap( b->xm_visual->display, 1990693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->xm_visual->hpcr_clear_pixmap ); 1991693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaDestroyImage( b->xm_visual->hpcr_clear_ximage ); 1992693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1993693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1994693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (b->rowimage) { 1995693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul FREE( b->rowimage->data ); 1996693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->rowimage->data = NULL; 1997693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaDestroyImage( b->rowimage ); 1998693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 1999693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 2000693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul free_xmesa_buffer(client, b); 2001693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 2002693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 2003693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 2004693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 2005693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/* 2006693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Bind buffer b to context c and make c the current rendering context. 2007693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 2008693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulGLboolean XMesaMakeCurrent( XMesaContext c, XMesaBuffer b ) 2009693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 2010693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return XMesaMakeCurrent2( c, b, b ); 2011693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 2012693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 2013693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 2014693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/* 2015693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Bind buffer b to context c and make c the current rendering context. 2016693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 2017693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulGLboolean XMesaMakeCurrent2( XMesaContext c, XMesaBuffer drawBuffer, 2018693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaBuffer readBuffer ) 2019693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 2020693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (c) { 2021693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (!drawBuffer || !readBuffer) 2022693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return GL_FALSE; /* must specify buffers! */ 2023693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 2024693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef FX 2025693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (drawBuffer->FXctx) { 2026693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul fxMesaMakeCurrent(drawBuffer->FXctx); 2027693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 20283b4fbbc129c711a5aec8d653d5c6eb2e195f947cBrian Paul c->xm_draw_buffer = drawBuffer; 2029693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul c->xm_read_buffer = readBuffer; 20303b4fbbc129c711a5aec8d653d5c6eb2e195f947cBrian Paul c->xm_buffer = drawBuffer; 2031693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 2032693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return GL_TRUE; 2033693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 2034693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif 20351e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul if (&(c->mesa) == _mesa_get_current_context() 20363b4fbbc129c711a5aec8d653d5c6eb2e195f947cBrian Paul && c->xm_draw_buffer == drawBuffer 2037693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul && c->xm_read_buffer == readBuffer 20383b4fbbc129c711a5aec8d653d5c6eb2e195f947cBrian Paul && c->xm_draw_buffer->wasCurrent) { 2039693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* same context and buffer, do nothing */ 2040693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return GL_TRUE; 2041693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 2042693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 20433b4fbbc129c711a5aec8d653d5c6eb2e195f947cBrian Paul c->xm_draw_buffer = drawBuffer; 2044693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul c->xm_read_buffer = readBuffer; 20453b4fbbc129c711a5aec8d653d5c6eb2e195f947cBrian Paul c->xm_buffer = drawBuffer; 2046693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 20471e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul _mesa_make_current2(&(c->mesa), 20481832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul &drawBuffer->mesa_buffer, 20491832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul &readBuffer->mesa_buffer); 2050693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 20511e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul if (c->mesa.Viewport.Width == 0) { 2052693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* initialize viewport to window size */ 2053693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul _mesa_Viewport( 0, 0, drawBuffer->width, drawBuffer->height ); 20541e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul c->mesa.Scissor.Width = drawBuffer->width; 20551e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul c->mesa.Scissor.Height = drawBuffer->height; 2056693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 2057693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 20581832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul if (c->xm_visual->mesa_visual.rgbMode) { 2059693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* 2060693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Must recompute and set these pixel values because colormap 2061693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * can be different for different windows. 2062693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 2063693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul c->clearpixel = xmesa_color_to_pixel( c, 2064693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul c->clearcolor[0], 2065693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul c->clearcolor[1], 2066693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul c->clearcolor[2], 2067693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul c->clearcolor[3], 2068693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul c->xm_visual->undithered_pf); 20693b4fbbc129c711a5aec8d653d5c6eb2e195f947cBrian Paul XMesaSetForeground(c->display, c->xm_draw_buffer->cleargc, c->clearpixel); 2070693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 2071693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 2072693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* Solution to Stephane Rehel's problem with glXReleaseBuffersMESA(): */ 20733b4fbbc129c711a5aec8d653d5c6eb2e195f947cBrian Paul c->xm_draw_buffer->wasCurrent = GL_TRUE; 2074693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 2075693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul else { 2076693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* Detach */ 2077b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul _mesa_make_current2( NULL, NULL, NULL ); 2078693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 2079693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return GL_TRUE; 2080693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 2081693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 2082693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 2083693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/* 2084693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Unbind the context c from its buffer. 2085693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 2086693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulGLboolean XMesaUnbindContext( XMesaContext c ) 2087693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 2088693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* A no-op for XFree86 integration purposes */ 2089693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return GL_TRUE; 2090693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 2091693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 2092693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 2093693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulXMesaContext XMesaGetCurrentContext( void ) 2094693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 2095693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GET_CURRENT_CONTEXT(ctx); 2096693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (ctx) { 20971e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul XMesaContext xmesa = XMESA_CONTEXT(ctx); 2098693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return xmesa; 2099693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 2100693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul else { 2101693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return 0; 2102693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 2103693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 2104693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 2105693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 2106693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulXMesaBuffer XMesaGetCurrentBuffer( void ) 2107693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 2108693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GET_CURRENT_CONTEXT(ctx); 2109693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (ctx) { 21101e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul XMesaContext xmesa = XMESA_CONTEXT(ctx); 21113b4fbbc129c711a5aec8d653d5c6eb2e195f947cBrian Paul return xmesa->xm_draw_buffer; 2112693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 2113693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul else { 2114693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return 0; 2115693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 2116693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 2117693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 2118693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 2119693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/* New in Mesa 3.1 */ 2120693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulXMesaBuffer XMesaGetCurrentReadBuffer( void ) 2121693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 2122693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GET_CURRENT_CONTEXT(ctx); 2123693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (ctx) { 21241e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul XMesaContext xmesa = XMESA_CONTEXT(ctx); 21253b4fbbc129c711a5aec8d653d5c6eb2e195f947cBrian Paul return xmesa->xm_read_buffer; 2126693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 2127693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul else { 2128693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return 0; 2129693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 2130693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 2131693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 2132693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 2133693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulGLboolean XMesaForceCurrent(XMesaContext c) 2134693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 2135693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (c) { 21361e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul if (&(c->mesa) != _mesa_get_current_context()) { 21371e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul _mesa_make_current(&(c->mesa), &c->xm_draw_buffer->mesa_buffer); 2138693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 2139693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 2140693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul else { 2141b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul _mesa_make_current(NULL, NULL); 2142693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 2143693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return GL_TRUE; 2144693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 2145693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 2146693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 2147693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulGLboolean XMesaLoseCurrent(XMesaContext c) 2148693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 2149693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul (void) c; 2150b1394fa92aaaf859ce9efc8b5fc194397921320cBrian Paul _mesa_make_current(NULL, NULL); 2151693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return GL_TRUE; 2152693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 2153693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 2154693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 2155693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/* 2156693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Switch 3Dfx support hack between window and full-screen mode. 2157693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 2158693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulGLboolean XMesaSetFXmode( GLint mode ) 2159693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 2160693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef FX 2161367d308b8267ad86cd7623590b7bfd4737b5fbf5Brian Paul const char *fx = _mesa_getenv("MESA_GLX_FX"); 2162693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (fx && fx[0] != 'd') { 2163693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GET_CURRENT_CONTEXT(ctx); 2164693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GrHwConfiguration hw; 2165693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (!FX_grSstQueryHardware(&hw)) { 2166693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /*fprintf(stderr, "!grSstQueryHardware\n");*/ 2167693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return GL_FALSE; 2168693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 2169693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (hw.num_sst < 1) { 2170693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /*fprintf(stderr, "hw.num_sst < 1\n");*/ 2171693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return GL_FALSE; 2172693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 2173693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (ctx) { 21741e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul XMesaContext xmesa = XMESA_CONTEXT(ctx); 2175693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (mode == XMESA_FX_WINDOW) { 21763b4fbbc129c711a5aec8d653d5c6eb2e195f947cBrian Paul if (xmesa->xm_draw_buffer->FXisHackUsable) { 2177693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul FX_grSstControl(GR_CONTROL_DEACTIVATE); 21783b4fbbc129c711a5aec8d653d5c6eb2e195f947cBrian Paul xmesa->xm_draw_buffer->FXwindowHack = GL_TRUE; 2179693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return GL_TRUE; 2180693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 2181693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 2182693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul else if (mode == XMESA_FX_FULLSCREEN) { 2183693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul FX_grSstControl(GR_CONTROL_ACTIVATE); 21843b4fbbc129c711a5aec8d653d5c6eb2e195f947cBrian Paul xmesa->xm_draw_buffer->FXwindowHack = GL_FALSE; 2185693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return GL_TRUE; 2186693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 2187693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul else { 2188693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* Error: Bad mode value */ 2189693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 2190693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 2191693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 2192693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /*fprintf(stderr, "fallthrough\n");*/ 2193693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else 2194693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul (void) mode; 2195693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif 2196693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return GL_FALSE; 2197693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 2198693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 2199693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 2200693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 2201693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef FX 2202693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/* 2203693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Read image from VooDoo frame buffer into X/Mesa's back XImage. 2204693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 2205693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulstatic void FXgetImage( XMesaBuffer b ) 2206693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 22071d01794e6efa2a366057412f24f82504cc3c2d87Brian Paul GET_CURRENT_CONTEXT(ctx); 2208693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul static unsigned short pixbuf[MAX_WIDTH]; 220901915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul GLuint x, y; 221001915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul int xpos, ypos; 2211693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaWindow root; 2212693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul unsigned int bw, depth, width, height; 22131e24d3318df57b36e3b68695ff64b4b8bd822c9eBrian Paul XMesaContext xmesa = XMESA_CONTEXT(ctx); 2214693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 2215693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server 2216693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul x = b->frontbuffer->x; 2217693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul y = b->frontbuffer->y; 2218693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul width = b->frontbuffer->width; 2219693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul height = b->frontbuffer->height; 2220693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul depth = b->frontbuffer->depth; 2221693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else 22223ac01f5e4780b90659a44b2e8d0834940548ab1fBrian Paul XGetGeometry( b->xm_visual->display, b->frontbuffer, 222301915e90e6912f06d43d443a09157f7bbc96ddc5Brian Paul &root, &xpos, &ypos, &width, &height, &bw, &depth); 2224693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif 2225693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (b->width != width || b->height != height) { 22263ac01f5e4780b90659a44b2e8d0834940548ab1fBrian Paul b->width = MIN2((int)width, b->FXctx->width); 22273ac01f5e4780b90659a44b2e8d0834940548ab1fBrian Paul b->height = MIN2((int)height, b->FXctx->height); 2228693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (b->width & 1) 2229693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->width--; /* prevent odd width */ 2230693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul xmesa_alloc_back_buffer( b ); 2231693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 2232693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 22331b65e52fb19599688494e7dcb292ab3bd1eee1b3Daniel Borca /* [dBorca] 22341b65e52fb19599688494e7dcb292ab3bd1eee1b3Daniel Borca * not needed for Voodoo2 anymore. 22351b65e52fb19599688494e7dcb292ab3bd1eee1b3Daniel Borca * should we test fxMesa->bgrOrder? 22361b65e52fb19599688494e7dcb292ab3bd1eee1b3Daniel Borca */ 22371b65e52fb19599688494e7dcb292ab3bd1eee1b3Daniel Borca /* grLfbWriteColorFormat(GR_COLORFORMAT_ARGB); */ 22383ac01f5e4780b90659a44b2e8d0834940548ab1fBrian Paul if (b->xm_visual->undithered_pf==PF_5R6G5B) { 2239693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* Special case: 16bpp RGB */ 2240693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul grLfbReadRegion( GR_BUFFER_FRONTBUFFER, /* src buffer */ 22413ac01f5e4780b90659a44b2e8d0834940548ab1fBrian Paul 0, b->FXctx->height - b->height, /*pos*/ 2242693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->width, b->height, /* size */ 2243693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->width * sizeof(GLushort), /* stride */ 2244693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->backimage->data); /* dest buffer */ 2245693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 2246449e47f06a46c42fb9895d13f37b599600225e56Brian Paul else if (b->xm_visual->dithered_pf==PF_Dither 22473ac01f5e4780b90659a44b2e8d0834940548ab1fBrian Paul && GET_VISUAL_DEPTH(b->xm_visual)==8) { 2248693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* Special case: 8bpp RGB */ 2249693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul for (y=0;y<b->height;y++) { 22503ac01f5e4780b90659a44b2e8d0834940548ab1fBrian Paul GLubyte *ptr = (GLubyte*) b->backimage->data 22513ac01f5e4780b90659a44b2e8d0834940548ab1fBrian Paul + b->backimage->bytes_per_line * y; 2252693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XDITHER_SETUP(y); 2253693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 2254693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* read row from 3Dfx frame buffer */ 2255693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul grLfbReadRegion( GR_BUFFER_FRONTBUFFER, 22563ac01f5e4780b90659a44b2e8d0834940548ab1fBrian Paul 0, b->FXctx->height-(b->height-y), 22575e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen b->width, 1, 2258693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 0, 2259693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul pixbuf ); 2260693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 2261693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* write to XImage back buffer */ 2262693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul for (x=0;x<b->width;x++) { 2263693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GLubyte r = (pixbuf[x] & 0xf800) >> 8; 2264693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GLubyte g = (pixbuf[x] & 0x07e0) >> 3; 2265693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GLubyte b = (pixbuf[x] & 0x001f) << 3; 2266693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *ptr++ = XDITHER( x, r, g, b); 2267693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 2268693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 2269693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 2270693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul else { 2271693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* General case: slow! */ 2272693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul for (y=0;y<b->height;y++) { 2273693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* read row from 3Dfx frame buffer */ 2274693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul grLfbReadRegion( GR_BUFFER_FRONTBUFFER, 22753ac01f5e4780b90659a44b2e8d0834940548ab1fBrian Paul 0, b->FXctx->height-(b->height-y), 22765e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen b->width, 1, 2277693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 0, 2278693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul pixbuf ); 2279693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 2280693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* write to XImage back buffer */ 2281693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul for (x=0;x<b->width;x++) { 2282693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaPutPixel(b->backimage,x,y, 2283693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul xmesa_color_to_pixel(xmesa, 2284693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul (pixbuf[x] & 0xf800) >> 8, 2285693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul (pixbuf[x] & 0x07e0) >> 3, 2286693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul (pixbuf[x] & 0x001f) << 3, 22873ac01f5e4780b90659a44b2e8d0834940548ab1fBrian Paul 0xff, 22883ac01f5e4780b90659a44b2e8d0834940548ab1fBrian Paul b->xm_visual->undithered_pf)); 2289693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 2290693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 2291693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 22921b65e52fb19599688494e7dcb292ab3bd1eee1b3Daniel Borca /* grLfbWriteColorFormat(GR_COLORFORMAT_ABGR); */ 2293693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 2294693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif 2295693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 2296693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 2297693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/* 2298693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Copy the back buffer to the front buffer. If there's no back buffer 2299693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * this is a no-op. 2300693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 2301693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulvoid XMesaSwapBuffers( XMesaBuffer b ) 2302693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 2303693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GET_CURRENT_CONTEXT(ctx); 2304693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 2305693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* If we're swapping the buffer associated with the current context 2306693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * we have to flush any pending rendering commands first. 2307693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 230818a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul if (ctx && ctx->DrawBuffer == &(b->mesa_buffer)) 230960b6e4fd7e85ca0ad1c4ab22433b745bf97e9280Brian Paul _mesa_notifySwapBuffers(ctx); 2310693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 2311693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (b->db_state) { 2312693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef FX 2313693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (b->FXctx) { 2314693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul fxMesaSwapBuffers(); 2315693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 2316693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (b->FXwindowHack) 2317693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul FXgetImage(b); 2318693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul else 2319693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return; 2320693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 2321693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif 2322693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (b->backimage) { 2323693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* Copy Ximage from host's memory to server's window */ 2324693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#if defined(USE_XSHM) && !defined(XFree86Server) 2325693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (b->shm) { 2326693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /*_glthread_LOCK_MUTEX(_xmesa_lock);*/ 2327693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XShmPutImage( b->xm_visual->display, b->frontbuffer, 23289ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul b->swapgc, 2329693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->backimage, 0, 0, 2330693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 0, 0, b->width, b->height, False ); 2331693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /*_glthread_UNLOCK_MUTEX(_xmesa_lock);*/ 2332693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 2333693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul else 2334693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif 2335693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul { 2336693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /*_glthread_LOCK_MUTEX(_xmesa_lock);*/ 2337693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaPutImage( b->xm_visual->display, b->frontbuffer, 23389ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul b->swapgc, 2339693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->backimage, 0, 0, 2340693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 0, 0, b->width, b->height ); 2341693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /*_glthread_UNLOCK_MUTEX(_xmesa_lock);*/ 2342693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 2343693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 2344693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul else { 2345693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* Copy pixmap to window on server */ 2346693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /*_glthread_LOCK_MUTEX(_xmesa_lock);*/ 2347693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaCopyArea( b->xm_visual->display, 2348693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->backpixmap, /* source drawable */ 2349693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->frontbuffer, /* dest. drawable */ 23509ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul b->swapgc, 2351693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 0, 0, b->width, b->height, /* source region */ 2352693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 0, 0 /* dest region */ 2353693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul ); 2354693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /*_glthread_UNLOCK_MUTEX(_xmesa_lock);*/ 2355693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 2356693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 2357655ba5d9927187e76b66f5886d090624dc4b1dd9Brian Paul#if !defined(XFree86Server) 2358693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XSync( b->xm_visual->display, False ); 2359693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif 2360693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 2361693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 2362693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 2363693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 2364693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/* 2365693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Copy sub-region of back buffer to front buffer 2366693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 2367693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulvoid XMesaCopySubBuffer( XMesaBuffer b, int x, int y, int width, int height ) 2368693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 2369693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GET_CURRENT_CONTEXT(ctx); 2370693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 2371693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* If we're swapping the buffer associated with the current context 2372693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * we have to flush any pending rendering commands first. 2373693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 23741d01794e6efa2a366057412f24f82504cc3c2d87Brian Paul if (ctx && ctx->DrawBuffer == &(b->mesa_buffer)) 237560b6e4fd7e85ca0ad1c4ab22433b745bf97e9280Brian Paul _mesa_notifySwapBuffers(ctx); 2376693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 2377693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (b->db_state) { 2378536ede7e00ff5e2f10be3bf9b60cd2cfa80b3518Brian Paul int yTop = b->height - y - height; 2379693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef FX 2380693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (b->FXctx) { 2381693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul fxMesaSwapBuffers(); 2382693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (b->FXwindowHack) 2383693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul FXgetImage(b); 2384693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul else 2385693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return; 2386693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 2387693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif 2388693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (b->backimage) { 2389693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* Copy Ximage from host's memory to server's window */ 2390693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#if defined(USE_XSHM) && !defined(XFree86Server) 2391693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (b->shm) { 2392693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* XXX assuming width and height aren't too large! */ 2393693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XShmPutImage( b->xm_visual->display, b->frontbuffer, 23949ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul b->swapgc, 2395693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->backimage, x, yTop, 2396693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul x, yTop, width, height, False ); 2397693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* wait for finished event??? */ 2398693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 2399693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul else 2400693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif 2401693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul { 2402693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* XXX assuming width and height aren't too large! */ 2403693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaPutImage( b->xm_visual->display, b->frontbuffer, 24049ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul b->swapgc, 2405693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->backimage, x, yTop, 2406693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul x, yTop, width, height ); 2407693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 2408693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 2409693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul else { 2410693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* Copy pixmap to window on server */ 2411693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaCopyArea( b->xm_visual->display, 2412693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->backpixmap, /* source drawable */ 2413693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul b->frontbuffer, /* dest. drawable */ 24149ac7182ec4558cb0c3a6481c72732f05feb50a60Brian Paul b->swapgc, 2415693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul x, yTop, width, height, /* source region */ 2416693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul x, yTop /* dest region */ 2417693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul ); 2418693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 2419693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 2420693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 2421693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 2422693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 2423693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/* 2424693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return a pointer to the XMesa backbuffer Pixmap or XImage. This function 2425693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * is a way to get "under the hood" of X/Mesa so one can manipulate the 2426693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * back buffer directly. 2427693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Output: pixmap - pointer to back buffer's Pixmap, or 0 2428693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * ximage - pointer to back buffer's XImage, or NULL 2429693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return: GL_TRUE = context is double buffered 2430693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * GL_FALSE = context is single buffered 2431693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 2432693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulGLboolean XMesaGetBackBuffer( XMesaBuffer b, 2433693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaPixmap *pixmap, 2434693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaImage **ximage ) 2435693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 2436693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (b->db_state) { 2437693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (pixmap) *pixmap = b->backpixmap; 2438693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (ximage) *ximage = b->backimage; 2439693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return GL_TRUE; 2440693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 2441693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul else { 2442693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *pixmap = 0; 2443693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *ximage = NULL; 2444693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return GL_FALSE; 2445693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 2446693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 2447693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 2448693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 2449693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/* 2450693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return the depth buffer associated with an XMesaBuffer. 2451693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Input: b - the XMesa buffer handle 2452693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Output: width, height - size of buffer in pixels 2453693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * bytesPerValue - bytes per depth value (2 or 4) 2454693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * buffer - pointer to depth buffer values 2455693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Return: GL_TRUE or GL_FALSE to indicate success or failure. 2456693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 2457693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulGLboolean XMesaGetDepthBuffer( XMesaBuffer b, GLint *width, GLint *height, 2458693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GLint *bytesPerValue, void **buffer ) 2459693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 24601832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul if (!b->mesa_buffer.DepthBuffer) { 2461693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *width = 0; 2462693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *height = 0; 2463693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *bytesPerValue = 0; 2464693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *buffer = 0; 2465693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return GL_FALSE; 2466693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 2467693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul else { 24681832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul *width = b->mesa_buffer.Width; 24691832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul *height = b->mesa_buffer.Height; 2470693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul *bytesPerValue = sizeof(GLdepth); 24711832f1cc86758fdcbd122edd5bf9e7a29ccade20Brian Paul *buffer = b->mesa_buffer.DepthBuffer; 2472693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return GL_TRUE; 2473693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 2474693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 2475693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 2476693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 2477693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulvoid XMesaFlush( XMesaContext c ) 2478693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 2479693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (c && c->xm_visual) { 2480693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server 2481693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* NOT_NEEDED */ 2482693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else 2483693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XSync( c->xm_visual->display, False ); 2484693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif 2485693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 2486693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 2487693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 2488693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 2489693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 2490693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulconst char *XMesaGetString( XMesaContext c, int name ) 2491693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 2492693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul (void) c; 2493693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (name==XMESA_VERSION) { 24943160edec3305a81e13aa2b5a3387a0a75c1747bfBrian Paul return "5.0"; 2495693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 2496693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul else if (name==XMESA_EXTENSIONS) { 2497693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return ""; 2498693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 2499693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul else { 2500693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return NULL; 2501693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 2502693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 2503693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 2504693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 2505693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 2506693f81be4c16bcec4e017e9b3189f518d157d85fBrian PaulXMesaBuffer XMesaFindBuffer( XMesaDisplay *dpy, XMesaDrawable d ) 2507693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 2508693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaBuffer b; 2509693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul for (b=XMesaBufferList; b; b=b->Next) { 2510693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (b->frontbuffer==d && b->display==dpy) { 2511693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return b; 2512693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 2513693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 2514693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return NULL; 2515693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 2516693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 2517693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 2518693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 2519693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul/* 2520693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Look for XMesaBuffers whose X window has been destroyed. 2521693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul * Deallocate any such XMesaBuffers. 2522693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul */ 2523693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulvoid XMesaGarbageCollect( void ) 2524693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 2525693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaBuffer b, next; 2526693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul for (b=XMesaBufferList; b; b=next) { 2527693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul next = b->Next; 2528a078d75a27b99252ede6520e24b145106ab98aa2Brian Paul if (b->display && b->frontbuffer && b->type == WINDOW) { 2529693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#ifdef XFree86Server 2530693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* NOT_NEEDED */ 2531693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#else 2532693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XSync(b->display, False); 2533693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul if (!window_exists( b->display, b->frontbuffer )) { 2534693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* found a dead window, free the ancillary info */ 2535693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaDestroyBuffer( b ); 2536693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 2537693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul#endif 2538693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 2539693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 2540693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 2541693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 2542693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 2543693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulvoid XMesaReset( void ) 2544693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 2545693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul while (XMesaBufferList) 2546693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaDestroyBuffer(XMesaBufferList); 2547693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 2548693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul XMesaBufferList = NULL; 2549693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 2550693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 2551693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 2552693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paulunsigned long XMesaDitherColor( XMesaContext xmesa, GLint x, GLint y, 2553693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GLfloat red, GLfloat green, 2554693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GLfloat blue, GLfloat alpha ) 2555693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul{ 2556693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GLint r = (GLint) (red * 255.0F); 2557693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GLint g = (GLint) (green * 255.0F); 2558693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GLint b = (GLint) (blue * 255.0F); 2559693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul GLint a = (GLint) (alpha * 255.0F); 2560693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 256197d8a35fa8bf906be5413dbde822e828f9075604Brian Paul (void) DitherValues; /* silence warning */ 256297d8a35fa8bf906be5413dbde822e828f9075604Brian Paul 2563693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul switch (xmesa->pixelformat) { 2564449e47f06a46c42fb9895d13f37b599600225e56Brian Paul case PF_Index: 2565693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return 0; 2566449e47f06a46c42fb9895d13f37b599600225e56Brian Paul case PF_Truecolor: 2567693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul { 2568693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul unsigned long p; 2569693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul PACK_TRUECOLOR( p, r, g, b ); 2570693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return p; 2571693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 2572693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul case PF_8A8B8G8R: 2573693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return PACK_8A8B8G8R( r, g, b, a ); 2574693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul case PF_8R8G8B: 2575693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return PACK_8R8G8B( r, g, b ); 2576693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul case PF_5R6G5B: 2577693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return PACK_5R6G5B( r, g, b ); 2578449e47f06a46c42fb9895d13f37b599600225e56Brian Paul case PF_Dither: 2579693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul { 2580693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul DITHER_SETUP; 2581693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return DITHER( x, y, r, g, b ); 2582693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 2583449e47f06a46c42fb9895d13f37b599600225e56Brian Paul case PF_1Bit: 2584693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* 382 = (3*255)/2 */ 2585693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return ((r+g+b) > 382) ^ xmesa->xm_visual->bitFlip; 2586693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul case PF_HPCR: 2587693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return DITHER_HPCR(x, y, r, g, b); 2588449e47f06a46c42fb9895d13f37b599600225e56Brian Paul case PF_Lookup: 2589693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul { 2590693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul LOOKUP_SETUP; 2591693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return LOOKUP( r, g, b ); 2592693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 2593449e47f06a46c42fb9895d13f37b599600225e56Brian Paul case PF_Grayscale: 2594693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return GRAY_RGB( r, g, b ); 2595449e47f06a46c42fb9895d13f37b599600225e56Brian Paul case PF_Dither_5R6G5B: 2596693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul /* fall through */ 2597449e47f06a46c42fb9895d13f37b599600225e56Brian Paul case PF_Dither_True: 2598693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul { 2599693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul unsigned long p; 2600693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul PACK_TRUEDITHER(p, x, y, r, g, b); 2601693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return p; 2602693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 2603693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul default: 260408836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(NULL, "Bad pixel format in XMesaDitherColor"); 2605693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul } 2606693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul return 0; 2607693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul} 2608693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 2609693f81be4c16bcec4e017e9b3189f518d157d85fBrian Paul 261018a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul/* 261118a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul * This is typically called when the window size changes and we need 261218a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul * to reallocate the buffer's back/depth/stencil/accum buffers. 261318a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul */ 261418a285a5e244b7405b85feb7315a30d99920ec5dBrian Paulvoid XMesaResizeBuffers( XMesaBuffer b ) 261518a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul{ 261618a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul xmesa_resize_buffers( &(b->mesa_buffer) ); 261718a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul 261818a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul} 261918a285a5e244b7405b85feb7315a30d99920ec5dBrian Paul 2620