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