xm_api.c revision 4d944b502f8a1ae372d9248e888612bffb5eb6a5
14ee2ad04344446e610172a0e73949212923014dfSebastian Redl/* 22cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * Mesa 3-D graphics library 32cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * Version: 6.5.2 42cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * 52cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * Copyright (C) 1999-2006 Brian Paul All Rights Reserved. 62cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * 72cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * Permission is hereby granted, free of charge, to any person obtaining a 82cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * copy of this software and associated documentation files (the "Software"), 92cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * to deal in the Software without restriction, including without limitation 10a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl * the rights to use, copy, modify, merge, publish, distribute, sublicense, 112cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * and/or sell copies of the Software, and to permit persons to whom the 122cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * Software is furnished to do so, subject to the following conditions: 132cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * 147faa2ec03a7ef120ac165bb45b6c70a8b20c9f1cSebastian Redl * The above copyright notice and this permission notice shall be included 1589d9980bbc2e4a4ac86673e6ec16fb9f5babb63bDouglas Gregor * in all copies or substantial portions of the Software. 160eca89e9890db4d8336ce762a5b359a1d58ca02bArgyrios Kyrtzidis * 17e737f5041a36d0befb39ffeed8d50ba15916d3daDouglas Gregor * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18e737f5041a36d0befb39ffeed8d50ba15916d3daDouglas Gregor * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 192cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 202cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 212cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 222a7fb27913999d132cf9e10e03dc5271faa2e9d3John McCall * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2389eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis */ 240b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor 257a1fad38256eb4c5129359be85ba1ea1678eb5c9John McCall/** 262cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * \file xm_api.c 27a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall * 286ab7cd853e9c15cf986a8a7c3db1f8d20e275409Sebastian Redl * All the XMesa* API functions. 297c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner * 306a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor * 317c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner * NOTES: 3283d63c78810556d26b62ac4cbae2eda6cdd2570cSteve Naroff * 3314f79002e58556798e86168c63e48d533287eda5Douglas Gregor * The window coordinate system origin (0,0) is in the lower-left corner 3410e286aa8d39fb51a21412850265d9dae74613eeChris Lattner * of the window. X11's window coordinate origin is in the upper-left 353251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor * corner of the window. Therefore, most drawing functions in this 3614f79002e58556798e86168c63e48d533287eda5Douglas Gregor * file have to flip Y coordinates. 37bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregor * 382bec0410d268779f601bd509e0302a500af7ac6aDouglas Gregor * Define USE_XSHM in the Makefile with -DUSE_XSHM if you want to compile 39ab41e63821dc60ad144d0684df8d79a9eef86b75Douglas Gregor * in support for the MIT Shared Memory extension. If enabled, when you 400a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor * use an Ximage for the back buffer in double buffered mode, the "swap" 4117fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregor * operation will be faster. You must also link with -lXext. 4217fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregor * 432596e429a61602312bdd149786045b8a90cd2d10Daniel Dunbar * Byte swapping: If the Mesa host and the X display use a different 442cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * byte order then there's some trickiness to be aware of when using 45fbfd180495e7800975c6d9bdc6d24e706ef70e34Michael J. Spencer * XImages. The byte ordering used for the XImage is that of the X 4614f79002e58556798e86168c63e48d533287eda5Douglas Gregor * display, not the Mesa host. 4703013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer * The color-to-pixel encoding for True/DirectColor must be done 48f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor * according to the display's visual red_mask, green_mask, and blue_mask. 493c304bd9ec2b4611572d4cbae9e1727bbecb5dc9Chris Lattner * If XPutPixel is used to put a pixel into an XImage then XPutPixel will 50cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor * do byte swapping if needed. If one wants to directly "poke" the pixel 51f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor * into the XImage's buffer then the pixel must be byte swapped first. In 522cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * Mesa, when byte swapping is needed we use the PF_TRUECOLOR pixel format 538538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl * and use XPutPixel everywhere except in the implementation of 542cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * glClear(GL_COLOR_BUFFER_BIT). We want this function to be fast so 55ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl * instead of using XPutPixel we "poke" our values after byte-swapping 565f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner * the clear pixel value if needed. 575f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner * 585f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner */ 596e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer 60ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl#ifdef __CYGWIN__ 616e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer#undef WIN32 626e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer#undef __WIN32__ 635f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner#endif 645f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner 656e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer#include "glxheader.h" 66ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl#include "GL/xmesa.h" 67ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl#include "xmesaP.h" 682cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "context.h" 692cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "extensions.h" 702cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "framebuffer.h" 7112b1c7615d4f9a2edc544be499f895f16ac100edChris Lattner#include "glthread.h" 722cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "imports.h" 733397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl#include "macros.h" 74a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl#include "renderbuffer.h" 7589eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis#include "swrast/swrast.h" 762cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "swrast_setup/swrast_setup.h" 772cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "vbo/vbo.h" 782cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "tnl/tnl.h" 798538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl#include "tnl/t_context.h" 802cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "tnl/t_pipeline.h" 8189eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis#include "drivers/common/driverfuncs.h" 828538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl 832cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor/** 842cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * Global X driver lock 852cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor */ 862cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor_glthread_Mutex _xmesa_lock; 872cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 882cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 892cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 902cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor/** 912cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * Lookup tables for HPCR pixel format: 922cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor */ 932cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregorstatic short hpcr_rgbTbl[3][256] = { 943397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl{ 952cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 962cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 30, 30, 31, 31, 972cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 32, 32, 33, 33, 34, 34, 35, 35, 36, 36, 37, 37, 38, 38, 39, 39, 983397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 992cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 1008538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 1012cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 1022cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 1033397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 1042cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 1058538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 1062cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 1072cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 1083397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 1091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 1108538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239 1112cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor}, 1122cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor{ 1133397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 114df1550fc59b51681d37225934fe4e3acac321621Richard Smith 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 30, 30, 31, 31, 115df1550fc59b51681d37225934fe4e3acac321621Richard Smith 32, 32, 33, 33, 34, 34, 35, 35, 36, 36, 37, 37, 38, 38, 39, 39, 1168538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 1172cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 1182cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 1193397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 120df1550fc59b51681d37225934fe4e3acac321621Richard Smith 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 1218538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 1222cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 1232cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 1243397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 1251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 1261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 1278538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 1282cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239 1292cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor}, 1303397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl{ 1312cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 32, 32, 33, 33, 34, 34, 35, 35, 36, 36, 37, 37, 38, 38, 39, 39, 1322cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 40, 40, 41, 41, 42, 42, 43, 43, 44, 44, 45, 45, 46, 46, 47, 47, 1330953e767ff7817f97b3ab20896b229891eeff45bJohn McCall 48, 48, 49, 49, 50, 50, 51, 51, 52, 52, 53, 53, 54, 54, 55, 55, 1342cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 56, 56, 57, 57, 58, 58, 59, 59, 60, 60, 61, 61, 62, 62, 63, 63, 1352cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 64, 64, 65, 65, 66, 66, 67, 67, 68, 68, 69, 69, 70, 70, 71, 71, 1363397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl 72, 72, 73, 73, 74, 74, 75, 75, 76, 76, 77, 77, 78, 78, 79, 79, 1372cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 80, 80, 81, 81, 82, 82, 83, 83, 84, 84, 85, 85, 86, 86, 87, 87, 1382cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 1398538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 1402cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 1412cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 1423397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 1432cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 1448538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 1452cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 1462cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223 1473397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl} 1482cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor}; 1497e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor 1507e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor 151c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor 1528538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl/**********************************************************************/ 1532cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor/***** X Utility Functions *****/ 1542cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor/**********************************************************************/ 1553397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl 1562cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 1572cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor/** 158e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson * Return the host's byte order as LSBFirst or MSBFirst ala X. 1598538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl */ 1602cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#ifndef XFree86Server 1612cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregorstatic int host_byte_order( void ) 1623397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl{ 1632cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor int i = 1; 1648538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl char *cptr = (char *) &i; 1652cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor return (*cptr==1) ? LSBFirst : MSBFirst; 1662cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor} 1673397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl#endif 1682cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 169264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola 170264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola/** 171a49218e17bcbb1acde0245773173e2c0c42f4f19Eli Friedman * Check if the X Shared Memory extension is available. 172425ef72306d4ff6b3698b744353e5f0e56b4b884Rafael Espindola * Return: 0 = not available 173ab8bbf4ebd3e3e6eab913cb044772a62b7581941Douglas Gregor * 1 = shared XImage support available 174264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola * 2 = shared Pixmap support available also 175f85e193739c953358c865005855253af4f68a497John McCall */ 1762cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregorstatic int check_for_xshm( XMesaDisplay *display ) 1772cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor{ 1783397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl#if defined(USE_XSHM) && !defined(XFree86Server) 1792cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor int major, minor, ignore; 1808538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl Bool pixmaps; 1812cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 1822cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor if (XQueryExtension( display, "MIT-SHM", &ignore, &ignore, &ignore )) { 1833397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl if (XShmQueryVersion( display, &major, &minor, &pixmaps )==True) { 1842cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor return (pixmaps==True) ? 2 : 1; 1852cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor } 1862cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor else { 1872cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor return 0; 1882cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor } 1892cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor } 190c938c1668b4fd12af154e965dd935a89e4801a70Douglas Gregor else { 19160618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl return 0; 19260618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl } 19360618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl#else 19460618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl /* No XSHM support */ 19560618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl return 0; 19660618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl#endif 19760618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl} 19860618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl 1998538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl 2002cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor/** 2012cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * Apply gamma correction to an intensity value in [0..max]. Return the 2023397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl * new intensity value. 203ed97649e9574b9d854fa4d6109c9333ae0993554John McCall */ 2048538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redlstatic GLint 205ed97649e9574b9d854fa4d6109c9333ae0993554John McCallgamma_adjust( GLfloat gamma, GLint value, GLint max ) 206ed97649e9574b9d854fa4d6109c9333ae0993554John McCall{ 2073397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl if (gamma == 1.0) { 2082cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor return value; 2099763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis } 2109763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis else { 2118538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl double x = (double) value / (double) max; 2122cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor return IROUND_POS((GLfloat) max * _mesa_pow(x, 1.0F/gamma)); 2132cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor } 2143397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl} 215c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor 2168538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl 2172cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 2182cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor/** 2193397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl * Return the true number of bits per pixel for XImages. 2202cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * For example, if we request a 24-bit deep visual we may actually need/get 2218538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl * 32bpp XImages. This function returns the appropriate bpp. 2222cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * Input: dpy - the X display 2232cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * visinfo - desribes the visual to be used for XImages 2243397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl * Return: true number of bits per pixel for XImages 225395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson */ 2268538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redlstatic int 227395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlssonbits_per_pixel( XMesaVisual xmv ) 228395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson{ 229ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt#ifdef XFree86Server 230ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt const int depth = xmv->nplanes; 231ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt int i; 232ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt assert(depth > 0); 233ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt for (i = 0; i < screenInfo.numPixmapFormats; i++) { 234ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt if (screenInfo.formats[i].depth == depth) 235ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt return screenInfo.formats[i].bitsPerPixel; 23634b41d939a1328f484511c6002ba2456db879a29Richard Smith } 23734b41d939a1328f484511c6002ba2456db879a29Richard Smith return depth; /* should never get here, but this should be safe */ 23834b41d939a1328f484511c6002ba2456db879a29Richard Smith#else 23934b41d939a1328f484511c6002ba2456db879a29Richard Smith XMesaDisplay *dpy = xmv->display; 24034b41d939a1328f484511c6002ba2456db879a29Richard Smith XMesaVisualInfo visinfo = xmv->visinfo; 2413397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl XMesaImage *img; 242be191100e034b23a3e13053757a57b7f5068c24aArgyrios Kyrtzidis int bitsPerPixel; 2432cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor /* Create a temporary XImage */ 2441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump img = XCreateImage( dpy, visinfo->visual, visinfo->depth, 2452cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor ZPixmap, 0, /*format, offset*/ 2462cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor (char*) MALLOC(8), /*data*/ 2472cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 1, 1, /*width, height*/ 2483397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl 32, /*bitmap_pad*/ 2492cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 0 /*bytes_per_line*/ 2508538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl ); 2512cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor assert(img); 2522cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor /* grab the bits/pixel value */ 2533397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl bitsPerPixel = img->bits_per_pixel; 2542cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor /* free the XImage */ 2558538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl _mesa_free( img->data ); 2562cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor img->data = NULL; 2572cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor XMesaDestroyImage( img ); 2589d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall return bitsPerPixel; 2599d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall#endif 2609d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall} 2619d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall 2629d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall 2639d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall 2649d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall/* 2651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump * Determine if a given X window ID is valid (window exists). 2663397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl * Do this by calling XGetWindowAttributes() for the window and 26749a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall * checking if we catch an X error. 26849a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall * Input: dpy - the display 26949a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall * win - the window to check for existance 2708538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl * Return: GL_TRUE - window exists 27149a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall * GL_FALSE - window doesn't exist 27249a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall */ 27349a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall#ifndef XFree86Server 274c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregorstatic GLboolean WindowExistsFlag; 275c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor 276c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregorstatic int window_exists_err_handler( XMesaDisplay* dpy, XErrorEvent* xerr ) 277c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor{ 278c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor (void) dpy; 279c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor if (xerr->error_code == BadWindow) { 280c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor WindowExistsFlag = GL_FALSE; 281c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor } 2823397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl return 0; 2832cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor} 284be191100e034b23a3e13053757a57b7f5068c24aArgyrios Kyrtzidis 28590b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidisstatic GLboolean window_exists( XMesaDisplay *dpy, Window win ) 28690b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis{ 28790b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis XWindowAttributes wa; 28890b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis int (*old_handler)( XMesaDisplay*, XErrorEvent* ); 28990b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis WindowExistsFlag = GL_TRUE; 2903e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith old_handler = XSetErrorHandler(window_exists_err_handler); 2913e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith XGetWindowAttributes( dpy, win, &wa ); /* dummy request */ 2929763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis XSetErrorHandler(old_handler); 2939763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis return WindowExistsFlag; 2948538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl} 29590b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis#endif 29690b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis 29790b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis 2983397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl 299ae8b17f1d5d303af53db5a4f4a375ea6b9356566Argyrios Kyrtzidis/** 300ae8b17f1d5d303af53db5a4f4a375ea6b9356566Argyrios Kyrtzidis * Return the size of the window (or pixmap) that corresponds to the 301ae8b17f1d5d303af53db5a4f4a375ea6b9356566Argyrios Kyrtzidis * given XMesaBuffer. 3028538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl * \param width returns width in pixels 30390b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis * \param height returns height in pixels 30490b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis */ 30590b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidisvoid 3063397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redlxmesa_get_window_size(XMesaDisplay *dpy, XMesaBuffer b, 30790b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis GLuint *width, GLuint *height) 30890b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis{ 30990b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis#ifdef XFree86Server 31090b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis *width = MIN2(b->frontxrb->drawable->width, MAX_WIDTH); 31190b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis *height = MIN2(b->frontxrb->drawable->height, MAX_HEIGHT); 31290b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis#else 3133397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl Window root; 31490b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis Status stat; 31590b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis int xpos, ypos; 31690b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis unsigned int w, h, bw, depth; 3174fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruth 3188538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl _glthread_LOCK_MUTEX(_xmesa_lock); 31990b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis XSync(b->xm_visual->display, 0); /* added for Chromium */ 32090b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis stat = XGetGeometry(dpy, b->frontxrb->pixmap, &root, &xpos, &ypos, 32190b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis &w, &h, &bw, &depth); 3223397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl _glthread_UNLOCK_MUTEX(_xmesa_lock); 3238dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis 3248dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis if (stat) { 3258dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis *width = w; 326f48d45e3e36c132bdee3373beec4e8b19ae3f9c4Argyrios Kyrtzidis *height = h; 327f48d45e3e36c132bdee3373beec4e8b19ae3f9c4Argyrios Kyrtzidis } 328f48d45e3e36c132bdee3373beec4e8b19ae3f9c4Argyrios Kyrtzidis else { 3298538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl /* probably querying a window that's recently been destroyed */ 33090b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis _mesa_warning(NULL, "XGetGeometry failed!\n"); 33190b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis *width = *height = 1; 33290b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis } 3333397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl#endif 33490b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis} 3353acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis 3363acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis 3373acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis 3383acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis/**********************************************************************/ 3393acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis/***** Linked list of XMesaBuffers *****/ 3403acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis/**********************************************************************/ 3413acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis 3428538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian RedlXMesaBuffer XMesaBufferList = NULL; 3432cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 3442cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 3457536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor/** 3467536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor * Allocate a new XMesaBuffer object which corresponds to the given drawable. 347cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor * Note that XMesaBuffer is derived from GLframebuffer. 348cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor * The new XMesaBuffer will not have any size (Width=Height=0). 349cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor * 350cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor * \param d the corresponding X drawable (window or pixmap) 3517536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor * \param type either WINDOW, PIXMAP or PBUFFER, describing d 3527536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor * \param vis the buffer's visual 3537536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor * \param cmap the window's colormap, if known. 354075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara * \return new XMesaBuffer or NULL if any problem 355075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara */ 356075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnarastatic XMesaBuffer 357075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnaracreate_xmesa_buffer(XMesaDrawable d, BufferType type, 358075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara XMesaVisual vis, XMesaColormap cmap) 3593397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl{ 360465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara XMesaBuffer b; 3613acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis 3623acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis ASSERT(type == WINDOW || type == PIXMAP || type == PBUFFER); 3638538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl 3642cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor b = (XMesaBuffer) CALLOC_STRUCT(xmesa_buffer); 3652cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor if (!b) 3663397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl return NULL; 3673cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall 36831f17ecbef57b5679c017c375db330546b7b5145John McCall b->display = vis->display; 3698538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl b->xm_visual = vis; 3703cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall b->type = type; 3713cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall b->cmap = cmap; 3723397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl 373deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor _mesa_initialize_framebuffer(&b->mesa_buffer, &vis->mesa_visual); 3748538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl b->mesa_buffer.Delete = xmesa_delete_framebuffer; 375c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall 376c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall /* 3773397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl * Front renderbuffer 378c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall */ 3792cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor b->frontxrb = xmesa_new_renderbuffer(NULL, 0, &vis->mesa_visual, GL_FALSE); 380c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (!b->frontxrb) { 381446ee4eb4fc4c705a59365252df7a5c253daafa1Steve Naroff _mesa_free(b); 382446ee4eb4fc4c705a59365252df7a5c253daafa1Steve Naroff return NULL; 3838538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl } 3842cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor b->frontxrb->Parent = b; 3852cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor b->frontxrb->drawable = d; 386d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff b->frontxrb->pixmap = (XMesaPixmap) d; 3873397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl _mesa_add_renderbuffer(&b->mesa_buffer, BUFFER_FRONT_LEFT, 3881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump &b->frontxrb->Base); 3898538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl 3902cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor /* 3912cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * Back renderbuffer 392a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall */ 393a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall if (vis->mesa_visual.doubleBufferMode) { 394a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall b->backxrb = xmesa_new_renderbuffer(NULL, 0, &vis->mesa_visual, GL_TRUE); 395a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl if (!b->backxrb) { 39689eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis /* XXX free front xrb too */ 397a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall _mesa_free(b); 398a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall return NULL; 39989eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis } 400a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall b->backxrb->Parent = b; 401a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall /* determine back buffer implementation */ 40251bd803fbdade51d674598ed45da3d54190a656cJohn McCall b->db_mode = vis->ximage_flag ? BACK_XIMAGE : BACK_PIXMAP; 403a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall 40451bd803fbdade51d674598ed45da3d54190a656cJohn McCall _mesa_add_renderbuffer(&b->mesa_buffer, BUFFER_BACK_LEFT, 405a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall &b->backxrb->Base); 406a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall } 40751bd803fbdade51d674598ed45da3d54190a656cJohn McCall 40851bd803fbdade51d674598ed45da3d54190a656cJohn McCall /* 409a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall * Software alpha planes 410a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall */ 411a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall if (vis->mesa_visual.alphaBits > 0 412a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall && vis->undithered_pf != PF_8A8B8G8R 41351bd803fbdade51d674598ed45da3d54190a656cJohn McCall && vis->undithered_pf != PF_8A8R8G8B) { 41451bd803fbdade51d674598ed45da3d54190a656cJohn McCall /* Visual has alpha, but pixel format doesn't support it. 41551bd803fbdade51d674598ed45da3d54190a656cJohn McCall * We'll use an alpha renderbuffer wrapper. 41651bd803fbdade51d674598ed45da3d54190a656cJohn McCall */ 417ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor b->swAlpha = GL_TRUE; 418ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor } 419ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor else { 420ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor b->swAlpha = GL_FALSE; 421ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor } 422ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor 423ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor /* 42451bd803fbdade51d674598ed45da3d54190a656cJohn McCall * Other renderbuffer (depth, stencil, etc) 42551bd803fbdade51d674598ed45da3d54190a656cJohn McCall */ 42651bd803fbdade51d674598ed45da3d54190a656cJohn McCall _mesa_add_soft_renderbuffers(&b->mesa_buffer, 42751bd803fbdade51d674598ed45da3d54190a656cJohn McCall GL_FALSE, /* color */ 42851bd803fbdade51d674598ed45da3d54190a656cJohn McCall vis->mesa_visual.haveDepthBuffer, 42951bd803fbdade51d674598ed45da3d54190a656cJohn McCall vis->mesa_visual.haveStencilBuffer, 43051bd803fbdade51d674598ed45da3d54190a656cJohn McCall vis->mesa_visual.haveAccumBuffer, 43151bd803fbdade51d674598ed45da3d54190a656cJohn McCall b->swAlpha, 43251bd803fbdade51d674598ed45da3d54190a656cJohn McCall vis->mesa_visual.numAuxBuffers > 0 ); 43351bd803fbdade51d674598ed45da3d54190a656cJohn McCall 43451bd803fbdade51d674598ed45da3d54190a656cJohn McCall /* insert buffer into linked list */ 43551bd803fbdade51d674598ed45da3d54190a656cJohn McCall b->Next = XMesaBufferList; 43651bd803fbdade51d674598ed45da3d54190a656cJohn McCall XMesaBufferList = b; 43751bd803fbdade51d674598ed45da3d54190a656cJohn McCall 43851bd803fbdade51d674598ed45da3d54190a656cJohn McCall return b; 43951bd803fbdade51d674598ed45da3d54190a656cJohn McCall} 44051bd803fbdade51d674598ed45da3d54190a656cJohn McCall 44151bd803fbdade51d674598ed45da3d54190a656cJohn McCall 442b6ab6c1ca733fda2302a1c5066bdfc6218c89e41Abramo Bagnara/** 44351bd803fbdade51d674598ed45da3d54190a656cJohn McCall * Find an XMesaBuffer by matching X display and colormap but NOT matching 44451bd803fbdade51d674598ed45da3d54190a656cJohn McCall * the notThis buffer. 44551bd803fbdade51d674598ed45da3d54190a656cJohn McCall */ 44651bd803fbdade51d674598ed45da3d54190a656cJohn McCallXMesaBuffer 44751bd803fbdade51d674598ed45da3d54190a656cJohn McCallxmesa_find_buffer(XMesaDisplay *dpy, XMesaColormap cmap, XMesaBuffer notThis) 44851bd803fbdade51d674598ed45da3d54190a656cJohn McCall{ 44951bd803fbdade51d674598ed45da3d54190a656cJohn McCall XMesaBuffer b; 45051bd803fbdade51d674598ed45da3d54190a656cJohn McCall for (b=XMesaBufferList; b; b=b->Next) { 45151bd803fbdade51d674598ed45da3d54190a656cJohn McCall if (b->display==dpy && b->cmap==cmap && b!=notThis) { 45251bd803fbdade51d674598ed45da3d54190a656cJohn McCall return b; 45351bd803fbdade51d674598ed45da3d54190a656cJohn McCall } 45451bd803fbdade51d674598ed45da3d54190a656cJohn McCall } 45551bd803fbdade51d674598ed45da3d54190a656cJohn McCall return NULL; 45651bd803fbdade51d674598ed45da3d54190a656cJohn McCall} 45751bd803fbdade51d674598ed45da3d54190a656cJohn McCall 45851bd803fbdade51d674598ed45da3d54190a656cJohn McCall 45951bd803fbdade51d674598ed45da3d54190a656cJohn McCall/** 46051bd803fbdade51d674598ed45da3d54190a656cJohn McCall * Remove buffer from linked list, delete if no longer referenced. 46151bd803fbdade51d674598ed45da3d54190a656cJohn McCall */ 46251bd803fbdade51d674598ed45da3d54190a656cJohn McCallstatic void 46351bd803fbdade51d674598ed45da3d54190a656cJohn McCallxmesa_free_buffer(XMesaBuffer buffer) 46451bd803fbdade51d674598ed45da3d54190a656cJohn McCall{ 46551bd803fbdade51d674598ed45da3d54190a656cJohn McCall XMesaBuffer prev = NULL, b; 46651bd803fbdade51d674598ed45da3d54190a656cJohn McCall 46751bd803fbdade51d674598ed45da3d54190a656cJohn McCall for (b = XMesaBufferList; b; b = b->Next) { 46851bd803fbdade51d674598ed45da3d54190a656cJohn McCall if (b == buffer) { 46951bd803fbdade51d674598ed45da3d54190a656cJohn McCall struct gl_framebuffer *fb = &buffer->mesa_buffer; 47051bd803fbdade51d674598ed45da3d54190a656cJohn McCall 47151bd803fbdade51d674598ed45da3d54190a656cJohn McCall /* unlink buffer from list */ 47251bd803fbdade51d674598ed45da3d54190a656cJohn McCall if (prev) 47351bd803fbdade51d674598ed45da3d54190a656cJohn McCall prev->Next = buffer->Next; 47451bd803fbdade51d674598ed45da3d54190a656cJohn McCall else 475796aa443ab5ed036f42ef33fed629e1b4b34871bAbramo Bagnara XMesaBufferList = buffer->Next; 476796aa443ab5ed036f42ef33fed629e1b4b34871bAbramo Bagnara 477dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor /* mark as delete pending */ 47851bd803fbdade51d674598ed45da3d54190a656cJohn McCall fb->DeletePending = GL_TRUE; 47951bd803fbdade51d674598ed45da3d54190a656cJohn McCall 48051bd803fbdade51d674598ed45da3d54190a656cJohn McCall /* Since the X window for the XMesaBuffer is going away, we don't 48151bd803fbdade51d674598ed45da3d54190a656cJohn McCall * want to dereference this pointer in the future. 48251bd803fbdade51d674598ed45da3d54190a656cJohn McCall */ 48351bd803fbdade51d674598ed45da3d54190a656cJohn McCall b->frontxrb->drawable = 0; 48451bd803fbdade51d674598ed45da3d54190a656cJohn McCall 48551bd803fbdade51d674598ed45da3d54190a656cJohn McCall /* Unreference. If count = zero we'll really delete the buffer */ 48651bd803fbdade51d674598ed45da3d54190a656cJohn McCall _mesa_unreference_framebuffer(&fb); 487ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 488ed97649e9574b9d854fa4d6109c9333ae0993554John McCall return; 489ed97649e9574b9d854fa4d6109c9333ae0993554John McCall } 49051bd803fbdade51d674598ed45da3d54190a656cJohn McCall /* continue search */ 49151bd803fbdade51d674598ed45da3d54190a656cJohn McCall prev = b; 49251bd803fbdade51d674598ed45da3d54190a656cJohn McCall } 49351bd803fbdade51d674598ed45da3d54190a656cJohn McCall /* buffer not found in XMesaBufferList */ 494cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall _mesa_problem(NULL,"xmesa_free_buffer() - buffer not found\n"); 495cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall} 496cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall 49751bd803fbdade51d674598ed45da3d54190a656cJohn McCall 49851bd803fbdade51d674598ed45da3d54190a656cJohn McCall/** 499cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall * Copy X color table stuff from one XMesaBuffer to another. 500cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall */ 501cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCallstatic void 502cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCallcopy_colortable_info(XMesaBuffer dst, const XMesaBuffer src) 50351bd803fbdade51d674598ed45da3d54190a656cJohn McCall{ 50451bd803fbdade51d674598ed45da3d54190a656cJohn McCall MEMCPY(dst->color_table, src->color_table, sizeof(src->color_table)); 50551bd803fbdade51d674598ed45da3d54190a656cJohn McCall MEMCPY(dst->pixel_to_r, src->pixel_to_r, sizeof(src->pixel_to_r)); 506a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall MEMCPY(dst->pixel_to_g, src->pixel_to_g, sizeof(src->pixel_to_g)); 507ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt MEMCPY(dst->pixel_to_b, src->pixel_to_b, sizeof(src->pixel_to_b)); 508ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt dst->num_alloced = src->num_alloced; 509ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt MEMCPY(dst->alloced_colors, src->alloced_colors, 510ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt sizeof(src->alloced_colors)); 511ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt} 512ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt 51334b41d939a1328f484511c6002ba2456db879a29Richard Smith 51434b41d939a1328f484511c6002ba2456db879a29Richard Smith 51534b41d939a1328f484511c6002ba2456db879a29Richard Smith/**********************************************************************/ 51651bd803fbdade51d674598ed45da3d54190a656cJohn McCall/***** Misc Private Functions *****/ 51751bd803fbdade51d674598ed45da3d54190a656cJohn McCall/**********************************************************************/ 518a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall 51951bd803fbdade51d674598ed45da3d54190a656cJohn McCall 52051bd803fbdade51d674598ed45da3d54190a656cJohn McCall/** 521a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall * A replacement for XAllocColor. This function should never 5229d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall * fail to allocate a color. When XAllocColor fails, we return 5239d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall * the nearest matching color. If we have to allocate many colors 5249d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall * this function isn't too efficient; the XQueryColors() could be 5259d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall * done just once. 5269d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall * Written by Michael Pichler, Brian Paul, Mark Kilgard 5279d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall * Input: dpy - X display 5289d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall * cmap - X colormap 5299d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall * cmapSize - size of colormap 5309d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall * In/Out: color - the XColor struct 5319d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall * Output: exact - 1=exact color match, 0=closest match 5329d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall * alloced - 1=XAlloc worked, 0=XAlloc failed 5339d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall */ 5349d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCallstatic void 5359d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCallnoFaultXAllocColor( int client, 5369d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall XMesaDisplay *dpy, 53751bd803fbdade51d674598ed45da3d54190a656cJohn McCall XMesaColormap cmap, 53851bd803fbdade51d674598ed45da3d54190a656cJohn McCall int cmapSize, 539a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall XMesaColor *color, 54049a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall int *exact, int *alloced ) 54149a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall{ 54249a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall#ifdef XFree86Server 54349a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall Pixel *ppixIn; 544c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor xrgb *ctable; 545c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor#else 546c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor /* we'll try to cache ctable for better remote display performance */ 547c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor static Display *prevDisplay = NULL; 54851bd803fbdade51d674598ed45da3d54190a656cJohn McCall static XMesaColormap prevCmap = 0; 54951bd803fbdade51d674598ed45da3d54190a656cJohn McCall static int prevCmapSize = 0; 550833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall static XMesaColor *ctable = NULL; 551833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall#endif 552833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall XMesaColor subColor; 553833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall int i, bestmatch; 55444f8c37e378f716e8cbb600e3800f437cf58f9e5Argyrios Kyrtzidis double mindist; /* 3*2^16^2 exceeds long int precision. */ 55544f8c37e378f716e8cbb600e3800f437cf58f9e5Argyrios Kyrtzidis 556a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall (void) client; 557075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara 558075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara /* First try just using XAllocColor. */ 559075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara#ifdef XFree86Server 560075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara if (AllocColor(cmap, 561465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara &color->red, &color->green, &color->blue, 562e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara &color->pixel, 5639e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor client) == Success) 564a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall#else 5653cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall if (XAllocColor(dpy, cmap, color)) 5663cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall#endif 5673cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall { 5684714c12a1ab759156b78be8f109ea4c12213af57Douglas Gregor *exact = 1; 569e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara *alloced = 1; 5702494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor return; 57151bd803fbdade51d674598ed45da3d54190a656cJohn McCall } 572a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall 57333500955d731c73717af52088b7fc0e7a85681e7John McCall /* Alloc failed, search for closest match */ 57433500955d731c73717af52088b7fc0e7a85681e7John McCall 57533500955d731c73717af52088b7fc0e7a85681e7John McCall /* Retrieve color table entries. */ 57694fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor /* XXX alloca candidate. */ 57733500955d731c73717af52088b7fc0e7a85681e7John McCall#ifdef XFree86Server 57833500955d731c73717af52088b7fc0e7a85681e7John McCall ppixIn = (Pixel *) MALLOC(cmapSize * sizeof(Pixel)); 57933500955d731c73717af52088b7fc0e7a85681e7John McCall ctable = (xrgb *) MALLOC(cmapSize * sizeof(xrgb)); 58033500955d731c73717af52088b7fc0e7a85681e7John McCall for (i = 0; i < cmapSize; i++) { 58144f8c37e378f716e8cbb600e3800f437cf58f9e5Argyrios Kyrtzidis ppixIn[i] = i; 58244f8c37e378f716e8cbb600e3800f437cf58f9e5Argyrios Kyrtzidis } 58333500955d731c73717af52088b7fc0e7a85681e7John McCall QueryColors(cmap, cmapSize, ppixIn, ctable); 5847536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor#else 5857536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor if (prevDisplay != dpy || prevCmap != cmap 5867536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor || prevCmapSize != cmapSize || !ctable) { 58751bd803fbdade51d674598ed45da3d54190a656cJohn McCall /* free previously cached color table */ 58851bd803fbdade51d674598ed45da3d54190a656cJohn McCall if (ctable) 589c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall _mesa_free(ctable); 590c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall /* Get the color table from X */ 591c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall ctable = (XMesaColor *) MALLOC(cmapSize * sizeof(XMesaColor)); 59254e14c4db764c0636160d26c5bbf491637c83a76John McCall assert(ctable); 59354e14c4db764c0636160d26c5bbf491637c83a76John McCall for (i = 0; i < cmapSize; i++) { 59454e14c4db764c0636160d26c5bbf491637c83a76John McCall ctable[i].pixel = i; 59554e14c4db764c0636160d26c5bbf491637c83a76John McCall } 596a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall XQueryColors(dpy, cmap, ctable, cmapSize); 59751bd803fbdade51d674598ed45da3d54190a656cJohn McCall prevDisplay = dpy; 59851bd803fbdade51d674598ed45da3d54190a656cJohn McCall prevCmap = cmap; 599a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall prevCmapSize = cmapSize; 600a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall } 6014dcf151a555ff51e4d643e8e6eeb80f121d11d1bChris Lattner#endif 602a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl 6032cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor /* Find best match. */ 6042cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor bestmatch = -1; 605b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner mindist = 0.0; 606b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner for (i = 0; i < cmapSize; i++) { 60789eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis double dr = 0.30 * ((double) color->red - (double) ctable[i].red); 608b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner double dg = 0.59 * ((double) color->green - (double) ctable[i].green); 609b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner double db = 0.11 * ((double) color->blue - (double) ctable[i].blue); 610b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner double dist = dr * dr + dg * dg + db * db; 611b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner if (bestmatch < 0 || dist < mindist) { 612b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner bestmatch = i; 613b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner mindist = dist; 614b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner } 615b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner } 616b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner 617b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner /* Return result. */ 618b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner subColor.red = ctable[bestmatch].red; 619b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner subColor.green = ctable[bestmatch].green; 620b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner subColor.blue = ctable[bestmatch].blue; 621b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner /* Try to allocate the closest match color. This should only 62289eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis * fail if the cell is read/write. Otherwise, we're incrementing 623b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner * the cell's reference count. 624b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner */ 625b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner#ifdef XFree86Server 626b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner if (AllocColor(cmap, 627b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner &subColor.red, &subColor.green, &subColor.blue, 6280558df2da807646e65d4fa290f4e92114af1a746Chris Lattner &subColor.pixel, 6290558df2da807646e65d4fa290f4e92114af1a746Chris Lattner client) == Success) { 6300558df2da807646e65d4fa290f4e92114af1a746Chris Lattner#else 63189eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis if (XAllocColor(dpy, cmap, &subColor)) { 6328538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl#endif 6330558df2da807646e65d4fa290f4e92114af1a746Chris Lattner *alloced = 1; 6340558df2da807646e65d4fa290f4e92114af1a746Chris Lattner } 6350558df2da807646e65d4fa290f4e92114af1a746Chris Lattner else { 6360558df2da807646e65d4fa290f4e92114af1a746Chris Lattner /* do this to work around a problem reported by Frank Ortega */ 6370558df2da807646e65d4fa290f4e92114af1a746Chris Lattner subColor.pixel = (unsigned long) bestmatch; 6380558df2da807646e65d4fa290f4e92114af1a746Chris Lattner subColor.red = ctable[bestmatch].red; 6390558df2da807646e65d4fa290f4e92114af1a746Chris Lattner subColor.green = ctable[bestmatch].green; 6400558df2da807646e65d4fa290f4e92114af1a746Chris Lattner subColor.blue = ctable[bestmatch].blue; 6410558df2da807646e65d4fa290f4e92114af1a746Chris Lattner subColor.flags = DoRed | DoGreen | DoBlue; 6420558df2da807646e65d4fa290f4e92114af1a746Chris Lattner *alloced = 0; 6430558df2da807646e65d4fa290f4e92114af1a746Chris Lattner } 6440558df2da807646e65d4fa290f4e92114af1a746Chris Lattner#ifdef XFree86Server 6450558df2da807646e65d4fa290f4e92114af1a746Chris Lattner _mesa_free(ppixIn); 6460558df2da807646e65d4fa290f4e92114af1a746Chris Lattner _mesa_free(ctable); 6470558df2da807646e65d4fa290f4e92114af1a746Chris Lattner#else 6480558df2da807646e65d4fa290f4e92114af1a746Chris Lattner /* don't free table, save it for next time */ 6490558df2da807646e65d4fa290f4e92114af1a746Chris Lattner#endif 6500558df2da807646e65d4fa290f4e92114af1a746Chris Lattner 6510558df2da807646e65d4fa290f4e92114af1a746Chris Lattner *color = subColor; 6520558df2da807646e65d4fa290f4e92114af1a746Chris Lattner *exact = 0; 6530558df2da807646e65d4fa290f4e92114af1a746Chris Lattner} 6540558df2da807646e65d4fa290f4e92114af1a746Chris Lattner 6550558df2da807646e65d4fa290f4e92114af1a746Chris Lattner 6560558df2da807646e65d4fa290f4e92114af1a746Chris Lattner 6570558df2da807646e65d4fa290f4e92114af1a746Chris Lattner/** 6580558df2da807646e65d4fa290f4e92114af1a746Chris Lattner * Do setup for PF_GRAYSCALE pixel format. 6590558df2da807646e65d4fa290f4e92114af1a746Chris Lattner * Note that buffer may be NULL. 6600558df2da807646e65d4fa290f4e92114af1a746Chris Lattner */ 6610558df2da807646e65d4fa290f4e92114af1a746Chris Lattnerstatic GLboolean 6620558df2da807646e65d4fa290f4e92114af1a746Chris Lattnersetup_grayscale(int client, XMesaVisual v, 6630558df2da807646e65d4fa290f4e92114af1a746Chris Lattner XMesaBuffer buffer, XMesaColormap cmap) 6640558df2da807646e65d4fa290f4e92114af1a746Chris Lattner{ 6650558df2da807646e65d4fa290f4e92114af1a746Chris Lattner if (GET_VISUAL_DEPTH(v)<4 || GET_VISUAL_DEPTH(v)>16) { 6660558df2da807646e65d4fa290f4e92114af1a746Chris Lattner return GL_FALSE; 6670558df2da807646e65d4fa290f4e92114af1a746Chris Lattner } 6680558df2da807646e65d4fa290f4e92114af1a746Chris Lattner 6690558df2da807646e65d4fa290f4e92114af1a746Chris Lattner if (buffer) { 6700558df2da807646e65d4fa290f4e92114af1a746Chris Lattner XMesaBuffer prevBuffer; 6710558df2da807646e65d4fa290f4e92114af1a746Chris Lattner 6720558df2da807646e65d4fa290f4e92114af1a746Chris Lattner if (!cmap) { 6730558df2da807646e65d4fa290f4e92114af1a746Chris Lattner return GL_FALSE; 6740558df2da807646e65d4fa290f4e92114af1a746Chris Lattner } 6750558df2da807646e65d4fa290f4e92114af1a746Chris Lattner 6760558df2da807646e65d4fa290f4e92114af1a746Chris Lattner prevBuffer = xmesa_find_buffer(v->display, cmap, buffer); 6770558df2da807646e65d4fa290f4e92114af1a746Chris Lattner if (prevBuffer && 6780558df2da807646e65d4fa290f4e92114af1a746Chris Lattner (buffer->xm_visual->mesa_visual.rgbMode == 6790558df2da807646e65d4fa290f4e92114af1a746Chris Lattner prevBuffer->xm_visual->mesa_visual.rgbMode)) { 6800558df2da807646e65d4fa290f4e92114af1a746Chris Lattner /* Copy colormap stuff from previous XMesaBuffer which uses same 6810558df2da807646e65d4fa290f4e92114af1a746Chris Lattner * X colormap. Do this to avoid time spent in noFaultXAllocColor. 6820558df2da807646e65d4fa290f4e92114af1a746Chris Lattner */ 683f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne copy_colortable_info(buffer, prevBuffer); 6840558df2da807646e65d4fa290f4e92114af1a746Chris Lattner } 6850558df2da807646e65d4fa290f4e92114af1a746Chris Lattner else { 6860558df2da807646e65d4fa290f4e92114af1a746Chris Lattner /* Allocate 256 shades of gray */ 6870558df2da807646e65d4fa290f4e92114af1a746Chris Lattner int gray; 6880558df2da807646e65d4fa290f4e92114af1a746Chris Lattner int colorsfailed = 0; 6890558df2da807646e65d4fa290f4e92114af1a746Chris Lattner for (gray=0;gray<256;gray++) { 6900558df2da807646e65d4fa290f4e92114af1a746Chris Lattner GLint r = gamma_adjust( v->RedGamma, gray, 255 ); 6910558df2da807646e65d4fa290f4e92114af1a746Chris Lattner GLint g = gamma_adjust( v->GreenGamma, gray, 255 ); 6920558df2da807646e65d4fa290f4e92114af1a746Chris Lattner GLint b = gamma_adjust( v->BlueGamma, gray, 255 ); 6930558df2da807646e65d4fa290f4e92114af1a746Chris Lattner int exact, alloced; 6940558df2da807646e65d4fa290f4e92114af1a746Chris Lattner XMesaColor xcol; 6950558df2da807646e65d4fa290f4e92114af1a746Chris Lattner xcol.red = (r << 8) | r; 6960558df2da807646e65d4fa290f4e92114af1a746Chris Lattner xcol.green = (g << 8) | g; 6970558df2da807646e65d4fa290f4e92114af1a746Chris Lattner xcol.blue = (b << 8) | b; 698eb7f96141f754150a92433286fa385910a22f494Sam Weinig noFaultXAllocColor( client, v->display, 699eb7f96141f754150a92433286fa385910a22f494Sam Weinig cmap, GET_COLORMAP_SIZE(v), 700eb7f96141f754150a92433286fa385910a22f494Sam Weinig &xcol, &exact, &alloced ); 701eb7f96141f754150a92433286fa385910a22f494Sam Weinig if (!exact) { 702eb7f96141f754150a92433286fa385910a22f494Sam Weinig colorsfailed++; 703eb7f96141f754150a92433286fa385910a22f494Sam Weinig } 704eb7f96141f754150a92433286fa385910a22f494Sam Weinig if (alloced) { 705eb7f96141f754150a92433286fa385910a22f494Sam Weinig assert(buffer->num_alloced<256); 706eb7f96141f754150a92433286fa385910a22f494Sam Weinig buffer->alloced_colors[buffer->num_alloced] = xcol.pixel; 707b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor buffer->num_alloced++; 708b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor } 709b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor 710b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor /*OLD 711b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor assert(gray < 576); 712b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor buffer->color_table[gray*3+0] = xcol.pixel; 713b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor buffer->color_table[gray*3+1] = xcol.pixel; 714b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor buffer->color_table[gray*3+2] = xcol.pixel; 715b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor assert(xcol.pixel < 65536); 716b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor buffer->pixel_to_r[xcol.pixel] = gray * 30 / 100; 717b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor buffer->pixel_to_g[xcol.pixel] = gray * 59 / 100; 718b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor buffer->pixel_to_b[xcol.pixel] = gray * 11 / 100; 719b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor */ 720b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor buffer->color_table[gray] = xcol.pixel; 721b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor assert(xcol.pixel < 65536); 722b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor buffer->pixel_to_r[xcol.pixel] = gray; 723b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor buffer->pixel_to_g[xcol.pixel] = gray; 724b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor buffer->pixel_to_b[xcol.pixel] = gray; 725b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor } 726b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor 727b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor if (colorsfailed && _mesa_getenv("MESA_DEBUG")) { 728b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor _mesa_warning(NULL, 729b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor "Note: %d out of 256 needed colors do not match exactly.\n", 730b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor colorsfailed ); 731b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor } 732e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne } 7330558df2da807646e65d4fa290f4e92114af1a746Chris Lattner } 734b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner 7351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump v->dithered_pf = PF_Grayscale; 736a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl v->undithered_pf = PF_Grayscale; 737b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner return GL_TRUE; 738b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner} 7391eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7408538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl 7418538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl 7421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/** 7433397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl * Setup RGB rendering for a window with a PseudoColor, StaticColor, 744f29f0a28c4d9599b389bbb6d186e14af753dc5a3Sebastian Redl * or 8-bit TrueColor visual visual. We try to allocate a palette of 225 74551e774d42269e3b22d746184c0b9076fc13b32e6Zhongxing Xu * colors (5 red, 9 green, 5 blue) and dither to approximate a 24-bit RGB 74631d375f056447d4e2418275d4913661d3bfedb3eDouglas Gregor * color. While this function was originally designed just for 8-bit 747b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner * visuals, it has also proven to work from 4-bit up to 16-bit visuals. 748b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner * Dithering code contributed by Bob Mercier. 749b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner */ 750ab41e63821dc60ad144d0684df8d79a9eef86b75Douglas Gregorstatic GLboolean 751b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattnersetup_dithered_color(int client, XMesaVisual v, 752b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner XMesaBuffer buffer, XMesaColormap cmap) 753b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner{ 754b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner if (GET_VISUAL_DEPTH(v)<4 || GET_VISUAL_DEPTH(v)>16) { 755b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner return GL_FALSE; 756b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner } 75749b96d1a382ae9f31456166f1a734d3f7f30b992Argyrios Kyrtzidis 758b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner if (buffer) { 759b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner XMesaBuffer prevBuffer; 760b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner 761b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner if (!cmap) { 7627f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor return GL_FALSE; 7637f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor } 7644fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor 765b81c17092039f39be60e9656a37cffbdf2e2c783Douglas Gregor prevBuffer = xmesa_find_buffer(v->display, cmap, buffer); 7665b4ec636637c9d876102240127cc0dca9280e83aTed Kremenek if (prevBuffer && 7676a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor (buffer->xm_visual->mesa_visual.rgbMode == 768a93e3b5bde9f0a7b59215f19f176f7d69881b81cSebastian Redl prevBuffer->xm_visual->mesa_visual.rgbMode)) { 769320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian /* Copy colormap stuff from previous, matching XMesaBuffer. 770b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor * Do this to avoid time spent in noFaultXAllocColor. 771b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor */ 772b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor copy_colortable_info(buffer, prevBuffer); 773b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor } 774b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor else { 775b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor /* Allocate X colors and initialize color_table[], red_table[], etc */ 776b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor int r, g, b, i; 777b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor int colorsfailed = 0; 778b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor for (r = 0; r < DITH_R; r++) { 779b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor for (g = 0; g < DITH_G; g++) { 780b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor for (b = 0; b < DITH_B; b++) { 78184bccea1ad9fd8bc1f4ec3d1fc5dd8d15dabffbcPeter Collingbourne XMesaColor xcol; 782cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor int exact, alloced; 783837593fec8389eea3143920d7f2180b079b609e8Douglas Gregor xcol.red =gamma_adjust(v->RedGamma, r*65535/(DITH_R-1),65535); 78484bccea1ad9fd8bc1f4ec3d1fc5dd8d15dabffbcPeter Collingbourne xcol.green=gamma_adjust(v->GreenGamma, g*65535/(DITH_G-1),65535); 78584bccea1ad9fd8bc1f4ec3d1fc5dd8d15dabffbcPeter Collingbourne xcol.blue =gamma_adjust(v->BlueGamma, b*65535/(DITH_B-1),65535); 786ebcbe1d3dc7d4f0c1f540a632fa0684dd0a857d5Sean Hunt noFaultXAllocColor( client, v->display, 787d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor cmap, GET_COLORMAP_SIZE(v), 788d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor &xcol, &exact, &alloced ); 789837593fec8389eea3143920d7f2180b079b609e8Douglas Gregor if (!exact) { 790837593fec8389eea3143920d7f2180b079b609e8Douglas Gregor colorsfailed++; 791cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor } 792b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner if (alloced) { 7932f4efd10c805cb779618c1a22a35eb07b5043c4eChris Lattner assert(buffer->num_alloced<256); 794b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner buffer->alloced_colors[buffer->num_alloced] = xcol.pixel; 795b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner buffer->num_alloced++; 796b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner } 797f70d12dbd49fcc25f1dfc0127217112ae76bcb8fChandler Carruth i = DITH_MIX( r, g, b ); 7981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump assert(i < 576); 799b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner buffer->color_table[i] = xcol.pixel; 8002f4efd10c805cb779618c1a22a35eb07b5043c4eChris Lattner assert(xcol.pixel < 65536); 801b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner buffer->pixel_to_r[xcol.pixel] = r * 255 / (DITH_R-1); 802b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner buffer->pixel_to_g[xcol.pixel] = g * 255 / (DITH_G-1); 803b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner buffer->pixel_to_b[xcol.pixel] = b * 255 / (DITH_B-1); 804b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor } 80561d60ee6aa0a5ded0ddcf48679673b37506a1895Douglas Gregor } 80661d60ee6aa0a5ded0ddcf48679673b37506a1895Douglas Gregor } 807b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner 808b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner if (colorsfailed && _mesa_getenv("MESA_DEBUG")) { 809b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner _mesa_warning(NULL, 810b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner "Note: %d out of %d needed colors do not match exactly.\n", 811b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner colorsfailed, DITH_R * DITH_G * DITH_B ); 812b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner } 813b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner } 814b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner } 815b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner 816b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner v->dithered_pf = PF_Dither; 817b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner v->undithered_pf = PF_Lookup; 818b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner return GL_TRUE; 819b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner} 820b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner 821b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner 822b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner/** 823b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner * Setup for Hewlett Packard Color Recovery 8-bit TrueColor mode. 824b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner * HPCR simulates 24-bit color fidelity with an 8-bit frame buffer. 825b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner * Special dithering tables have to be initialized. 826b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner */ 827a53d2cbe37e4be0d95b9d3e09f74eafae31fc940John McCallstatic void 828d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroffsetup_8bit_hpcr(XMesaVisual v) 829b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor{ 830b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor /* HP Color Recovery contributed by: Alex De Bruyn (ad@lms.be) 831b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor * To work properly, the atom _HP_RGB_SMOOTH_MAP_LIST must be defined 832b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor * on the root window AND the colormap obtainable by XGetRGBColormaps 833b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor * for that atom must be set on the window. (see also tkInitWindow) 834b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor * If that colormap is not set, the output will look stripy. 835b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor */ 836b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor 837b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor /* Setup color tables with gamma correction */ 838b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor int i; 839b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor double g; 840b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor 841b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor g = 1.0 / v->RedGamma; 842b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor for (i=0; i<256; i++) { 843b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor GLint red = IROUND_POS(255.0 * _mesa_pow( hpcr_rgbTbl[0][i]/255.0, g )); 8440ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner v->hpcr_rgbTbl[0][i] = CLAMP( red, 16, 239 ); 8450ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner } 8460ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner 8470ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner g = 1.0 / v->GreenGamma; 8480ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner for (i=0; i<256; i++) { 8490ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner GLint green = IROUND_POS(255.0 * _mesa_pow( hpcr_rgbTbl[1][i]/255.0, g )); 8500ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner v->hpcr_rgbTbl[1][i] = CLAMP( green, 16, 239 ); 8510ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner } 8520ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner 8530ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner g = 1.0 / v->BlueGamma; 8540ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner for (i=0; i<256; i++) { 8550ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner GLint blue = IROUND_POS(255.0 * _mesa_pow( hpcr_rgbTbl[2][i]/255.0, g )); 8560ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner v->hpcr_rgbTbl[2][i] = CLAMP( blue, 32, 223 ); 8570ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner } 8580ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner v->undithered_pf = PF_HPCR; /* can't really disable dithering for now */ 8590ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner v->dithered_pf = PF_HPCR; 8600ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner 8610ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner /* which method should I use to clear */ 862b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner /* GL_FALSE: keep the ordinary method */ 863b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner /* GL_TRUE : clear with dither pattern */ 8640ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner v->hpcr_clear_flag = _mesa_getenv("MESA_HPCR_CLEAR") ? GL_TRUE : GL_FALSE; 865b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner 8660ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner if (v->hpcr_clear_flag) { 8670ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner v->hpcr_clear_pixmap = XMesaCreatePixmap(v->display, 8680ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner DefaultRootWindow(v->display), 8690ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner 16, 2, 8); 870b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor#ifndef XFree86Server 871b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor v->hpcr_clear_ximage = XGetImage(v->display, v->hpcr_clear_pixmap, 872b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor 0, 0, 16, 2, AllPlanes, ZPixmap); 873b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor#endif 874b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor } 875b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor} 876b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor 877b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor 878b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor/** 879b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor * Setup RGB rendering for a window with a True/DirectColor visual. 880b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor */ 881b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregorstatic void 882b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregorsetup_truecolor(XMesaVisual v, XMesaBuffer buffer, XMesaColormap cmap) 883b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor{ 884b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor unsigned long rmask, gmask, bmask; 885b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor (void) buffer; 886b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor (void) cmap; 887b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor 888b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor /* Compute red multiplier (mask) and bit shift */ 889b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor v->rshift = 0; 890b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor rmask = GET_REDMASK(v); 891b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor while ((rmask & 1)==0) { 892b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor v->rshift++; 893b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor rmask = rmask >> 1; 894b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor } 895b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor 896b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor /* Compute green multiplier (mask) and bit shift */ 897b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor v->gshift = 0; 898a72d8c4556fbdfca2c9e101722812861fcbdde12Douglas Gregor gmask = GET_GREENMASK(v); 899a72d8c4556fbdfca2c9e101722812861fcbdde12Douglas Gregor while ((gmask & 1)==0) { 900a72d8c4556fbdfca2c9e101722812861fcbdde12Douglas Gregor v->gshift++; 9014800a5c79023271408af49797e09be32aca93232Douglas Gregor gmask = gmask >> 1; 902f70d12dbd49fcc25f1dfc0127217112ae76bcb8fChandler Carruth } 9034800a5c79023271408af49797e09be32aca93232Douglas Gregor 9044800a5c79023271408af49797e09be32aca93232Douglas Gregor /* Compute blue multiplier (mask) and bit shift */ 9054800a5c79023271408af49797e09be32aca93232Douglas Gregor v->bshift = 0; 906b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner bmask = GET_BLUEMASK(v); 907b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner while ((bmask & 1)==0) { 908b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner v->bshift++; 909b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner bmask = bmask >> 1; 910b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner } 911e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor 912e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor /* 9131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump * Compute component-to-pixel lookup tables and dithering kernel 914e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor */ 915e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor { 916e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor static GLubyte kernel[16] = { 917e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor 0*16, 8*16, 2*16, 10*16, 918e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor 12*16, 4*16, 14*16, 6*16, 919e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor 3*16, 11*16, 1*16, 9*16, 920e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor 15*16, 7*16, 13*16, 5*16, 9211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump }; 922832d620b4ae0fc5fe28561b885b4cfc65cf5c9abDouglas Gregor GLint rBits = _mesa_bitcount(rmask); 923e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor GLint gBits = _mesa_bitcount(gmask); 9241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump GLint bBits = _mesa_bitcount(bmask); 925832d620b4ae0fc5fe28561b885b4cfc65cf5c9abDouglas Gregor GLint maxBits; 926e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor GLuint i; 9271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 928e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor /* convert pixel components in [0,_mask] to RGB values in [0,255] */ 929e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor for (i=0; i<=rmask; i++) 930832d620b4ae0fc5fe28561b885b4cfc65cf5c9abDouglas Gregor v->PixelToR[i] = (unsigned char) ((i * 255) / rmask); 931e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor for (i=0; i<=gmask; i++) 932e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor v->PixelToG[i] = (unsigned char) ((i * 255) / gmask); 9331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump for (i=0; i<=bmask; i++) 934e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor v->PixelToB[i] = (unsigned char) ((i * 255) / bmask); 935e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor 936e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor /* convert RGB values from [0,255] to pixel components */ 9371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 938e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor for (i=0;i<256;i++) { 939e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor GLint r = gamma_adjust(v->RedGamma, i, 255); 940e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor GLint g = gamma_adjust(v->GreenGamma, i, 255); 941e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor GLint b = gamma_adjust(v->BlueGamma, i, 255); 942e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor v->RtoPixel[i] = (r >> (8-rBits)) << v->rshift; 9431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump v->GtoPixel[i] = (g >> (8-gBits)) << v->gshift; 944e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor v->BtoPixel[i] = (b >> (8-bBits)) << v->bshift; 945e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor } 946b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner /* overflow protection */ 9473397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl for (i=256;i<512;i++) { 948832d620b4ae0fc5fe28561b885b4cfc65cf5c9abDouglas Gregor v->RtoPixel[i] = v->RtoPixel[255]; 9498e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis v->GtoPixel[i] = v->GtoPixel[255]; 9502bec0410d268779f601bd509e0302a500af7ac6aDouglas Gregor v->BtoPixel[i] = v->BtoPixel[255]; 951b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor } 952e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor 953e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor /* setup dithering kernel */ 954e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor maxBits = rBits; 95577f4603c8b142e642300959a601ecec2b7c8e288Sebastian Redl if (gBits > maxBits) maxBits = gBits; 9568538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl if (bBits > maxBits) maxBits = bBits; 9573397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl for (i=0;i<16;i++) { 9583397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl v->Kernel[i] = kernel[i] >> maxBits; 959e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor } 960e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor 961e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor v->undithered_pf = PF_Truecolor; 96277f4603c8b142e642300959a601ecec2b7c8e288Sebastian Redl v->dithered_pf = (GET_VISUAL_DEPTH(v)<24) ? PF_Dither_True : PF_Truecolor; 96377f4603c8b142e642300959a601ecec2b7c8e288Sebastian Redl } 964e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor 9651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /* 966e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor * Now check for TrueColor visuals which we can optimize. 9678538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl */ 9688538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl if ( GET_REDMASK(v) ==0x0000ff 9698538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl && GET_GREENMASK(v)==0x00ff00 970e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor && GET_BLUEMASK(v) ==0xff0000 971e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor && CHECK_BYTE_ORDER(v) 972832d620b4ae0fc5fe28561b885b4cfc65cf5c9abDouglas Gregor && v->BitsPerPixel==32 97377f4603c8b142e642300959a601ecec2b7c8e288Sebastian Redl && v->RedGamma==1.0 && v->GreenGamma==1.0 && v->BlueGamma==1.0) { 97448d2c3f7c3ca48da05436afdc8426a245294ee65Jonathan D. Turner /* common 32 bpp config used on SGI, Sun */ 97548d2c3f7c3ca48da05436afdc8426a245294ee65Jonathan D. Turner v->undithered_pf = v->dithered_pf = PF_8A8B8G8R; /* ABGR */ 97677f4603c8b142e642300959a601ecec2b7c8e288Sebastian Redl } 9771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump else if (GET_REDMASK(v) == 0xff0000 97831d375f056447d4e2418275d4913661d3bfedb3eDouglas Gregor && GET_GREENMASK(v)== 0x00ff00 979b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor && GET_BLUEMASK(v) == 0x0000ff 980b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor && CHECK_BYTE_ORDER(v) 981b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor && v->RedGamma == 1.0 && v->GreenGamma == 1.0 && v->BlueGamma == 1.0){ 9828538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl if (v->BitsPerPixel==32) { 983b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor /* if 32 bpp, and visual indicates 8 bpp alpha channel */ 984b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor if (GET_VISUAL_DEPTH(v) == 32 && v->mesa_visual.alphaBits == 8) 985b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor v->undithered_pf = v->dithered_pf = PF_8A8R8G8B; /* ARGB */ 986fbfd180495e7800975c6d9bdc6d24e706ef70e34Michael J. Spencer else 9871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump v->undithered_pf = v->dithered_pf = PF_8R8G8B; /* xRGB */ 988fbfd180495e7800975c6d9bdc6d24e706ef70e34Michael J. Spencer } 989b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor else if (v->BitsPerPixel == 24) { 990aba54a95e9d5e4dc9056abec6bb70ea777c4a7bcKovarththanan Rajaratnam v->undithered_pf = v->dithered_pf = PF_8R8G8B24; /* RGB */ 9911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 992e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor } 993b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor else if (GET_REDMASK(v) ==0xf800 9948538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl && GET_GREENMASK(v)==0x07e0 995ec312a1f0557b1d27f3eb6cf49acbf7e72696422Daniel Dunbar && GET_BLUEMASK(v) ==0x001f 99631d375f056447d4e2418275d4913661d3bfedb3eDouglas Gregor && CHECK_BYTE_ORDER(v) 99731d375f056447d4e2418275d4913661d3bfedb3eDouglas Gregor && v->BitsPerPixel==16 99831d375f056447d4e2418275d4913661d3bfedb3eDouglas Gregor && v->RedGamma==1.0 && v->GreenGamma==1.0 && v->BlueGamma==1.0) { 99931d375f056447d4e2418275d4913661d3bfedb3eDouglas Gregor /* 5-6-5 RGB */ 1000b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor v->undithered_pf = PF_5R6G5B; 100111a18f115e8974ef24e8d5bb549ed3289871efa4Kovarththanan Rajaratnam v->dithered_pf = PF_Dither_5R6G5B; 10028e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis } 10038e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis else if (GET_REDMASK(v) ==0xe0 10048e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis && GET_GREENMASK(v)==0x1c 10058e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis && GET_BLUEMASK(v) ==0x03 10068e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis && CHECK_FOR_HPCR(v)) { 10078e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis /* 8-bit HP color recovery */ 10088e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis setup_8bit_hpcr( v ); 10098e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis } 10108e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis} 10118e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis 10128e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis 10138e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis 10148e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis/** 10158e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis * Setup RGB rendering for a window with a monochrome visual. 10168e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis */ 10178e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidisstatic void 10188e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidissetup_monochrome( XMesaVisual v, XMesaBuffer b ) 1019f7a96a39958b3f919f26764777eec948b43d74bcTed Kremenek{ 1020f7a96a39958b3f919f26764777eec948b43d74bcTed Kremenek (void) b; 10218538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl v->dithered_pf = v->undithered_pf = PF_1Bit; 1022f7a96a39958b3f919f26764777eec948b43d74bcTed Kremenek /* if black=1 then we must flip pixel values */ 1023f7a96a39958b3f919f26764777eec948b43d74bcTed Kremenek v->bitFlip = (GET_BLACK_PIXEL(v) != 0); 1024445e23e9b909ec8e21303c7dd82c90b72fc09ac4Douglas Gregor} 10258538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl 1026f7a96a39958b3f919f26764777eec948b43d74bcTed Kremenek 1027f7a96a39958b3f919f26764777eec948b43d74bcTed Kremenek 10282bec0410d268779f601bd509e0302a500af7ac6aDouglas Gregor/** 10292bec0410d268779f601bd509e0302a500af7ac6aDouglas Gregor * When a context is bound for the first time, we can finally finish 10302bec0410d268779f601bd509e0302a500af7ac6aDouglas Gregor * initializing the context's visual and buffer information. 1031a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl * \param v the XMesaVisual to initialize 10320a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor * \param b the XMesaBuffer to initialize (may be NULL) 10330a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor * \param rgb_flag TRUE = RGBA mode, FALSE = color index mode 10340a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor * \param window the window/pixmap we're rendering into 10350a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor * \param cmap the colormap associated with the window/pixmap 10360a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor * \return GL_TRUE=success, GL_FALSE=failure 10370a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor */ 1038eb5d7b752651283de5abfcc2f91df7227582a08dChandler Carruthstatic GLboolean 10390a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregorinitialize_visual_and_buffer(int client, XMesaVisual v, XMesaBuffer b, 10400a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor GLboolean rgb_flag, XMesaDrawable window, 10410a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor XMesaColormap cmap) 10420a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor{ 10437e7fbd05a5dfdb0addfc8b5af2fcbed8c7b5fb87Peter Collingbourne ASSERT(!b || b->xm_visual == v); 10440a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor 1045dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer /* Save true bits/pixel */ 1046dae4ac4fe56ec60fc93b3e3c9f51e79e682084b9Michael J. Spencer v->BitsPerPixel = bits_per_pixel(v); 10470a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor assert(v->BitsPerPixel > 0); 10480a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor 10490a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor if (rgb_flag == GL_FALSE) { 10501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /* COLOR-INDEXED WINDOW: 10510a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor * Even if the visual is TrueColor or DirectColor we treat it as 10520a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor * being color indexed. This is weird but might be useful to someone. 105311a18f115e8974ef24e8d5bb549ed3289871efa4Kovarththanan Rajaratnam */ 1054412e798941ca64e2e6b084323915fa9aa5f6bdf3Fariborz Jahanian v->dithered_pf = v->undithered_pf = PF_Index; 105511a18f115e8974ef24e8d5bb549ed3289871efa4Kovarththanan Rajaratnam v->mesa_visual.indexBits = GET_VISUAL_DEPTH(v); 1056412e798941ca64e2e6b084323915fa9aa5f6bdf3Fariborz Jahanian } 1057f84109ee6aeffb09366bd70c8593ce1b7818b1adFariborz Jahanian else { 1058c32647d111e516593b9ba242cad7b8ff4016c155Ted Kremenek /* RGB WINDOW: 1059c32647d111e516593b9ba242cad7b8ff4016c155Ted Kremenek * We support RGB rendering into almost any kind of visual. 106074da19fc3a52d7e3005eeb7a7833859da84fd12aDouglas Gregor */ 10614c9d8d0eca5ca635d9a30222f690db9140e98325Fariborz Jahanian const int xclass = v->mesa_visual.visualType; 10621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (xclass == GLX_TRUE_COLOR || xclass == GLX_DIRECT_COLOR) { 10630a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor setup_truecolor( v, b, cmap ); 10640a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor } 10650a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor else if (xclass == GLX_STATIC_GRAY && GET_VISUAL_DEPTH(v) == 1) { 1066b9e7e63ae2098bc02e79c032df0a3124d09a4b4eNate Begeman setup_monochrome( v, b ); 10670a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor } 1068da4b7cf09ebfd4e4098b516081fa9dae2f5c99e0Anders Carlsson else if (xclass == GLX_GRAY_SCALE || xclass == GLX_STATIC_GRAY) { 10697da99b05aa9482e76b2954223b5652469004aec2Anders Carlsson if (!setup_grayscale( client, v, b, cmap )) { 10707da99b05aa9482e76b2954223b5652469004aec2Anders Carlsson return GL_FALSE; 10710a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor } 10726f75550e40a9177db9979fc130ce3ece026b137dDouglas Gregor } 10730a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor else if ((xclass == GLX_PSEUDO_COLOR || xclass == GLX_STATIC_COLOR) 10740a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor && GET_VISUAL_DEPTH(v)>=4 && GET_VISUAL_DEPTH(v)<=16) { 10750a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor if (!setup_dithered_color( client, v, b, cmap )) { 10760a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor return GL_FALSE; 1077ea5ce4705df0743093925585d8edc80e0d8fe3ffChris Lattner } 1078ea5ce4705df0743093925585d8edc80e0d8fe3ffChris Lattner } 1079972d954bd216c86a961bb7f81c53af85de17c2f0Douglas Gregor else { 10800a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor _mesa_warning(NULL, "XMesa: RGB mode rendering not supported in given visual.\n"); 10810a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor return GL_FALSE; 10820a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor } 10830a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor v->mesa_visual.indexBits = 0; 10840a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor 10850a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor if (_mesa_getenv("MESA_NO_DITHER")) { 1086a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner v->dithered_pf = v->undithered_pf; 1087a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner } 10880a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor } 10890a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor 10901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 10910a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor /* 10920a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor * If MESA_INFO env var is set print out some debugging info 10930a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor * which can help Brian figure out what's going on when a user 10940a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor * reports bugs. 10950a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor */ 10960a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor if (_mesa_getenv("MESA_INFO")) { 10970a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor _mesa_printf("X/Mesa visual = %p\n", (void *) v); 10980a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor _mesa_printf("X/Mesa dithered pf = %u\n", v->dithered_pf); 10990d2d1bcef51993ca3fd957e45fb7ec85e45016e5Chandler Carruth _mesa_printf("X/Mesa undithered pf = %u\n", v->undithered_pf); 1100a33d9b4ebf732a5da6d56fd7319ff6c020789b1cAnders Carlsson _mesa_printf("X/Mesa level = %d\n", v->mesa_visual.level); 1101a33d9b4ebf732a5da6d56fd7319ff6c020789b1cAnders Carlsson _mesa_printf("X/Mesa depth = %d\n", GET_VISUAL_DEPTH(v)); 110215b91764d08e886391c865c4a444d7b51141c284Eli Friedman _mesa_printf("X/Mesa bits per pixel = %d\n", v->BitsPerPixel); 110315b91764d08e886391c865c4a444d7b51141c284Eli Friedman } 1104a6fda124bf380479529d6a80b84b62cacd3cb707John Thompson 1105b1bdced5967c54d029cd12907e8939c78decf14cArgyrios Kyrtzidis if (b && window) { 1106b1bdced5967c54d029cd12907e8939c78decf14cArgyrios Kyrtzidis /* Do window-specific initializations */ 1107b1bdced5967c54d029cd12907e8939c78decf14cArgyrios Kyrtzidis 11080a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor /* these should have been set in create_xmesa_buffer */ 11090a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor ASSERT(b->frontxrb->drawable == window); 1110ab8e281b32a3d3b9b18257d26844362bf806ecdcDaniel Dunbar ASSERT(b->frontxrb->pixmap == (XMesaPixmap) window); 11110a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor 1112b9e7e63ae2098bc02e79c032df0a3124d09a4b4eNate Begeman /* Setup for single/double buffering */ 111308a53269b1f8241e2e6797e845abbe640fb18253Peter Collingbourne if (v->mesa_visual.doubleBufferMode) { 11149c276ae0f24d4cee8f7954069d4b8eae45d0447dMike Stump /* Double buffered */ 111584bccea1ad9fd8bc1f4ec3d1fc5dd8d15dabffbcPeter Collingbourne b->shm = check_for_xshm( v->display ); 111692f5822df6a0d7571df44b5d279ed4f017fbb0e6Anders Carlsson } 1117a0068fc64351db9c47916566e3b85ab733cd8d6dDouglas Gregor 1118cfe9af250f466e7e38becea4428990448ae07737Roman Divacky /* X11 graphics contexts */ 1119f85e193739c953358c865005855253af4f68a497John McCall#ifdef XFree86Server 1120f85e193739c953358c865005855253af4f68a497John McCall b->gc = CreateScratchGC(v->display, window->depth); 11218538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl#else 11220a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor b->gc = XCreateGC( v->display, window, 0, NULL ); 11230a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor#endif 112414f79002e58556798e86168c63e48d533287eda5Douglas Gregor XMesaSetFunction( v->display, b->gc, GXcopy ); 11254fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor 11264fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor /* cleargc - for glClear() */ 11274fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor#ifdef XFree86Server 11284fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor b->cleargc = CreateScratchGC(v->display, window->depth); 11294fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor#else 11303397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl b->cleargc = XCreateGC( v->display, window, 0, NULL ); 11314fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor#endif 11324fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor XMesaSetFunction( v->display, b->cleargc, GXcopy ); 11334fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor 11341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /* 113574e976ba4b0d407bb798ea26476f618e256fc8c7Chris Lattner * Don't generate Graphics Expose/NoExpose events in swapbuffers(). 113674e976ba4b0d407bb798ea26476f618e256fc8c7Chris Lattner * Patch contributed by Michael Pichler May 15, 1995. 11374fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor */ 11384fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor#ifdef XFree86Server 11392596e429a61602312bdd149786045b8a90cd2d10Daniel Dunbar b->swapgc = CreateScratchGC(v->display, window->depth); 11404fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor { 11411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump CARD32 v[1]; 11421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump v[0] = FALSE; 11435f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner dixChangeGC(NullClient, b->swapgc, GCGraphicsExposures, v, NULL); 11444fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor } 11454fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor#else 11464fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor { 114774e976ba4b0d407bb798ea26476f618e256fc8c7Chris Lattner XGCValues gcvalues; 11484fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor gcvalues.graphics_exposures = False; 11494fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor b->swapgc = XCreateGC(v->display, window, 11504fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor GCGraphicsExposures, &gcvalues); 11511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 11525f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner#endif 11534fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor XMesaSetFunction( v->display, b->swapgc, GXcopy ); 11544fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor /* 11551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump * Set fill style and tile pixmap once for all for HPCR stuff 11565f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner * (instead of doing it each time in clear_color_HPCR_pixmap()) 11574fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor * Initialize whole stuff 11584fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor * Patch contributed by Jacques Leroy March 8, 1998. 11594fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor */ 11601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (v->hpcr_clear_flag && b->backxrb && b->backxrb->pixmap) { 116174e976ba4b0d407bb798ea26476f618e256fc8c7Chris Lattner int i; 116274e976ba4b0d407bb798ea26476f618e256fc8c7Chris Lattner for (i = 0; i < 16; i++) { 116374e976ba4b0d407bb798ea26476f618e256fc8c7Chris Lattner XMesaPutPixel(v->hpcr_clear_ximage, i, 0, 0); 116474e976ba4b0d407bb798ea26476f618e256fc8c7Chris Lattner XMesaPutPixel(v->hpcr_clear_ximage, i, 1, 0); 116574e976ba4b0d407bb798ea26476f618e256fc8c7Chris Lattner } 11664fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor XMesaPutImage(b->display, (XMesaDrawable) v->hpcr_clear_pixmap, 11674fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor b->cleargc, v->hpcr_clear_ximage, 0, 0, 0, 0, 16, 2); 11684fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor XMesaSetFillStyle( v->display, b->cleargc, FillTiled); 11694fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor XMesaSetTile( v->display, b->cleargc, v->hpcr_clear_pixmap ); 11704fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor } 11714fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor 11723397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl /* Initialize the row buffer XImage for use in write_color_span() */ 1173a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl#ifdef XFree86Server 11744fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor b->rowimage = XMesaCreateImage(GET_VISUAL_DEPTH(v), MAX_WIDTH, 1, 11754fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor (char *)MALLOC(MAX_WIDTH*4)); 11763397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl#else 11774fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor b->rowimage = XCreateImage( v->display, 11781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump v->visinfo->visual, 11794fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor v->visinfo->depth, 1180e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor ZPixmap, 0, /*format, offset*/ 11815f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner (char*) MALLOC(MAX_WIDTH*4), /*data*/ 11821e5f83ba515157dc7f263dc91b1d51c7a5754c35Chris Lattner MAX_WIDTH, 1, /*width, height*/ 1183e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor 32, /*bitmap_pad*/ 11841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 0 /*bytes_per_line*/ ); 11854fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor#endif 11861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!b->rowimage) 11874fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor return GL_FALSE; 11884fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor } 11894fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor 11904fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor return GL_TRUE; 11914fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor} 11924fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor 11934fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor 11944fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor 11954fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor/* 11964fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor * Convert an RGBA color to a pixel value. 11974fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor */ 11988538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redlunsigned long 11994fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregorxmesa_color_to_pixel(GLcontext *ctx, 12004fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor GLubyte r, GLubyte g, GLubyte b, GLubyte a, 12014fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor GLuint pixelFormat) 12024fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor{ 12034fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor XMesaContext xmesa = XMESA_CONTEXT(ctx); 12044fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor switch (pixelFormat) { 12054fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor case PF_Index: 12068538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl return 0; 12074fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor case PF_Truecolor: 12084fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor { 1209ec312a1f0557b1d27f3eb6cf49acbf7e72696422Daniel Dunbar unsigned long p; 12104fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor PACK_TRUECOLOR( p, r, g, b ); 12114fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor return p; 12124fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor } 121314f79002e58556798e86168c63e48d533287eda5Douglas Gregor case PF_8A8B8G8R: 121414f79002e58556798e86168c63e48d533287eda5Douglas Gregor return PACK_8A8B8G8R( r, g, b, a ); 121514f79002e58556798e86168c63e48d533287eda5Douglas Gregor case PF_8A8R8G8B: 121614f79002e58556798e86168c63e48d533287eda5Douglas Gregor return PACK_8A8R8G8B( r, g, b, a ); 121714f79002e58556798e86168c63e48d533287eda5Douglas Gregor case PF_8R8G8B: 1218c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor /* fall through */ 121914f79002e58556798e86168c63e48d533287eda5Douglas Gregor case PF_8R8G8B24: 122014f79002e58556798e86168c63e48d533287eda5Douglas Gregor return PACK_8R8G8B( r, g, b ); 12218538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case PF_5R6G5B: 122214f79002e58556798e86168c63e48d533287eda5Douglas Gregor return PACK_5R6G5B( r, g, b ); 122314f79002e58556798e86168c63e48d533287eda5Douglas Gregor case PF_Dither: 122414f79002e58556798e86168c63e48d533287eda5Douglas Gregor { 122514f79002e58556798e86168c63e48d533287eda5Douglas Gregor DITHER_SETUP; 12262d52be56ff595341be3c6cec337af6763804ce66Douglas Gregor return DITHER( 1, 0, r, g, b ); 12272d52be56ff595341be3c6cec337af6763804ce66Douglas Gregor } 12282d52be56ff595341be3c6cec337af6763804ce66Douglas Gregor case PF_1Bit: 122914f79002e58556798e86168c63e48d533287eda5Douglas Gregor /* 382 = (3*255)/2 */ 1230c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor return ((r+g+b) > 382) ^ xmesa->xm_visual->bitFlip; 123114f79002e58556798e86168c63e48d533287eda5Douglas Gregor case PF_HPCR: 123214f79002e58556798e86168c63e48d533287eda5Douglas Gregor return DITHER_HPCR(1, 1, r, g, b); 123314f79002e58556798e86168c63e48d533287eda5Douglas Gregor case PF_Lookup: 123414f79002e58556798e86168c63e48d533287eda5Douglas Gregor { 1235c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor LOOKUP_SETUP; 123614f79002e58556798e86168c63e48d533287eda5Douglas Gregor return LOOKUP( r, g, b ); 123714f79002e58556798e86168c63e48d533287eda5Douglas Gregor } 12388538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case PF_Grayscale: 123914f79002e58556798e86168c63e48d533287eda5Douglas Gregor return GRAY_RGB( r, g, b ); 124014f79002e58556798e86168c63e48d533287eda5Douglas Gregor case PF_Dither_True: 124114f79002e58556798e86168c63e48d533287eda5Douglas Gregor /* fall through */ 124214f79002e58556798e86168c63e48d533287eda5Douglas Gregor case PF_Dither_5R6G5B: 124314f79002e58556798e86168c63e48d533287eda5Douglas Gregor { 1244c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor unsigned long p; 124514f79002e58556798e86168c63e48d533287eda5Douglas Gregor PACK_TRUEDITHER(p, 1, 0, r, g, b); 124614f79002e58556798e86168c63e48d533287eda5Douglas Gregor return p; 124714f79002e58556798e86168c63e48d533287eda5Douglas Gregor } 124814f79002e58556798e86168c63e48d533287eda5Douglas Gregor default: 1249c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor _mesa_problem(ctx, "Bad pixel format in xmesa_color_to_pixel"); 125014f79002e58556798e86168c63e48d533287eda5Douglas Gregor } 125114f79002e58556798e86168c63e48d533287eda5Douglas Gregor return 0; 12528538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl} 125314f79002e58556798e86168c63e48d533287eda5Douglas Gregor 1254c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor 125514f79002e58556798e86168c63e48d533287eda5Douglas Gregor#define NUM_VISUAL_TYPES 6 125614f79002e58556798e86168c63e48d533287eda5Douglas Gregor 1257f70d12dbd49fcc25f1dfc0127217112ae76bcb8fChandler Carruth/** 1258f70d12dbd49fcc25f1dfc0127217112ae76bcb8fChandler Carruth * Convert an X visual type to a GLX visual type. 1259f70d12dbd49fcc25f1dfc0127217112ae76bcb8fChandler Carruth * 126014f79002e58556798e86168c63e48d533287eda5Douglas Gregor * \param visualType X visual type (i.e., \c TrueColor, \c StaticGray, etc.) 126114f79002e58556798e86168c63e48d533287eda5Douglas Gregor * to be converted. 1262f70d12dbd49fcc25f1dfc0127217112ae76bcb8fChandler Carruth * \return If \c visualType is a valid X visual type, a GLX visual type will 126314f79002e58556798e86168c63e48d533287eda5Douglas Gregor * be returned. Otherwise \c GLX_NONE will be returned. 126414f79002e58556798e86168c63e48d533287eda5Douglas Gregor * 126514f79002e58556798e86168c63e48d533287eda5Douglas Gregor * \note 126614f79002e58556798e86168c63e48d533287eda5Douglas Gregor * This code was lifted directly from lib/GL/glx/glcontextmodes.c in the 1267f60e9918690fcf02974bc1ebecd42c99d561855eDouglas Gregor * DRI CVS tree. 1268c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor */ 126914f79002e58556798e86168c63e48d533287eda5Douglas Gregorstatic GLint 127014f79002e58556798e86168c63e48d533287eda5Douglas Gregorxmesa_convert_from_x_visual_type( int visualType ) 1271cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor{ 1272cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor static const int glx_visual_types[ NUM_VISUAL_TYPES ] = { 1273cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor GLX_STATIC_GRAY, GLX_GRAY_SCALE, 1274cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor GLX_STATIC_COLOR, GLX_PSEUDO_COLOR, 1275cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor GLX_TRUE_COLOR, GLX_DIRECT_COLOR 1276cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor }; 1277b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor 1278b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor return ( (unsigned) visualType < NUM_VISUAL_TYPES ) 1279b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor ? glx_visual_types[ visualType ] : GLX_NONE; 1280b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor} 1281cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor 1282cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor 1283cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor/**********************************************************************/ 1284cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor/***** Public Functions *****/ 1285cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor/**********************************************************************/ 1286cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor 1287cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor 1288cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor/* 1289cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor * Create a new X/Mesa visual. 1290cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor * Input: display - X11 display 1291cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor * visinfo - an XVisualInfo pointer 1292cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor * rgb_flag - GL_TRUE = RGB mode, 1293cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor * GL_FALSE = color index mode 1294cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor * alpha_flag - alpha buffer requested? 1295cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor * db_flag - GL_TRUE = double-buffered, 1296cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor * GL_FALSE = single buffered 1297cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor * stereo_flag - stereo visual? 1298cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor * ximage_flag - GL_TRUE = use an XImage for back buffer, 1299cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor * GL_FALSE = use an off-screen pixmap for back buffer 13005f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner * depth_size - requested bits/depth values, or zero 1301cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor * stencil_size - requested bits/stencil values, or zero 1302cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor * accum_red_size - requested bits/red accum values, or zero 1303cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor * accum_green_size - requested bits/green accum values, or zero 1304b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor * accum_blue_size - requested bits/blue accum values, or zero 1305cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor * accum_alpha_size - requested bits/alpha accum values, or zero 1306cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor * num_samples - number of samples/pixel if multisampling, or zero 1307cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor * level - visual level, usually 0 1308cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor * visualCaveat - ala the GLX extension, usually GLX_NONE 13095f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner * Return; a new XMesaVisual or 0 if error. 1310cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor */ 1311cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas GregorPUBLIC 1312cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas GregorXMesaVisual XMesaCreateVisual( XMesaDisplay *display, 13135f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner XMesaVisualInfo visinfo, 1314cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor GLboolean rgb_flag, 1315cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor GLboolean alpha_flag, 1316cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor GLboolean db_flag, 1317cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor GLboolean stereo_flag, 1318b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor GLboolean ximage_flag, 1319b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor GLint depth_size, 1320b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor GLint stencil_size, 1321b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor GLint accum_red_size, 1322b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor GLint accum_green_size, 1323cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor GLint accum_blue_size, 1324cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor GLint accum_alpha_size, 1325cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor GLint num_samples, 1326cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor GLint level, 1327cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor GLint visualCaveat ) 1328cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor{ 1329cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor char *gamma; 1330b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor XMesaVisual v; 1331b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor GLint red_bits, green_bits, blue_bits, alpha_bits; 1332b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor 1333b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor#ifndef XFree86Server 1334b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor /* For debugging only */ 1335b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor if (_mesa_getenv("MESA_XSYNC")) { 1336b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor /* This makes debugging X easier. 1337b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor * In your debugger, set a breakpoint on _XError to stop when an 1338b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor * X protocol error is generated. 1339b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor */ 1340b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor XSynchronize( display, 1 ); 1341b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor } 1342b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor#endif 1343b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor 1344b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor v = (XMesaVisual) CALLOC_STRUCT(xmesa_visual); 1345b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor if (!v) { 1346b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor return NULL; 1347b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor } 1348cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor 1349cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor v->display = display; 1350b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor 1351b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor /* Save a copy of the XVisualInfo struct because the user may X_mesa_free() 1352b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor * the struct but we may need some of the information contained in it 1353cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor * at a later time. 1354cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor */ 1355cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor#ifndef XFree86Server 1356cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor v->visinfo = (XVisualInfo *) MALLOC(sizeof(*visinfo)); 1357cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor if(!v->visinfo) { 1358cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor _mesa_free(v); 1359cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor return NULL; 1360cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor } 1361832d620b4ae0fc5fe28561b885b4cfc65cf5c9abDouglas Gregor MEMCPY(v->visinfo, visinfo, sizeof(*visinfo)); 13625f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner#endif 1363cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor 1364cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor /* check for MESA_GAMMA environment variable */ 1365cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor gamma = _mesa_getenv("MESA_GAMMA"); 1366cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor if (gamma) { 1367cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor v->RedGamma = v->GreenGamma = v->BlueGamma = 0.0; 1368cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor sscanf( gamma, "%f %f %f", &v->RedGamma, &v->GreenGamma, &v->BlueGamma ); 1369cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor if (v->RedGamma<=0.0) v->RedGamma = 1.0; 13705f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner if (v->GreenGamma<=0.0) v->GreenGamma = v->RedGamma; 1371cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor if (v->BlueGamma<=0.0) v->BlueGamma = v->RedGamma; 1372cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor } 1373cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor else { 1374cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor v->RedGamma = v->GreenGamma = v->BlueGamma = 1.0; 1375cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor } 1376cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor 1377cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor v->ximage_flag = ximage_flag; 1378cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor 1379cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor#ifdef XFree86Server 1380cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor /* We could calculate these values by ourselves. nplanes is either the sum 1381cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor * of the red, green, and blue bits or the number index bits. 1382cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor * ColormapEntries is either (1U << index_bits) or 1383cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor * (1U << max(redBits, greenBits, blueBits)). 1384cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor */ 1385cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor assert(visinfo->nplanes > 0); 1386cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor v->nplanes = visinfo->nplanes; 1387cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor v->ColormapEntries = visinfo->ColormapEntries; 1388cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor 1389cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor v->mesa_visual.redMask = visinfo->redMask; 1390cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor v->mesa_visual.greenMask = visinfo->greenMask; 1391cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor v->mesa_visual.blueMask = visinfo->blueMask; 1392cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor v->mesa_visual.visualID = visinfo->vid; 1393cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor v->mesa_visual.screen = 0; /* FIXME: What should be done here? */ 1394cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor#else 1395cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor v->mesa_visual.redMask = visinfo->red_mask; 1396cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor v->mesa_visual.greenMask = visinfo->green_mask; 1397cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor v->mesa_visual.blueMask = visinfo->blue_mask; 1398cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor v->mesa_visual.visualID = visinfo->visualid; 1399cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor v->mesa_visual.screen = visinfo->screen; 1400cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor#endif 1401cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor 1402cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor#if defined(XFree86Server) || !(defined(__cplusplus) || defined(c_plusplus)) 1403cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor v->mesa_visual.visualType = xmesa_convert_from_x_visual_type(visinfo->class); 1404cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor#else 1405cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor v->mesa_visual.visualType = xmesa_convert_from_x_visual_type(visinfo->c_class); 1406cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor#endif 1407cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor 1408cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor v->mesa_visual.visualRating = visualCaveat; 1409cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor 1410cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor if (alpha_flag) 1411cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor v->mesa_visual.alphaBits = 8; 1412b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor 1413cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor (void) initialize_visual_and_buffer( 0, v, NULL, rgb_flag, 0, 0 ); 1414cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor 1415cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor { 1416b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor const int xclass = v->mesa_visual.visualType; 1417cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor if (xclass == GLX_TRUE_COLOR || xclass == GLX_DIRECT_COLOR) { 1418cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor red_bits = _mesa_bitcount(GET_REDMASK(v)); 1419cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor green_bits = _mesa_bitcount(GET_GREENMASK(v)); 1420cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor blue_bits = _mesa_bitcount(GET_BLUEMASK(v)); 1421b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor } 1422b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor else { 1423cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor /* this is an approximation */ 1424cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor int depth; 1425cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor depth = GET_VISUAL_DEPTH(v); 1426cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor red_bits = depth / 3; 1427cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor depth -= red_bits; 1428cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor green_bits = depth / 2; 1429cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor depth -= green_bits; 143014f79002e58556798e86168c63e48d533287eda5Douglas Gregor blue_bits = depth; 143114f79002e58556798e86168c63e48d533287eda5Douglas Gregor alpha_bits = 0; 143214f79002e58556798e86168c63e48d533287eda5Douglas Gregor assert( red_bits + green_bits + blue_bits == GET_VISUAL_DEPTH(v) ); 143314f79002e58556798e86168c63e48d533287eda5Douglas Gregor } 143414f79002e58556798e86168c63e48d533287eda5Douglas Gregor alpha_bits = v->mesa_visual.alphaBits; 143514f79002e58556798e86168c63e48d533287eda5Douglas Gregor } 143614f79002e58556798e86168c63e48d533287eda5Douglas Gregor 143714f79002e58556798e86168c63e48d533287eda5Douglas Gregor _mesa_initialize_visual( &v->mesa_visual, 1438a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl rgb_flag, db_flag, stereo_flag, 1439e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor red_bits, green_bits, 1440832d620b4ae0fc5fe28561b885b4cfc65cf5c9abDouglas Gregor blue_bits, alpha_bits, 14417f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor v->mesa_visual.indexBits, 14427f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor depth_size, 1443f04ad69fed38d26fc0d6f7d6fd0a4631ddfbc7feChris Lattner stencil_size, 14448538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl accum_red_size, accum_green_size, 144514f79002e58556798e86168c63e48d533287eda5Douglas Gregor accum_blue_size, accum_alpha_size, 144614f79002e58556798e86168c63e48d533287eda5Douglas Gregor 0 ); 1447828e18cd80319c67b9b9776d1ed5411161d9f0bfChris Lattner 1448828e18cd80319c67b9b9776d1ed5411161d9f0bfChris Lattner /* XXX minor hack */ 1449828e18cd80319c67b9b9776d1ed5411161d9f0bfChris Lattner v->mesa_visual.level = level; 1450f70d12dbd49fcc25f1dfc0127217112ae76bcb8fChandler Carruth return v; 14517f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor} 145214f79002e58556798e86168c63e48d533287eda5Douglas Gregor 145314f79002e58556798e86168c63e48d533287eda5Douglas Gregor 1454090d9b53e32bb30d9e74de895bb59b409bd49e00Chris LattnerPUBLIC 14554cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidisvoid XMesaDestroyVisual( XMesaVisual v ) 14564cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis{ 14574cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis#ifndef XFree86Server 14587f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor _mesa_free(v->visinfo); 1459f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor#endif 1460f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor _mesa_free(v); 14610fa7d0b15ea2a224bfe43ac745d411f915da87ddSebastian Redl} 1462bdfe48ac80573e026595af91e541474dbf02565fDouglas Gregor 1463f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor 146411a18f115e8974ef24e8d5bb549ed3289871efa4Kovarththanan Rajaratnam 14657f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor/** 14667f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor * Create a new XMesaContext. 14677f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor * \param v the XMesaVisual 146814f79002e58556798e86168c63e48d533287eda5Douglas Gregor * \param share_list another XMesaContext with which to share display 146914f79002e58556798e86168c63e48d533287eda5Douglas Gregor * lists or NULL if no sharing is wanted. 147014f79002e58556798e86168c63e48d533287eda5Douglas Gregor * \return an XMesaContext or NULL if error. 14714cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis */ 14728538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian RedlPUBLIC 14734cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios KyrtzidisXMesaContext XMesaCreateContext( XMesaVisual v, XMesaContext share_list ) 14744cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis{ 14758538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl static GLboolean firstTime = GL_TRUE; 147614f79002e58556798e86168c63e48d533287eda5Douglas Gregor XMesaContext c; 1477f70d12dbd49fcc25f1dfc0127217112ae76bcb8fChandler Carruth GLcontext *mesaCtx; 14787f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor struct dd_function_table functions; 147914f79002e58556798e86168c63e48d533287eda5Douglas Gregor TNLcontext *tnl; 148014f79002e58556798e86168c63e48d533287eda5Douglas Gregor 1481f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor if (firstTime) { 1482f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor _glthread_INIT_MUTEX(_xmesa_lock); 148314f79002e58556798e86168c63e48d533287eda5Douglas Gregor firstTime = GL_FALSE; 148414f79002e58556798e86168c63e48d533287eda5Douglas Gregor } 148514f79002e58556798e86168c63e48d533287eda5Douglas Gregor 148614f79002e58556798e86168c63e48d533287eda5Douglas Gregor /* Note: the XMesaContext contains a Mesa GLcontext struct (inheritance) */ 1487bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregor c = (XMesaContext) CALLOC_STRUCT(xmesa_context); 148814f79002e58556798e86168c63e48d533287eda5Douglas Gregor if (!c) 148914f79002e58556798e86168c63e48d533287eda5Douglas Gregor return NULL; 1490b1c86492f9a9bef01a4567408c22f961bbd604feArgyrios Kyrtzidis 1491b1c86492f9a9bef01a4567408c22f961bbd604feArgyrios Kyrtzidis mesaCtx = &(c->mesa); 1492b1c86492f9a9bef01a4567408c22f961bbd604feArgyrios Kyrtzidis 1493b1c86492f9a9bef01a4567408c22f961bbd604feArgyrios Kyrtzidis /* initialize with default driver functions, then plug in XMesa funcs */ 149414f79002e58556798e86168c63e48d533287eda5Douglas Gregor _mesa_init_driver_functions(&functions); 149514f79002e58556798e86168c63e48d533287eda5Douglas Gregor xmesa_init_driver_functions(v, &functions); 14961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!_mesa_initialize_context(mesaCtx, &v->mesa_visual, 14972d52be56ff595341be3c6cec337af6763804ce66Douglas Gregor share_list ? &(share_list->mesa) : (GLcontext *) NULL, 1498b1c86492f9a9bef01a4567408c22f961bbd604feArgyrios Kyrtzidis &functions, (void *) c)) { 1499b1c86492f9a9bef01a4567408c22f961bbd604feArgyrios Kyrtzidis _mesa_free(c); 15002d52be56ff595341be3c6cec337af6763804ce66Douglas Gregor return NULL; 1501e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor } 1502b1c86492f9a9bef01a4567408c22f961bbd604feArgyrios Kyrtzidis 1503fbfd180495e7800975c6d9bdc6d24e706ef70e34Michael J. Spencer _mesa_enable_sw_extensions(mesaCtx); 15042c10c8072cabeb22651462e435e8b81f3221b6a5Anders Carlsson _mesa_enable_1_3_extensions(mesaCtx); 15052c10c8072cabeb22651462e435e8b81f3221b6a5Anders Carlsson _mesa_enable_1_4_extensions(mesaCtx); 15062c10c8072cabeb22651462e435e8b81f3221b6a5Anders Carlsson _mesa_enable_1_5_extensions(mesaCtx); 15072c10c8072cabeb22651462e435e8b81f3221b6a5Anders Carlsson _mesa_enable_2_0_extensions(mesaCtx); 15082c10c8072cabeb22651462e435e8b81f3221b6a5Anders Carlsson#if ENABLE_EXT_texure_compression_s3tc 15092c10c8072cabeb22651462e435e8b81f3221b6a5Anders Carlsson if (c->Mesa_DXTn) { 15102c10c8072cabeb22651462e435e8b81f3221b6a5Anders Carlsson _mesa_enable_extension(mesaCtx, "GL_EXT_texture_compression_s3tc"); 1511fbfd180495e7800975c6d9bdc6d24e706ef70e34Michael J. Spencer _mesa_enable_extension(mesaCtx, "GL_S3_s3tc"); 1512aba54a95e9d5e4dc9056abec6bb70ea777c4a7bcKovarththanan Rajaratnam } 15131eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump _mesa_enable_extension(mesaCtx, "GL_3DFX_texture_compression_FXT1"); 1514e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor#endif 1515ec312a1f0557b1d27f3eb6cf49acbf7e72696422Daniel Dunbar#if ENABLE_EXT_timer_query 151614f79002e58556798e86168c63e48d533287eda5Douglas Gregor _mesa_enable_extension(mesaCtx, "GL_EXT_timer_query"); 151714f79002e58556798e86168c63e48d533287eda5Douglas Gregor#endif 151814f79002e58556798e86168c63e48d533287eda5Douglas Gregor 151914f79002e58556798e86168c63e48d533287eda5Douglas Gregor#ifdef XFree86Server 152014f79002e58556798e86168c63e48d533287eda5Douglas Gregor /* If we're running in the X server, do bounds checking to prevent 152114f79002e58556798e86168c63e48d533287eda5Douglas Gregor * segfaults and server crashes! 152214f79002e58556798e86168c63e48d533287eda5Douglas Gregor */ 152336c35ba0aca641e60e5dbee8efbc620c08b9bd61Douglas Gregor mesaCtx->Const.CheckArrayBounds = GL_TRUE; 1524e127a0d80155b45dafe77f2b4380e5fa111a3345Chris Lattner#endif 152514f79002e58556798e86168c63e48d533287eda5Douglas Gregor 1526ec312a1f0557b1d27f3eb6cf49acbf7e72696422Daniel Dunbar /* finish up xmesa context initializations */ 15275f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner c->swapbytes = CHECK_BYTE_ORDER(v) ? GL_FALSE : GL_TRUE; 152814f79002e58556798e86168c63e48d533287eda5Douglas Gregor c->xm_visual = v; 15298538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl c->xm_buffer = NULL; /* set later by XMesaMakeCurrent */ 1530c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor c->display = v->display; 15315f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner c->pixelformat = v->dithered_pf; /* Dithering is enabled by default */ 1532ec312a1f0557b1d27f3eb6cf49acbf7e72696422Daniel Dunbar 15337f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor /* Initialize the software rasterizer and helper modules. 1534f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor */ 1535f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor if (!_swrast_CreateContext( mesaCtx ) || 1536f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor !_vbo_CreateContext( mesaCtx ) || 153714f79002e58556798e86168c63e48d533287eda5Douglas Gregor !_tnl_CreateContext( mesaCtx ) || 153814f79002e58556798e86168c63e48d533287eda5Douglas Gregor !_swsetup_CreateContext( mesaCtx )) { 1539f70d12dbd49fcc25f1dfc0127217112ae76bcb8fChandler Carruth _mesa_free_context_data(&c->mesa); 15401728762d5a8cfaf8d64385f47b311e84de1ae7a2Chandler Carruth _mesa_free(c); 154178df836808aee22c3157e1bc23bc4ec569b80568Chandler Carruth return NULL; 154278df836808aee22c3157e1bc23bc4ec569b80568Chandler Carruth } 154378df836808aee22c3157e1bc23bc4ec569b80568Chandler Carruth 154414f79002e58556798e86168c63e48d533287eda5Douglas Gregor /* tnl setup */ 1545f60e9918690fcf02974bc1ebecd42c99d561855eDouglas Gregor tnl = TNL_CONTEXT(mesaCtx); 1546f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor tnl->Driver.RunPipeline = _tnl_run_pipeline; 1547bdfe48ac80573e026595af91e541474dbf02565fDouglas Gregor /* swrast setup */ 1548f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor xmesa_register_swrast_functions( mesaCtx ); 1549f60e9918690fcf02974bc1ebecd42c99d561855eDouglas Gregor _swsetup_Wakeup(mesaCtx); 1550f70d12dbd49fcc25f1dfc0127217112ae76bcb8fChandler Carruth 155114f79002e58556798e86168c63e48d533287eda5Douglas Gregor return c; 155214f79002e58556798e86168c63e48d533287eda5Douglas Gregor} 155314f79002e58556798e86168c63e48d533287eda5Douglas Gregor 15547f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor 1555bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregor 15567f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas GregorPUBLIC 15577f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregorvoid XMesaDestroyContext( XMesaContext c ) 15582eafc1b56347f772729e082e6bac824b0ef1b585Douglas Gregor{ 15593397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl GLcontext *mesaCtx = &c->mesa; 15607f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor#ifdef FX 15617f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor XMesaBuffer xmbuf = XMESA_BUFFER(mesaCtx->DrawBuffer); 15627f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor 15638538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl if (xmbuf && xmbuf->FXctx) 15647f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor fxMesaDestroyContext(xmbuf->FXctx); 1565f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor#endif 15667f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor _swsetup_DestroyContext( mesaCtx ); 15677f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor _swrast_DestroyContext( mesaCtx ); 15681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump _tnl_DestroyContext( mesaCtx ); 15697f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor _vbo_DestroyContext( mesaCtx ); 15708538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl _mesa_free_context_data( mesaCtx ); 15717f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor _mesa_free( c ); 1572f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor} 15736e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer 15747f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor 15754cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis 15764cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis/** 15774cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis * Private function for creating an XMesaBuffer which corresponds to an 15784cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis * X window or pixmap. 15794cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis * \param v the window's XMesaVisual 15804cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis * \param w the window we're wrapping 15814cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis * \return new XMesaBuffer or NULL if error 15824cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis */ 15834cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios KyrtzidisPUBLIC XMesaBuffer 15844cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios KyrtzidisXMesaCreateWindowBuffer(XMesaVisual v, XMesaWindow w) 15854cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis{ 15864cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis#ifndef XFree86Server 15873397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl XWindowAttributes attr; 15887f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor#endif 15898538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl int client = 0; 1590f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor XMesaBuffer b; 1591f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor XMesaColormap cmap; 1592f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor 1593f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor assert(v); 1594f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor assert(w); 1595f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor 1596f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor /* Check that window depth matches visual depth */ 1597f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor#ifdef XFree86Server 1598f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor client = CLIENT_ID(((XMesaDrawable)w)->id); 1599f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor 1600f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor if (GET_VISUAL_DEPTH(v) != ((XMesaDrawable)w)->depth) { 1601f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor _mesa_warning(NULL, "XMesaCreateWindowBuffer: depth mismatch between visual (%d) and window (%d)!\n", 1602f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor GET_VISUAL_DEPTH(v), ((XMesaDrawable) w)->depth); 1603f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor return NULL; 1604f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor } 1605f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor#else 1606f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor XGetWindowAttributes( v->display, w, &attr ); 1607f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor 1608f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor if (GET_VISUAL_DEPTH(v) != attr.depth) { 1609f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor _mesa_warning(NULL, "XMesaCreateWindowBuffer: depth mismatch between visual (%d) and window (%d)!\n", 1610f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor GET_VISUAL_DEPTH(v), attr.depth); 1611f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor return NULL; 1612f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor } 1613f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor#endif 1614f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor 1615f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor /* Find colormap */ 1616f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor#ifdef XFree86Server 1617f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor cmap = (ColormapPtr)LookupIDByType(wColormap(w), RT_COLORMAP); 1618f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor#else 1619f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor if (attr.colormap) { 1620f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor cmap = attr.colormap; 1621f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor } 1622f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor else { 1623f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor _mesa_warning(NULL, "Window %u has no colormap!\n", (unsigned int) w); 1624f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor /* this is weird, a window w/out a colormap!? */ 1625f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor /* OK, let's just allocate a new one and hope for the best */ 1626f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor cmap = XCreateColormap(v->display, w, attr.visual, AllocNone); 1627f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor } 1628f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor#endif 1629f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor 1630f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor b = create_xmesa_buffer((XMesaDrawable) w, WINDOW, v, cmap); 1631f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor if (!b) 1632f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor return NULL; 163314f79002e58556798e86168c63e48d533287eda5Douglas Gregor 163414f79002e58556798e86168c63e48d533287eda5Douglas Gregor if (!initialize_visual_and_buffer( client, v, b, v->mesa_visual.rgbMode, 16354fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor (XMesaDrawable) w, cmap )) { 16364fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor xmesa_free_buffer(b); 16374fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor return NULL; 16384fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor } 16399c7361006b8cd95333958150dd0c803261807b68Douglas Gregor 16409c7361006b8cd95333958150dd0c803261807b68Douglas Gregor return b; 16419c7361006b8cd95333958150dd0c803261807b68Douglas Gregor} 16429c7361006b8cd95333958150dd0c803261807b68Douglas Gregor 16439c7361006b8cd95333958150dd0c803261807b68Douglas Gregor 16449c7361006b8cd95333958150dd0c803261807b68Douglas Gregor 16459c7361006b8cd95333958150dd0c803261807b68Douglas Gregor/** 16469c7361006b8cd95333958150dd0c803261807b68Douglas Gregor * Create a new XMesaBuffer from an X pixmap. 16470b1fb988012da21d996c43e36867787a7a07b889Chris Lattner * 16480b1fb988012da21d996c43e36867787a7a07b889Chris Lattner * \param v the XMesaVisual 16490b1fb988012da21d996c43e36867787a7a07b889Chris Lattner * \param p the pixmap 1650a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl * \param cmap the colormap, may be 0 if using a \c GLX_TRUE_COLOR or 16517c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner * \c GLX_DIRECT_COLOR visual for the pixmap 16527c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner * \returns new XMesaBuffer or NULL if error 1653c1f9d828c733ec1eba06d01070735d1f36fda733Chris Lattner */ 1654c1f9d828c733ec1eba06d01070735d1f36fda733Chris LattnerPUBLIC XMesaBuffer 1655c1f9d828c733ec1eba06d01070735d1f36fda733Chris LattnerXMesaCreatePixmapBuffer(XMesaVisual v, XMesaPixmap p, XMesaColormap cmap) 16568538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl{ 1657c1f9d828c733ec1eba06d01070735d1f36fda733Chris Lattner int client = 0; 16582eafc1b56347f772729e082e6bac824b0ef1b585Douglas Gregor XMesaBuffer b; 16592eafc1b56347f772729e082e6bac824b0ef1b585Douglas Gregor 16602eafc1b56347f772729e082e6bac824b0ef1b585Douglas Gregor assert(v); 1661ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor 16621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump b = create_xmesa_buffer((XMesaDrawable) p, PIXMAP, v, cmap); 16633397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl if (!b) 16642eafc1b56347f772729e082e6bac824b0ef1b585Douglas Gregor return NULL; 16652eafc1b56347f772729e082e6bac824b0ef1b585Douglas Gregor 16662eafc1b56347f772729e082e6bac824b0ef1b585Douglas Gregor#ifdef XFree86Server 16671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump client = CLIENT_ID(((XMesaDrawable)p)->id); 1668ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor#endif 16697c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner 16707c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner if (!initialize_visual_and_buffer(client, v, b, v->mesa_visual.rgbMode, 16716a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor (XMesaDrawable) p, cmap)) { 167220249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer xmesa_free_buffer(b); 16739c7361006b8cd95333958150dd0c803261807b68Douglas Gregor return NULL; 16745f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner } 16759c7361006b8cd95333958150dd0c803261807b68Douglas Gregor 16769c7361006b8cd95333958150dd0c803261807b68Douglas Gregor return b; 1677040a804f852c45c8b8c371ce1d421fd4cd84b6fbDouglas Gregor} 1678040a804f852c45c8b8c371ce1d421fd4cd84b6fbDouglas Gregor 16797c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner 16809c7361006b8cd95333958150dd0c803261807b68Douglas Gregor 16819c7361006b8cd95333958150dd0c803261807b68Douglas GregorXMesaBuffer 16829c7361006b8cd95333958150dd0c803261807b68Douglas GregorXMesaCreatePBuffer(XMesaVisual v, XMesaColormap cmap, 16839c7361006b8cd95333958150dd0c803261807b68Douglas Gregor unsigned int width, unsigned int height) 16849c7361006b8cd95333958150dd0c803261807b68Douglas Gregor{ 16859c7361006b8cd95333958150dd0c803261807b68Douglas Gregor#ifdef XFree86Server 16869c7361006b8cd95333958150dd0c803261807b68Douglas Gregor return 0; 16879c7361006b8cd95333958150dd0c803261807b68Douglas Gregor#else 16889c7361006b8cd95333958150dd0c803261807b68Douglas Gregor int client = 0; 1689040a804f852c45c8b8c371ce1d421fd4cd84b6fbDouglas Gregor XMesaWindow root; 1690040a804f852c45c8b8c371ce1d421fd4cd84b6fbDouglas Gregor XMesaDrawable drawable; /* X Pixmap Drawable */ 1691040a804f852c45c8b8c371ce1d421fd4cd84b6fbDouglas Gregor XMesaBuffer b; 1692040a804f852c45c8b8c371ce1d421fd4cd84b6fbDouglas Gregor 1693040a804f852c45c8b8c371ce1d421fd4cd84b6fbDouglas Gregor /* allocate pixmap for front buffer */ 1694040a804f852c45c8b8c371ce1d421fd4cd84b6fbDouglas Gregor root = RootWindow( v->display, v->visinfo->screen ); 1695040a804f852c45c8b8c371ce1d421fd4cd84b6fbDouglas Gregor drawable = XCreatePixmap(v->display, root, width, height, 1696040a804f852c45c8b8c371ce1d421fd4cd84b6fbDouglas Gregor v->visinfo->depth); 1697040a804f852c45c8b8c371ce1d421fd4cd84b6fbDouglas Gregor if (!drawable) 16989c7361006b8cd95333958150dd0c803261807b68Douglas Gregor return NULL; 16999c7361006b8cd95333958150dd0c803261807b68Douglas Gregor 17009c7361006b8cd95333958150dd0c803261807b68Douglas Gregor b = create_xmesa_buffer(drawable, PBUFFER, v, cmap); 1701040a804f852c45c8b8c371ce1d421fd4cd84b6fbDouglas Gregor if (!b) 1702040a804f852c45c8b8c371ce1d421fd4cd84b6fbDouglas Gregor return NULL; 1703040a804f852c45c8b8c371ce1d421fd4cd84b6fbDouglas Gregor 17043397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl if (!initialize_visual_and_buffer(client, v, b, v->mesa_visual.rgbMode, 17057c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner drawable, cmap)) { 17063397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl xmesa_free_buffer(b); 1707ee9b0ba29094eb177a285e726ab96e979e5b9c61Douglas Gregor return NULL; 1708ee9b0ba29094eb177a285e726ab96e979e5b9c61Douglas Gregor } 1709ee9b0ba29094eb177a285e726ab96e979e5b9c61Douglas Gregor 1710ee9b0ba29094eb177a285e726ab96e979e5b9c61Douglas Gregor return b; 1711ee9b0ba29094eb177a285e726ab96e979e5b9c61Douglas Gregor#endif 171220249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer} 17139c7361006b8cd95333958150dd0c803261807b68Douglas Gregor 17147c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner 17157c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner 17169c7361006b8cd95333958150dd0c803261807b68Douglas Gregor/* 17179c7361006b8cd95333958150dd0c803261807b68Douglas Gregor * Deallocate an XMesaBuffer structure and all related info. 17187c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner */ 17197c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris LattnerPUBLIC void 17201eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpXMesaDestroyBuffer(XMesaBuffer b) 17217c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner{ 17227c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner xmesa_free_buffer(b); 17238538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl} 17247c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner 17258538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl 17261eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/** 17277c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner * Query the current window size and update the corresponding GLframebuffer 17287c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner * and all attached renderbuffers. 17297c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner * Called when: 17307c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner * 1. the first time a buffer is bound to a context. 17317c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner * 2. from glViewport to poll for window size changes 17327356a31327be9b3c3434a0c88746028980da5684Chris Lattner * 3. from the XMesaResizeBuffers() API function. 17337c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner * Note: it's possible (and legal) for xmctx to be NULL. That can happen 173420249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer * when resizing a buffer when no rendering context is bound. 17356a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor */ 17366a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregorvoid 17376a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregorxmesa_check_and_update_buffer_size(XMesaContext xmctx, XMesaBuffer drawBuffer) 17386a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor{ 173920249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer GLuint width, height; 1740c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor xmesa_get_window_size(drawBuffer->display, drawBuffer, &width, &height); 17417c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner if (drawBuffer->mesa_buffer.Width != width || 1742f04ad69fed38d26fc0d6f7d6fd0a4631ddfbc7feChris Lattner drawBuffer->mesa_buffer.Height != height) { 1743df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner GLcontext *ctx = xmctx ? &xmctx->mesa : NULL; 1744df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner _mesa_resize_framebuffer(ctx, &(drawBuffer->mesa_buffer), width, height); 1745df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner } 1746df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner drawBuffer->mesa_buffer.Initialized = GL_TRUE; /* XXX TEMPORARY? */ 1747df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner} 1748df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner 17491eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1750df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner/* 1751df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner * Bind buffer b to context c and make c the current rendering context. 1752df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner */ 1753df961c28f84666051ad59d2da1f44023f6366d02Chris LattnerGLboolean XMesaMakeCurrent( XMesaContext c, XMesaBuffer b ) 1754df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner{ 17557356a31327be9b3c3434a0c88746028980da5684Chris Lattner return XMesaMakeCurrent2( c, b, b ); 1756df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner} 1757df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner 1758df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner 1759df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner/* 17601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump * Bind buffer b to context c and make c the current rendering context. 17618538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl */ 1762df961c28f84666051ad59d2da1f44023f6366d02Chris LattnerPUBLIC 1763df961c28f84666051ad59d2da1f44023f6366d02Chris LattnerGLboolean XMesaMakeCurrent2( XMesaContext c, XMesaBuffer drawBuffer, 176437e2684abfe38207fdb90620da062bb18c23f29aDouglas Gregor XMesaBuffer readBuffer ) 17657c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner{ 17664800a5c79023271408af49797e09be32aca93232Douglas Gregor if (c) { 17674800a5c79023271408af49797e09be32aca93232Douglas Gregor if (!drawBuffer || !readBuffer) 17684800a5c79023271408af49797e09be32aca93232Douglas Gregor return GL_FALSE; /* must specify buffers! */ 17694800a5c79023271408af49797e09be32aca93232Douglas Gregor 17704800a5c79023271408af49797e09be32aca93232Douglas Gregor#ifdef FX 17714800a5c79023271408af49797e09be32aca93232Douglas Gregor if (drawBuffer->FXctx) { 17724800a5c79023271408af49797e09be32aca93232Douglas Gregor fxMesaMakeCurrent(drawBuffer->FXctx); 17734800a5c79023271408af49797e09be32aca93232Douglas Gregor 17744800a5c79023271408af49797e09be32aca93232Douglas Gregor c->xm_buffer = drawBuffer; 17754800a5c79023271408af49797e09be32aca93232Douglas Gregor 17764800a5c79023271408af49797e09be32aca93232Douglas Gregor return GL_TRUE; 17774800a5c79023271408af49797e09be32aca93232Douglas Gregor } 177820249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer#endif 17796a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor if (&(c->mesa) == _mesa_get_current_context() 17806a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor && c->mesa.DrawBuffer == &drawBuffer->mesa_buffer 17814800a5c79023271408af49797e09be32aca93232Douglas Gregor && c->mesa.ReadBuffer == &readBuffer->mesa_buffer 17824800a5c79023271408af49797e09be32aca93232Douglas Gregor && XMESA_BUFFER(c->mesa.DrawBuffer)->wasCurrent) { 17834800a5c79023271408af49797e09be32aca93232Douglas Gregor /* same context and buffer, do nothing */ 17844800a5c79023271408af49797e09be32aca93232Douglas Gregor return GL_TRUE; 17854800a5c79023271408af49797e09be32aca93232Douglas Gregor } 17864800a5c79023271408af49797e09be32aca93232Douglas Gregor 17874800a5c79023271408af49797e09be32aca93232Douglas Gregor c->xm_buffer = drawBuffer; 17884800a5c79023271408af49797e09be32aca93232Douglas Gregor 17894800a5c79023271408af49797e09be32aca93232Douglas Gregor /* Call this periodically to detect when the user has begun using 17904800a5c79023271408af49797e09be32aca93232Douglas Gregor * GL rendering from multiple threads. 17914800a5c79023271408af49797e09be32aca93232Douglas Gregor */ 17924800a5c79023271408af49797e09be32aca93232Douglas Gregor _glapi_check_multithread(); 17934800a5c79023271408af49797e09be32aca93232Douglas Gregor 17944800a5c79023271408af49797e09be32aca93232Douglas Gregor xmesa_check_and_update_buffer_size(c, drawBuffer); 17954800a5c79023271408af49797e09be32aca93232Douglas Gregor if (readBuffer != drawBuffer) 17964800a5c79023271408af49797e09be32aca93232Douglas Gregor xmesa_check_and_update_buffer_size(c, readBuffer); 17974800a5c79023271408af49797e09be32aca93232Douglas Gregor 1798272b6bc6a6c8fc04f951ad850df68c44d137f513Douglas Gregor _mesa_make_current(&(c->mesa), 1799272b6bc6a6c8fc04f951ad850df68c44d137f513Douglas Gregor &drawBuffer->mesa_buffer, 1800272b6bc6a6c8fc04f951ad850df68c44d137f513Douglas Gregor &readBuffer->mesa_buffer); 1801272b6bc6a6c8fc04f951ad850df68c44d137f513Douglas Gregor 18024800a5c79023271408af49797e09be32aca93232Douglas Gregor if (c->xm_visual->mesa_visual.rgbMode) { 18038f1231b70c2b1f6fe0cee097b447487b26810301Douglas Gregor /* 18044800a5c79023271408af49797e09be32aca93232Douglas Gregor * Must recompute and set these pixel values because colormap 18054800a5c79023271408af49797e09be32aca93232Douglas Gregor * can be different for different windows. 18067338a922dd1164002922163200b18a2c24eb0209Douglas Gregor */ 18077338a922dd1164002922163200b18a2c24eb0209Douglas Gregor c->clearpixel = xmesa_color_to_pixel( &c->mesa, 18084800a5c79023271408af49797e09be32aca93232Douglas Gregor c->clearcolor[0], 180920249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer c->clearcolor[1], 18104800a5c79023271408af49797e09be32aca93232Douglas Gregor c->clearcolor[2], 18114800a5c79023271408af49797e09be32aca93232Douglas Gregor c->clearcolor[3], 18124800a5c79023271408af49797e09be32aca93232Douglas Gregor c->xm_visual->undithered_pf); 18134800a5c79023271408af49797e09be32aca93232Douglas Gregor XMesaSetForeground(c->display, drawBuffer->cleargc, c->clearpixel); 18144800a5c79023271408af49797e09be32aca93232Douglas Gregor } 18154800a5c79023271408af49797e09be32aca93232Douglas Gregor 18166a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor /* Solution to Stephane Rehel's problem with glXReleaseBuffersMESA(): */ 18174800a5c79023271408af49797e09be32aca93232Douglas Gregor drawBuffer->wasCurrent = GL_TRUE; 181889d9980bbc2e4a4ac86673e6ec16fb9f5babb63bDouglas Gregor } 181989d9980bbc2e4a4ac86673e6ec16fb9f5babb63bDouglas Gregor else { 182089d9980bbc2e4a4ac86673e6ec16fb9f5babb63bDouglas Gregor /* Detach */ 18218f1231b70c2b1f6fe0cee097b447487b26810301Douglas Gregor _mesa_make_current( NULL, NULL, NULL ); 182289d9980bbc2e4a4ac86673e6ec16fb9f5babb63bDouglas Gregor } 18234800a5c79023271408af49797e09be32aca93232Douglas Gregor return GL_TRUE; 18244800a5c79023271408af49797e09be32aca93232Douglas Gregor} 18254800a5c79023271408af49797e09be32aca93232Douglas Gregor 18264800a5c79023271408af49797e09be32aca93232Douglas Gregor 18274800a5c79023271408af49797e09be32aca93232Douglas Gregor/* 18284800a5c79023271408af49797e09be32aca93232Douglas Gregor * Unbind the context c from its buffer. 18294800a5c79023271408af49797e09be32aca93232Douglas Gregor */ 18304800a5c79023271408af49797e09be32aca93232Douglas GregorGLboolean XMesaUnbindContext( XMesaContext c ) 183189d9980bbc2e4a4ac86673e6ec16fb9f5babb63bDouglas Gregor{ 18327338a922dd1164002922163200b18a2c24eb0209Douglas Gregor /* A no-op for XFree86 integration purposes */ 18334800a5c79023271408af49797e09be32aca93232Douglas Gregor return GL_TRUE; 18344800a5c79023271408af49797e09be32aca93232Douglas Gregor} 18354800a5c79023271408af49797e09be32aca93232Douglas Gregor 18364800a5c79023271408af49797e09be32aca93232Douglas Gregor 18374800a5c79023271408af49797e09be32aca93232Douglas GregorXMesaContext XMesaGetCurrentContext( void ) 18384800a5c79023271408af49797e09be32aca93232Douglas Gregor{ 18394800a5c79023271408af49797e09be32aca93232Douglas Gregor GET_CURRENT_CONTEXT(ctx); 18404800a5c79023271408af49797e09be32aca93232Douglas Gregor if (ctx) { 18414800a5c79023271408af49797e09be32aca93232Douglas Gregor XMesaContext xmesa = XMESA_CONTEXT(ctx); 18424800a5c79023271408af49797e09be32aca93232Douglas Gregor return xmesa; 18434800a5c79023271408af49797e09be32aca93232Douglas Gregor } 18444800a5c79023271408af49797e09be32aca93232Douglas Gregor else { 18458f1231b70c2b1f6fe0cee097b447487b26810301Douglas Gregor return 0; 18464800a5c79023271408af49797e09be32aca93232Douglas Gregor } 18479e5bb85ac899eeab7c21b5ff9030c3da6ff4837bChandler Carruth} 18487338a922dd1164002922163200b18a2c24eb0209Douglas Gregor 18499e5bb85ac899eeab7c21b5ff9030c3da6ff4837bChandler Carruth 18509e5bb85ac899eeab7c21b5ff9030c3da6ff4837bChandler CarruthXMesaBuffer XMesaGetCurrentBuffer( void ) 18519e5bb85ac899eeab7c21b5ff9030c3da6ff4837bChandler Carruth{ 18529e5bb85ac899eeab7c21b5ff9030c3da6ff4837bChandler Carruth GET_CURRENT_CONTEXT(ctx); 1853f70d12dbd49fcc25f1dfc0127217112ae76bcb8fChandler Carruth if (ctx) { 18544800a5c79023271408af49797e09be32aca93232Douglas Gregor XMesaBuffer xmbuf = XMESA_BUFFER(ctx->DrawBuffer); 18556a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor return xmbuf; 185620249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer } 18574800a5c79023271408af49797e09be32aca93232Douglas Gregor else { 18584800a5c79023271408af49797e09be32aca93232Douglas Gregor return 0; 18597338a922dd1164002922163200b18a2c24eb0209Douglas Gregor } 18604800a5c79023271408af49797e09be32aca93232Douglas Gregor} 18614800a5c79023271408af49797e09be32aca93232Douglas Gregor 18624800a5c79023271408af49797e09be32aca93232Douglas Gregor 18634800a5c79023271408af49797e09be32aca93232Douglas Gregor/* New in Mesa 3.1 */ 18644800a5c79023271408af49797e09be32aca93232Douglas GregorXMesaBuffer XMesaGetCurrentReadBuffer( void ) 18654800a5c79023271408af49797e09be32aca93232Douglas Gregor{ 18664800a5c79023271408af49797e09be32aca93232Douglas Gregor GET_CURRENT_CONTEXT(ctx); 18674800a5c79023271408af49797e09be32aca93232Douglas Gregor if (ctx) { 18684800a5c79023271408af49797e09be32aca93232Douglas Gregor return XMESA_BUFFER(ctx->ReadBuffer); 18694800a5c79023271408af49797e09be32aca93232Douglas Gregor } 18704800a5c79023271408af49797e09be32aca93232Douglas Gregor else { 18714800a5c79023271408af49797e09be32aca93232Douglas Gregor return 0; 18724800a5c79023271408af49797e09be32aca93232Douglas Gregor } 18734800a5c79023271408af49797e09be32aca93232Douglas Gregor} 1874c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor 187520249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer 18766a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor#ifdef XFree86Server 18776a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas GregorPUBLIC 18786a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas GregorGLboolean XMesaForceCurrent(XMesaContext c) 18796a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor{ 18806a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor if (c) { 18818538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl#ifdef XGLServer 18826a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor _glapi_set_dispatch(c->mesa.CurrentDispatch); 1883272b6bc6a6c8fc04f951ad850df68c44d137f513Douglas Gregor#endif 18846a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor 1885fb2d9e092f19cfcdd11ebd5ceac40456c090c7dbDouglas Gregor if (&(c->mesa) != _mesa_get_current_context()) { 18866a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor _mesa_make_current(&c->mesa, c->mesa.DrawBuffer, c->mesa.ReadBuffer); 18876a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor } 188820249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer } 18896a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor else { 18908538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl _mesa_make_current(NULL, NULL, NULL); 18916a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor } 1892272b6bc6a6c8fc04f951ad850df68c44d137f513Douglas Gregor return GL_TRUE; 18936a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor} 1894fb2d9e092f19cfcdd11ebd5ceac40456c090c7dbDouglas Gregor 18956a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor 18966e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin KramerPUBLIC 18976a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas GregorGLboolean XMesaLoseCurrent(XMesaContext c) 18980b1fb988012da21d996c43e36867787a7a07b889Chris Lattner{ 18990b1fb988012da21d996c43e36867787a7a07b889Chris Lattner (void) c; 19003efd52cf8f4e57c5571bd8cc3168264c3bc46a1eArgyrios Kyrtzidis _mesa_make_current(NULL, NULL, NULL); 1901f41d3be39980d40849850d3fb90403623cc8459eArgyrios Kyrtzidis return GL_TRUE; 19023efd52cf8f4e57c5571bd8cc3168264c3bc46a1eArgyrios Kyrtzidis} 19033efd52cf8f4e57c5571bd8cc3168264c3bc46a1eArgyrios Kyrtzidis 19043efd52cf8f4e57c5571bd8cc3168264c3bc46a1eArgyrios Kyrtzidis 19053efd52cf8f4e57c5571bd8cc3168264c3bc46a1eArgyrios KyrtzidisPUBLIC 19063efd52cf8f4e57c5571bd8cc3168264c3bc46a1eArgyrios KyrtzidisGLboolean XMesaCopyContext( XMesaContext xm_src, XMesaContext xm_dst, GLuint mask ) 19073efd52cf8f4e57c5571bd8cc3168264c3bc46a1eArgyrios Kyrtzidis{ 19083efd52cf8f4e57c5571bd8cc3168264c3bc46a1eArgyrios Kyrtzidis _mesa_copy_context(&xm_src->mesa, &xm_dst->mesa, mask); 19093efd52cf8f4e57c5571bd8cc3168264c3bc46a1eArgyrios Kyrtzidis return GL_TRUE; 19103efd52cf8f4e57c5571bd8cc3168264c3bc46a1eArgyrios Kyrtzidis} 19113efd52cf8f4e57c5571bd8cc3168264c3bc46a1eArgyrios Kyrtzidis#endif /* XFree86Server */ 19123efd52cf8f4e57c5571bd8cc3168264c3bc46a1eArgyrios Kyrtzidis 19133efd52cf8f4e57c5571bd8cc3168264c3bc46a1eArgyrios Kyrtzidis 19143efd52cf8f4e57c5571bd8cc3168264c3bc46a1eArgyrios Kyrtzidis#ifndef FX 19153efd52cf8f4e57c5571bd8cc3168264c3bc46a1eArgyrios KyrtzidisGLboolean XMesaSetFXmode( GLint mode ) 19163efd52cf8f4e57c5571bd8cc3168264c3bc46a1eArgyrios Kyrtzidis{ 1917f41d3be39980d40849850d3fb90403623cc8459eArgyrios Kyrtzidis (void) mode; 19183efd52cf8f4e57c5571bd8cc3168264c3bc46a1eArgyrios Kyrtzidis return GL_FALSE; 19193efd52cf8f4e57c5571bd8cc3168264c3bc46a1eArgyrios Kyrtzidis} 1920f41d3be39980d40849850d3fb90403623cc8459eArgyrios Kyrtzidis#endif 1921f41d3be39980d40849850d3fb90403623cc8459eArgyrios Kyrtzidis 192260f7684881f9f6bc779e91212aea89d9afc723ddArgyrios Kyrtzidis 19233efd52cf8f4e57c5571bd8cc3168264c3bc46a1eArgyrios Kyrtzidis 1924f41d3be39980d40849850d3fb90403623cc8459eArgyrios Kyrtzidis/* 1925f41d3be39980d40849850d3fb90403623cc8459eArgyrios Kyrtzidis * Copy the back buffer to the front buffer. If there's no back buffer 1926c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson * this is a no-op. 1927c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson */ 1928c850578dbfa68cf2d2776f59a5cb0009134d970eAnders CarlssonPUBLIC 1929c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlssonvoid XMesaSwapBuffers( XMesaBuffer b ) 1930c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson{ 1931c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson GET_CURRENT_CONTEXT(ctx); 1932c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson 1933c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson if (!b->backxrb) { 1934c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson /* single buffered */ 1935c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson return; 1936c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson } 1937c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson 1938c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson /* If we're swapping the buffer associated with the current context 1939c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson * we have to flush any pending rendering commands first. 1940c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson */ 1941e92b8a1dbba150e213c4980710fcb59ec5c5c570Douglas Gregor if (ctx && ctx->DrawBuffer == &(b->mesa_buffer)) 1942c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson _mesa_notifySwapBuffers(ctx); 1943c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson 1944c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson if (b->db_mode) { 1945c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson#ifdef FX 19466e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer if (FXswapBuffers(b)) 1947c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson return; 1948c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson#endif 19494fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor if (b->backxrb->ximage) { 19504fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor /* Copy Ximage (back buf) from client memory to server window */ 19514fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor#if defined(USE_XSHM) && !defined(XFree86Server) 19520b1fb988012da21d996c43e36867787a7a07b889Chris Lattner if (b->shm) { 19533397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl /*_glthread_LOCK_MUTEX(_xmesa_lock);*/ 1954a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl XShmPutImage( b->xm_visual->display, b->frontxrb->drawable, 195501b81c4d074bba9c18372d521405dfe32fc4f552Argyrios Kyrtzidis b->swapgc, 1956c8e5d51f51e46c6f7717761537c6609ef9daf57cArgyrios Kyrtzidis b->backxrb->ximage, 0, 0, 1957c8e5d51f51e46c6f7717761537c6609ef9daf57cArgyrios Kyrtzidis 0, 0, b->mesa_buffer.Width, b->mesa_buffer.Height, 19581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump False ); 195997475834207bf5abb5b58534f783c9b71d4b9df1Douglas Gregor /*_glthread_UNLOCK_MUTEX(_xmesa_lock);*/ 196055f48de5f6b10b50f4d88a9f7235f4532f799550Douglas Gregor } 19612cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor else 1962c8e5d51f51e46c6f7717761537c6609ef9daf57cArgyrios Kyrtzidis#endif 1963681d7237e1014bf64dd5ead6bf74ae55cdd19e61Sebastian Redl { 1964c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor /*_glthread_LOCK_MUTEX(_xmesa_lock);*/ 1965681d7237e1014bf64dd5ead6bf74ae55cdd19e61Sebastian Redl XMesaPutImage( b->xm_visual->display, b->frontxrb->drawable, 1966681d7237e1014bf64dd5ead6bf74ae55cdd19e61Sebastian Redl b->swapgc, 1967681d7237e1014bf64dd5ead6bf74ae55cdd19e61Sebastian Redl b->backxrb->ximage, 0, 0, 19682cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 0, 0, b->mesa_buffer.Width, b->mesa_buffer.Height ); 19692cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor /*_glthread_UNLOCK_MUTEX(_xmesa_lock);*/ 19702cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor } 19711eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 19722cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor else if (b->backxrb->pixmap) { 19733397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl /* Copy pixmap (back buf) to window (front buf) on server */ 19740953e767ff7817f97b3ab20896b229891eeff45bJohn McCall /*_glthread_LOCK_MUTEX(_xmesa_lock);*/ 1975a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor XMesaCopyArea( b->xm_visual->display, 1976a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor b->backxrb->pixmap, /* source drawable */ 1977a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor b->frontxrb->drawable, /* dest. drawable */ 19780953e767ff7817f97b3ab20896b229891eeff45bJohn McCall b->swapgc, 19798538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl 0, 0, b->mesa_buffer.Width, b->mesa_buffer.Height, 19800953e767ff7817f97b3ab20896b229891eeff45bJohn McCall 0, 0 /* dest region */ 19810953e767ff7817f97b3ab20896b229891eeff45bJohn McCall ); 19820953e767ff7817f97b3ab20896b229891eeff45bJohn McCall /*_glthread_UNLOCK_MUTEX(_xmesa_lock);*/ 19830953e767ff7817f97b3ab20896b229891eeff45bJohn McCall } 19842cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 1985b7166334d897e1e4e6a5b428fe2d0ec752ef187fMike Stump if (b->swAlpha) 19862cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor _mesa_copy_soft_alpha_renderbuffers(ctx, &b->mesa_buffer); 19872cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor } 19880953e767ff7817f97b3ab20896b229891eeff45bJohn McCall#if !defined(XFree86Server) 19892cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor XSync( b->xm_visual->display, False ); 19902cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#endif 19912cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor} 1992c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor 19930b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor 19940b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor 1995c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor/* 19962cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * Copy sub-region of back buffer to front buffer 19972cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor */ 19984fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregorvoid XMesaCopySubBuffer( XMesaBuffer b, int x, int y, int width, int height ) 19994fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor{ 20004fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor GET_CURRENT_CONTEXT(ctx); 20014fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor 20022cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor /* If we're swapping the buffer associated with the current context 20032cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * we have to flush any pending rendering commands first. 20042cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor */ 20052cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor if (ctx && ctx->DrawBuffer == &(b->mesa_buffer)) 20062cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor _mesa_notifySwapBuffers(ctx); 2007a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl 20082cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor if (!b->backxrb) { 200917945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis /* single buffered */ 20102cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor return; 20112cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor } 2012c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor 20132cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor if (b->db_mode) { 20148538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl int yTop = b->mesa_buffer.Height - y - height; 20155f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner#ifdef FX 201617945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis if (FXswapBuffers(b)) 201717945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis return; 2018eb5e9986e577b1e2bff3cca5973a2494fb593fbbArgyrios Kyrtzidis#endif 20192cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor if (b->backxrb->ximage) { 20202512308525ff328aa992da0b5ee14a488d2ea93aDouglas Gregor /* Copy Ximage from host's memory to server's window */ 20216e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer#if defined(USE_XSHM) && !defined(XFree86Server) 20222cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor if (b->shm) { 20232cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor /* XXX assuming width and height aren't too large! */ 20242cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor XShmPutImage( b->xm_visual->display, b->frontxrb->drawable, 2025a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl b->swapgc, 20261476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl b->backxrb->ximage, x, yTop, 20271476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl x, yTop, width, height, False ); 20281476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl /* wait for finished event??? */ 20291476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl } 20301476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl else 20318538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl#endif 20321476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl { 2033a119da0761cb6b85f53857eaee50f6ad8c5ea0a0Douglas Gregor /* XXX assuming width and height aren't too large! */ 20341476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl XMesaPutImage( b->xm_visual->display, b->frontxrb->drawable, 20351476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl b->swapgc, 20361476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl b->backxrb->ximage, x, yTop, 20378538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl x, yTop, width, height ); 20381476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl } 2039a119da0761cb6b85f53857eaee50f6ad8c5ea0a0Douglas Gregor } 20406e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer else { 20411476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl /* Copy pixmap to window on server */ 20421476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl XMesaCopyArea( b->xm_visual->display, 20431476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl b->backxrb->pixmap, /* source drawable */ 20448538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl b->frontxrb->drawable, /* dest. drawable */ 20451476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl b->swapgc, 2046496c709a6f08f5c502b6f592ddd9ed40f953a5e5Douglas Gregor x, yTop, width, height, /* source region */ 20471476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl x, yTop /* dest region */ 20481476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl ); 20491476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl } 20508538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl } 20511476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl} 20520a14e4bf604a91b035a479235adf4c2f6c9128a2Douglas Gregor 20536e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer 20541476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl/* 20551476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl * Return a pointer to the XMesa backbuffer Pixmap or XImage. This function 20564fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor * is a way to get "under the hood" of X/Mesa so one can manipulate the 20574fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor * back buffer directly. 20584fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor * Output: pixmap - pointer to back buffer's Pixmap, or 0 20594fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor * ximage - pointer to back buffer's XImage, or NULL 20603251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor * Return: GL_TRUE = context is double buffered 2061f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor * GL_FALSE = context is single buffered 20623397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl */ 2063a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl#ifndef XFree86Server 2064f0aaf7a59729a4ae0146e3464ee987745be95829Douglas GregorGLboolean XMesaGetBackBuffer( XMesaBuffer b, 2065f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor XMesaPixmap *pixmap, 2066f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor XMesaImage **ximage ) 2067f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor{ 20681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (b->db_mode) { 20695d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl if (pixmap) 20708538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl *pixmap = b->backxrb->pixmap; 20715d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl if (ximage) 20725d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl *ximage = b->backxrb->ximage; 2073f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor return GL_TRUE; 2074f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor } 20753397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl else { 20761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump *pixmap = 0; 2077f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor *ximage = NULL; 20780eca89e9890db4d8336ce762a5b359a1d58ca02bArgyrios Kyrtzidis return GL_FALSE; 2079f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor } 20801eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump} 20811eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump#endif /* XFree86Server */ 20825f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner 2083f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor 2084f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor/* 2085f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor * Return the depth buffer associated with an XMesaBuffer. 20865d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl * Input: b - the XMesa buffer handle 20875d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl * Output: width, height - size of buffer in pixels 2088f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor * bytesPerValue - bytes per depth value (2 or 4) 2089f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor * buffer - pointer to depth buffer values 2090f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor * Return: GL_TRUE or GL_FALSE to indicate success or failure. 20915d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl */ 2092f0aaf7a59729a4ae0146e3464ee987745be95829Douglas GregorGLboolean XMesaGetDepthBuffer( XMesaBuffer b, GLint *width, GLint *height, 2093f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor GLint *bytesPerValue, void **buffer ) 2094f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor{ 2095f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor struct gl_renderbuffer *rb 2096f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor = b->mesa_buffer.Attachment[BUFFER_DEPTH].Renderbuffer; 2097f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor if (!rb || !rb->Data) { 20981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump *width = 0; 20995f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner *height = 0; 21001eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump *bytesPerValue = 0; 210183941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor *buffer = 0; 210283941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor return GL_FALSE; 2103f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor } 2104f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor else { 2105f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor *width = b->mesa_buffer.Width; 2106f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor *height = b->mesa_buffer.Height; 2107f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor *bytesPerValue = b->mesa_buffer.Visual.depthBits <= 16 21081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ? sizeof(GLushort) : sizeof(GLuint); 2109f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor *buffer = rb->Data; 2110f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor return GL_TRUE; 21111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 21125f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner} 2113a67e58c8fa03c2f1aa7609bf5a436d1adba75eefDouglas Gregor 2114a67e58c8fa03c2f1aa7609bf5a436d1adba75eefDouglas Gregor 21155d05007b7a7883159154e3f65f338a2542d53913Sebastian Redlvoid XMesaFlush( XMesaContext c ) 2116f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor{ 21175d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl if (c && c->xm_visual) { 2118f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor#ifdef XFree86Server 2119f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor /* NOT_NEEDED */ 2120f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor#else 2121f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor XSync( c->xm_visual->display, False ); 2122f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor#endif 21235d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl } 2124f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor} 2125f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor 2126f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor 2127f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor 2128f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregorconst char *XMesaGetString( XMesaContext c, int name ) 2129f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor{ 21305d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl (void) c; 2131f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor if (name==XMESA_VERSION) { 2132f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor return "5.0"; 2133f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor } 21345d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl else if (name==XMESA_EXTENSIONS) { 2135f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor return ""; 2136f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor } 2137f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor else { 2138a67e58c8fa03c2f1aa7609bf5a436d1adba75eefDouglas Gregor return NULL; 2139a67e58c8fa03c2f1aa7609bf5a436d1adba75eefDouglas Gregor } 2140f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor} 2141f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor 2142f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor 2143f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor 2144059612dd3429cef2d61f11950f3d93a40182bf69Sebastian RedlXMesaBuffer XMesaFindBuffer( XMesaDisplay *dpy, XMesaDrawable d ) 2145f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor{ 2146f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor XMesaBuffer b; 2147059612dd3429cef2d61f11950f3d93a40182bf69Sebastian Redl for (b=XMesaBufferList; b; b=b->Next) { 2148059612dd3429cef2d61f11950f3d93a40182bf69Sebastian Redl if (b->frontxrb->drawable == d && b->display == dpy) { 2149a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl return b; 2150f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor } 2151f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor } 2152059612dd3429cef2d61f11950f3d93a40182bf69Sebastian Redl return NULL; 21535d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl} 2154059612dd3429cef2d61f11950f3d93a40182bf69Sebastian Redl 2155e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl 2156059612dd3429cef2d61f11950f3d93a40182bf69Sebastian Redl/** 2157f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor * Free/destroy all XMesaBuffers associated with given display. 21583397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl */ 21595d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidisvoid xmesa_destroy_buffers_on_display(XMesaDisplay *dpy) 21601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump{ 2161059612dd3429cef2d61f11950f3d93a40182bf69Sebastian Redl XMesaBuffer b, next; 2162059612dd3429cef2d61f11950f3d93a40182bf69Sebastian Redl for (b = XMesaBufferList; b; b = next) { 2163e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl next = b->Next; 21648538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl if (b->display == dpy) { 21655d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl xmesa_free_buffer(b); 21665d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl } 21675d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl } 2168059612dd3429cef2d61f11950f3d93a40182bf69Sebastian Redl} 21693397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl 21705d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl 21715d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl/* 21725d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl * Look for XMesaBuffers whose X window has been destroyed. 21735d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl * Deallocate any such XMesaBuffers. 21745d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl */ 21755d05007b7a7883159154e3f65f338a2542d53913Sebastian Redlvoid XMesaGarbageCollect( void ) 21765d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl{ 21775d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl XMesaBuffer b, next; 21783397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl for (b=XMesaBufferList; b; b=next) { 2179e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl next = b->Next; 2180e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl if (b->display && b->frontxrb->drawable && b->type == WINDOW) { 2181e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl#ifdef XFree86Server 2182e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl /* NOT_NEEDED */ 2183e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl#else 2184e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl XSync(b->display, False); 2185e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl if (!window_exists( b->display, b->frontxrb->drawable )) { 2186e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl /* found a dead window, free the ancillary info */ 2187e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl XMesaDestroyBuffer( b ); 2188e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl } 2189e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl#endif 2190e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl } 2191e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl } 2192e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl} 2193e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl 2194e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl 2195fa78dec572259aca763457b435744f79d822c5d4Sebastian Redlunsigned long XMesaDitherColor( XMesaContext xmesa, GLint x, GLint y, 2196fa78dec572259aca763457b435744f79d822c5d4Sebastian Redl GLfloat red, GLfloat green, 2197fa78dec572259aca763457b435744f79d822c5d4Sebastian Redl GLfloat blue, GLfloat alpha ) 2198e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl{ 21995d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis GLcontext *ctx = &xmesa->mesa; 2200f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor GLint r = (GLint) (red * 255.0F); 2201f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor GLint g = (GLint) (green * 255.0F); 2202f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor GLint b = (GLint) (blue * 255.0F); 22031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump GLint a = (GLint) (alpha * 255.0F); 2204f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor 2205f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor switch (xmesa->pixelformat) { 22063397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl case PF_Index: 2207f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor return 0; 2208f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor case PF_Truecolor: 2209a67e58c8fa03c2f1aa7609bf5a436d1adba75eefDouglas Gregor { 2210f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor unsigned long p; 2211f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor PACK_TRUECOLOR( p, r, g, b ); 2212f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor return p; 2213f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor } 2214f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor case PF_8A8B8G8R: 22158538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl return PACK_8A8B8G8R( r, g, b, a ); 2216f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor case PF_8A8R8G8B: 221783941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor return PACK_8A8R8G8B( r, g, b, a ); 2218f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor case PF_8R8G8B: 2219f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor return PACK_8R8G8B( r, g, b ); 2220f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor case PF_5R6G5B: 222183941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor return PACK_5R6G5B( r, g, b ); 2222f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor case PF_Dither: 22238538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl { 2224f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor DITHER_SETUP; 2225e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl return DITHER( x, y, r, g, b ); 2226ec312a1f0557b1d27f3eb6cf49acbf7e72696422Daniel Dunbar } 222783941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor case PF_1Bit: 222883941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor /* 382 = (3*255)/2 */ 222983941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor return ((r+g+b) > 382) ^ xmesa->xm_visual->bitFlip; 22308538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case PF_HPCR: 22317c789c1a3f77f24032aa0bed2afacdb9e094e952Douglas Gregor return DITHER_HPCR(x, y, r, g, b); 2232b18b1fd33f958264630fbae2602c81275bae8c9aDouglas Gregor case PF_Lookup: 223383941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor { 223483941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor LOOKUP_SETUP; 223583941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor return LOOKUP( r, g, b ); 223683941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor } 223783941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor case PF_Grayscale: 22388538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl return GRAY_RGB( r, g, b ); 223983941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor case PF_Dither_5R6G5B: 2240b18b1fd33f958264630fbae2602c81275bae8c9aDouglas Gregor /* fall through */ 224183941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor case PF_Dither_True: 22426e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer { 2243f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor unsigned long p; 2244f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor PACK_TRUEDITHER(p, x, y, r, g, b); 2245f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor return p; 22463397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl } 2247a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl default: 2248320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian _mesa_problem(NULL, "Bad pixel format in XMesaDitherColor"); 2249320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian } 2250320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian return 0; 2251725cd9686a0f5bb6c994cb3e43f58b63567c6860Sebastian Redl} 2252320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian 2253725cd9686a0f5bb6c994cb3e43f58b63567c6860Sebastian Redl 22543397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl/* 2255a68340fd55e177a5849cb3adbf66aedce1f6e91bSebastian Redl * This is typically called when the window size changes and we need 2256a68340fd55e177a5849cb3adbf66aedce1f6e91bSebastian Redl * to reallocate the buffer's back/depth/stencil/accum buffers. 2257320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian */ 2258320198303df7c16950d83ae79c3f702b84badcf7Fariborz JahanianPUBLIC void 2259320198303df7c16950d83ae79c3f702b84badcf7Fariborz JahanianXMesaResizeBuffers( XMesaBuffer b ) 2260320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian{ 2261320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian GET_CURRENT_CONTEXT(ctx); 2262320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian XMesaContext xmctx = XMESA_CONTEXT(ctx); 2263320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian if (!xmctx) 2264320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian return; 22658538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl xmesa_check_and_update_buffer_size(xmctx, b); 2266320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian} 2267320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian 22684fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor