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