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