xm_api.c revision fcf438e9e03f6e75bca4a49ad372fe7c4b1abbf8
14ee2ad04344446e610172a0e73949212923014dfSebastian Redl/* 22cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * Mesa 3-D graphics library 32cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * Version: 7.1 42cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * 52cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * Copyright (C) 1999-2007 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 150eca89e9890db4d8336ce762a5b359a1d58ca02bArgyrios Kyrtzidis * in all copies or substantial portions of the Software. 16e737f5041a36d0befb39ffeed8d50ba15916d3daDouglas Gregor * 17e737f5041a36d0befb39ffeed8d50ba15916d3daDouglas Gregor * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 182cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas 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 212a7fb27913999d132cf9e10e03dc5271faa2e9d3John McCall * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 2289eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 230b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor */ 247a1fad38256eb4c5129359be85ba1ea1678eb5c9John McCall 252cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor/** 26a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall * \file xm_api.c 276ab7cd853e9c15cf986a8a7c3db1f8d20e275409Sebastian Redl * 287c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner * All the XMesa* API functions. 296a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor * 307c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner * 3183d63c78810556d26b62ac4cbae2eda6cdd2570cSteve Naroff * NOTES: 3214f79002e58556798e86168c63e48d533287eda5Douglas Gregor * 3310e286aa8d39fb51a21412850265d9dae74613eeChris Lattner * The window coordinate system origin (0,0) is in the lower-left corner 343251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor * of the window. X11's window coordinate origin is in the upper-left 3514f79002e58556798e86168c63e48d533287eda5Douglas Gregor * corner of the window. Therefore, most drawing functions in this 36bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregor * file have to flip Y coordinates. 372bec0410d268779f601bd509e0302a500af7ac6aDouglas Gregor * 38ab41e63821dc60ad144d0684df8d79a9eef86b75Douglas Gregor * Define USE_XSHM in the Makefile with -DUSE_XSHM if you want to compile 390a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor * in support for the MIT Shared Memory extension. If enabled, when you 4017fc223395d51be582fc666bb6ea21bd1dff26dcDouglas 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. 422596e429a61602312bdd149786045b8a90cd2d10Daniel Dunbar * 432cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * Byte swapping: If the Mesa host and the X display use a different 44fbfd180495e7800975c6d9bdc6d24e706ef70e34Michael J. Spencer * byte order then there's some trickiness to be aware of when using 4514f79002e58556798e86168c63e48d533287eda5Douglas Gregor * XImages. The byte ordering used for the XImage is that of the X 4603013fa9a0bf1ef4b907f5fec006c8f4000fdd21Michael J. Spencer * display, not the Mesa host. 47f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor * The color-to-pixel encoding for True/DirectColor must be done 483c304bd9ec2b4611572d4cbae9e1727bbecb5dc9Chris Lattner * according to the display's visual red_mask, green_mask, and blue_mask. 49cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor * If XPutPixel is used to put a pixel into an XImage then XPutPixel will 50f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor * do byte swapping if needed. If one wants to directly "poke" the pixel 512cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * into the XImage's buffer then the pixel must be byte swapped first. In 528538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl * Mesa, when byte swapping is needed we use the PF_TRUECOLOR pixel format 532cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * and use XPutPixel everywhere except in the implementation of 54ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl * glClear(GL_COLOR_BUFFER_BIT). We want this function to be fast so 555f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner * instead of using XPutPixel we "poke" our values after byte-swapping 565f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner * the clear pixel value if needed. 575f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner * 586e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer */ 59ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl 606e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer#ifdef __CYGWIN__ 616e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer#undef WIN32 625f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner#undef __WIN32__ 635f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner#endif 646e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer 65ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl#include "glxheader.h" 66ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl#include "xmesaP.h" 672cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "main/context.h" 682cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "main/extensions.h" 692cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "main/framebuffer.h" 7012b1c7615d4f9a2edc544be499f895f16ac100edChris Lattner#include "main/imports.h" 712cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "main/macros.h" 723397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl#include "main/renderbuffer.h" 73a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl#include "main/teximage.h" 7489eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis#include "glapi/glthread.h" 752cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "swrast/swrast.h" 762cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "swrast_setup/swrast_setup.h" 772cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "vbo/vbo.h" 788538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl#include "tnl/tnl.h" 792cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "tnl/t_context.h" 8089eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis#include "tnl/t_pipeline.h" 818538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl#include "drivers/common/driverfuncs.h" 822cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "drivers/common/meta.h" 832cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 842cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor/** 852cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * Global X driver lock 862cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor */ 872cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor_glthread_Mutex _xmesa_lock; 882cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 892cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 902cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 912cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor/** 922cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * Lookup tables for HPCR pixel format: 933397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl */ 94b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikiestatic short hpcr_rgbTbl[3][256] = { 952cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor{ 962cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 973397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 30, 30, 31, 31, 982cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 32, 32, 33, 33, 34, 34, 35, 35, 36, 36, 37, 37, 38, 38, 39, 39, 998538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 1002cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 1012cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 1023397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 1032cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 1048538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 1052cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 1062cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 1073397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 1081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 1098538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 1102cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 1112cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239 1123397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl}, 113df1550fc59b51681d37225934fe4e3acac321621Richard Smith{ 114df1550fc59b51681d37225934fe4e3acac321621Richard Smith 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 1158538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 30, 30, 31, 31, 1162cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 32, 32, 33, 33, 34, 34, 35, 35, 36, 36, 37, 37, 38, 38, 39, 39, 1172cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 1183397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 119df1550fc59b51681d37225934fe4e3acac321621Richard Smith 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 1208538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 1212cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 1222cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 1233397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 1241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 1251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 1268538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 1272cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 1282cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 1293397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239 1302cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor}, 1312cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor{ 1320953e767ff7817f97b3ab20896b229891eeff45bJohn McCall 32, 32, 33, 33, 34, 34, 35, 35, 36, 36, 37, 37, 38, 38, 39, 39, 1332cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 40, 40, 41, 41, 42, 42, 43, 43, 44, 44, 45, 45, 46, 46, 47, 47, 1342cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 48, 48, 49, 49, 50, 50, 51, 51, 52, 52, 53, 53, 54, 54, 55, 55, 1353397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl 56, 56, 57, 57, 58, 58, 59, 59, 60, 60, 61, 61, 62, 62, 63, 63, 1362cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 64, 64, 65, 65, 66, 66, 67, 67, 68, 68, 69, 69, 70, 70, 71, 71, 1372cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 72, 72, 73, 73, 74, 74, 75, 75, 76, 76, 77, 77, 78, 78, 79, 79, 1388538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl 80, 80, 81, 81, 82, 82, 83, 83, 84, 84, 85, 85, 86, 86, 87, 87, 1392cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 1402cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 1413397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 1422cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 1438538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 1442cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 1452cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 1463397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 1472cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223 1487e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor} 1497e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor}; 150c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor 1518538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl 1522cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 1532cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor/**********************************************************************/ 1543397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl/***** X Utility Functions *****/ 1552cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor/**********************************************************************/ 1562cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 157e86d78cf4754a6aef2cf9a33d847aa15338e276fBob Wilson 1588538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl/** 1592cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * Return the host's byte order as LSBFirst or MSBFirst ala X. 1602cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor */ 1613397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl#ifndef XFree86Server 1622cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregorstatic int host_byte_order( void ) 1638538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl{ 1642cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor int i = 1; 1652cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor char *cptr = (char *) &i; 1663397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl return (*cptr==1) ? LSBFirst : MSBFirst; 1672cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor} 168264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola#endif 169264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola 170a49218e17bcbb1acde0245773173e2c0c42f4f19Eli Friedman 171425ef72306d4ff6b3698b744353e5f0e56b4b884Rafael Espindola/** 172ab8bbf4ebd3e3e6eab913cb044772a62b7581941Douglas Gregor * Check if the X Shared Memory extension is available. 173264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola * Return: 0 = not available 174f85e193739c953358c865005855253af4f68a497John McCall * 1 = shared XImage support available 1752cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * 2 = shared Pixmap support available also 1762cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor */ 1773397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redlstatic int check_for_xshm( XMesaDisplay *display ) 1782cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor{ 1798538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl#if defined(USE_XSHM) && !defined(XFree86Server) 1802cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor int major, minor, ignore; 1812cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor Bool pixmaps; 1823397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl 1832cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor if (XQueryExtension( display, "MIT-SHM", &ignore, &ignore, &ignore )) { 1842cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor if (XShmQueryVersion( display, &major, &minor, &pixmaps )==True) { 1852cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor return (pixmaps==True) ? 2 : 1; 1862cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor } 1872cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor else { 188eefb3d5b49c844347f212073a7e975b8118fe8e9Richard Smith return 0; 1892cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor } 190c938c1668b4fd12af154e965dd935a89e4801a70Douglas Gregor } 19160618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl else { 19260618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl return 0; 19360618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl } 19460618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl#else 19560618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl /* No XSHM support */ 19660618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl return 0; 19760618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl#endif 19860618fa7f88d5162bb5b40988b6b38d4d75d6fc6Sebastian Redl} 1998538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl 2002cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 2012cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor/** 2023397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl * Apply gamma correction to an intensity value in [0..max]. Return the 203ed97649e9574b9d854fa4d6109c9333ae0993554John McCall * new intensity value. 2048538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl */ 205ed97649e9574b9d854fa4d6109c9333ae0993554John McCallstatic GLint 206ed97649e9574b9d854fa4d6109c9333ae0993554John McCallgamma_adjust( GLfloat gamma, GLint value, GLint max ) 2073397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl{ 2082cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor if (gamma == 1.0) { 2099763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis return value; 2109763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis } 2118538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl else { 2122cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor double x = (double) value / (double) max; 2132cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor return IROUND_POS((GLfloat) max * _mesa_pow(x, 1.0F/gamma)); 2143397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl } 215c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor} 2168538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl 2172cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 2182cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 2193397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl/** 2202cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * Return the true number of bits per pixel for XImages. 2218538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl * For example, if we request a 24-bit deep visual we may actually need/get 2222cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * 32bpp XImages. This function returns the appropriate bpp. 2232cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * Input: dpy - the X display 2243397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl * visinfo - desribes the visual to be used for XImages 225f8af98286022f72157d84951b48fde5fb369ab29Douglas Gregor * Return: true number of bits per pixel for XImages 226395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson */ 2278538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redlstatic int 228395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlssonbits_per_pixel( XMesaVisual xmv ) 229395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson{ 230ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt#ifdef XFree86Server 231ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt const int depth = xmv->nplanes; 232ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt int i; 233ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt assert(depth > 0); 234ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt for (i = 0; i < screenInfo.numPixmapFormats; i++) { 235ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt if (screenInfo.formats[i].depth == depth) 236ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt return screenInfo.formats[i].bitsPerPixel; 23734b41d939a1328f484511c6002ba2456db879a29Richard Smith } 23834b41d939a1328f484511c6002ba2456db879a29Richard Smith return depth; /* should never get here, but this should be safe */ 23934b41d939a1328f484511c6002ba2456db879a29Richard Smith#else 24034b41d939a1328f484511c6002ba2456db879a29Richard Smith XMesaDisplay *dpy = xmv->display; 24134b41d939a1328f484511c6002ba2456db879a29Richard Smith XMesaVisualInfo visinfo = xmv->visinfo; 2423397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl XMesaImage *img; 243be191100e034b23a3e13053757a57b7f5068c24aArgyrios Kyrtzidis int bitsPerPixel; 24456ca8a9c0fabd65418e9b2fd85140f4ed7d3c187Douglas Gregor /* Create a temporary XImage */ 2451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump img = XCreateImage( dpy, visinfo->visual, visinfo->depth, 2462cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor ZPixmap, 0, /*format, offset*/ 2472cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor (char*) MALLOC(8), /*data*/ 2482cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 1, 1, /*width, height*/ 2493397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl 32, /*bitmap_pad*/ 2502cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 0 /*bytes_per_line*/ 2518538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl ); 2522cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor assert(img); 2532cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor /* grab the bits/pixel value */ 2543397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl bitsPerPixel = img->bits_per_pixel; 2552cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor /* free the XImage */ 2568538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl free( img->data ); 2572cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor img->data = NULL; 2582cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor XMesaDestroyImage( img ); 2599d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall return bitsPerPixel; 2609d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall#endif 2619d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall} 2629d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall 2639d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall 2649d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall 2659d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall/* 2661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump * Determine if a given X window ID is valid (window exists). 2673397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl * Do this by calling XGetWindowAttributes() for the window and 26849a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall * checking if we catch an X error. 26949a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall * Input: dpy - the display 27049a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall * win - the window to check for existance 2718538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl * Return: GL_TRUE - window exists 27249a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall * GL_FALSE - window doesn't exist 27349a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall */ 27449a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall#ifndef XFree86Server 275c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregorstatic GLboolean WindowExistsFlag; 276c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor 277c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregorstatic int window_exists_err_handler( XMesaDisplay* dpy, XErrorEvent* xerr ) 278c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor{ 279c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor (void) dpy; 280c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor if (xerr->error_code == BadWindow) { 281c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor WindowExistsFlag = GL_FALSE; 282c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor } 2833397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl return 0; 2842cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor} 285be191100e034b23a3e13053757a57b7f5068c24aArgyrios Kyrtzidis 28690b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidisstatic GLboolean window_exists( XMesaDisplay *dpy, Window win ) 28790b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis{ 28890b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis XWindowAttributes wa; 28990b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis int (*old_handler)( XMesaDisplay*, XErrorEvent* ); 29090b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis WindowExistsFlag = GL_TRUE; 2913e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith old_handler = XSetErrorHandler(window_exists_err_handler); 2923e4c6c4c79a03f5cb0c4671d7c282d623c6dc35eRichard Smith XGetWindowAttributes( dpy, win, &wa ); /* dummy request */ 2939763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis XSetErrorHandler(old_handler); 2949763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis return WindowExistsFlag; 2958538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl} 29690b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis 29790b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidisstatic Status 29890b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidisget_drawable_size( XMesaDisplay *dpy, Drawable d, GLuint *width, GLuint *height ) 2993397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl{ 300ae8b17f1d5d303af53db5a4f4a375ea6b9356566Argyrios Kyrtzidis Window root; 301ae8b17f1d5d303af53db5a4f4a375ea6b9356566Argyrios Kyrtzidis Status stat; 302ae8b17f1d5d303af53db5a4f4a375ea6b9356566Argyrios Kyrtzidis int xpos, ypos; 3038538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl unsigned int w, h, bw, depth; 30490b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis stat = XGetGeometry(dpy, d, &root, &xpos, &ypos, &w, &h, &bw, &depth); 30590b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis *width = w; 30690b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis *height = h; 3073397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl return stat; 30890b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis} 30990b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis#endif 310b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie 31190b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis 31290b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis/** 31390b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis * Return the size of the window (or pixmap) that corresponds to the 3143397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl * given XMesaBuffer. 31590b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis * \param width returns width in pixels 31690b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis * \param height returns height in pixels 31790b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis */ 3184fb86f8c4585e53c21c847ad3de9e3b2de123cd9Chandler Carruthvoid 3198538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redlxmesa_get_window_size(XMesaDisplay *dpy, XMesaBuffer b, 32090b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis GLuint *width, GLuint *height) 32190b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis{ 32290b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis#ifdef XFree86Server 3233397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl *width = MIN2(b->frontxrb->drawable->width, MAX_WIDTH); 3248dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis *height = MIN2(b->frontxrb->drawable->height, MAX_HEIGHT); 3258dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis#else 3268dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis Status stat; 327f48d45e3e36c132bdee3373beec4e8b19ae3f9c4Argyrios Kyrtzidis 328f48d45e3e36c132bdee3373beec4e8b19ae3f9c4Argyrios Kyrtzidis _glthread_LOCK_MUTEX(_xmesa_lock); 329f48d45e3e36c132bdee3373beec4e8b19ae3f9c4Argyrios Kyrtzidis XSync(b->xm_visual->display, 0); /* added for Chromium */ 3308538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl stat = get_drawable_size(dpy, b->frontxrb->pixmap, width, height); 33190b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis _glthread_UNLOCK_MUTEX(_xmesa_lock); 33290b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis 33390b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis if (!stat) { 3343397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl /* probably querying a window that's recently been destroyed */ 33590b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis _mesa_warning(NULL, "XGetGeometry failed!\n"); 3363acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis *width = *height = 1; 3373acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis } 3383acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis#endif 3393acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis} 3403acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis 3413acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis 3423acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis 3438538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl/**********************************************************************/ 3442cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor/***** Linked list of XMesaBuffers *****/ 3452cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor/**********************************************************************/ 3467536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor 3477536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas GregorXMesaBuffer XMesaBufferList = NULL; 348cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor 349cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor 350cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor/** 351cded4f649cd4b7ba7d461c25c6482ef52b8d3a2aDouglas Gregor * Allocate a new XMesaBuffer object which corresponds to the given drawable. 3527536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor * Note that XMesaBuffer is derived from GLframebuffer. 3537536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor * The new XMesaBuffer will not have any size (Width=Height=0). 3547536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor * 355075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara * \param d the corresponding X drawable (window or pixmap) 356075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara * \param type either WINDOW, PIXMAP or PBUFFER, describing d 357075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara * \param vis the buffer's visual 358075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara * \param cmap the window's colormap, if known. 359075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara * \return new XMesaBuffer or NULL if any problem 3603397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl */ 361465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnarastatic XMesaBuffer 3623acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidiscreate_xmesa_buffer(XMesaDrawable d, BufferType type, 3633acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis XMesaVisual vis, XMesaColormap cmap) 3648538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl{ 3652cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor XMesaBuffer b; 3662cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 3673397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl ASSERT(type == WINDOW || type == PIXMAP || type == PBUFFER); 3683cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall 36931f17ecbef57b5679c017c375db330546b7b5145John McCall b = (XMesaBuffer) CALLOC_STRUCT(xmesa_buffer); 3708538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl if (!b) 3713cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall return NULL; 3723cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall 3733397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl b->display = vis->display; 37456ca8a9c0fabd65418e9b2fd85140f4ed7d3c187Douglas Gregor b->xm_visual = vis; 3758538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl b->type = type; 376c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall b->cmap = cmap; 377c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall 3783397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl _mesa_initialize_window_framebuffer(&b->mesa_buffer, &vis->mesa_visual); 379c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall b->mesa_buffer.Delete = xmesa_delete_framebuffer; 3802cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 381c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall /* 382446ee4eb4fc4c705a59365252df7a5c253daafa1Steve Naroff * Front renderbuffer 383446ee4eb4fc4c705a59365252df7a5c253daafa1Steve Naroff */ 3848538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl b->frontxrb = xmesa_new_renderbuffer(NULL, 0, &vis->mesa_visual, GL_FALSE); 3852cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor if (!b->frontxrb) { 3862cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor free(b); 387d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff return NULL; 3883397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl } 3891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump b->frontxrb->Parent = b; 3908538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl b->frontxrb->drawable = d; 3912cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor b->frontxrb->pixmap = (XMesaPixmap) d; 3922cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor _mesa_add_renderbuffer(&b->mesa_buffer, BUFFER_FRONT_LEFT, 393b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman &b->frontxrb->Base); 394b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman 395b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman /* 396b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman * Back renderbuffer 397b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman */ 398b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman if (vis->mesa_visual.doubleBufferMode) { 399a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall b->backxrb = xmesa_new_renderbuffer(NULL, 0, &vis->mesa_visual, GL_TRUE); 400a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall if (!b->backxrb) { 401a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall /* XXX free front xrb too */ 402a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl free(b); 40389eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis return NULL; 404a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall } 405a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall b->backxrb->Parent = b; 40689eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis /* determine back buffer implementation */ 407a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall b->db_mode = vis->ximage_flag ? BACK_XIMAGE : BACK_PIXMAP; 408a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall 40951bd803fbdade51d674598ed45da3d54190a656cJohn McCall _mesa_add_renderbuffer(&b->mesa_buffer, BUFFER_BACK_LEFT, 410a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall &b->backxrb->Base); 41151bd803fbdade51d674598ed45da3d54190a656cJohn McCall } 412a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall 413a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall /* 41451bd803fbdade51d674598ed45da3d54190a656cJohn McCall * Software alpha planes 41551bd803fbdade51d674598ed45da3d54190a656cJohn McCall */ 416a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall if (vis->mesa_visual.alphaBits > 0 417a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall && vis->undithered_pf != PF_8A8B8G8R 418a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall && vis->undithered_pf != PF_8A8R8G8B) { 419a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall /* Visual has alpha, but pixel format doesn't support it. 42051bd803fbdade51d674598ed45da3d54190a656cJohn McCall * We'll use an alpha renderbuffer wrapper. 42151bd803fbdade51d674598ed45da3d54190a656cJohn McCall */ 42251bd803fbdade51d674598ed45da3d54190a656cJohn McCall b->swAlpha = GL_TRUE; 42351bd803fbdade51d674598ed45da3d54190a656cJohn McCall } 424ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor else { 425ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor b->swAlpha = GL_FALSE; 426ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor } 427ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor 428ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor /* 429ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor * Other renderbuffer (depth, stencil, etc) 430ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor */ 43151bd803fbdade51d674598ed45da3d54190a656cJohn McCall _mesa_add_soft_renderbuffers(&b->mesa_buffer, 43251bd803fbdade51d674598ed45da3d54190a656cJohn McCall GL_FALSE, /* color */ 43351bd803fbdade51d674598ed45da3d54190a656cJohn McCall vis->mesa_visual.haveDepthBuffer, 43451bd803fbdade51d674598ed45da3d54190a656cJohn McCall vis->mesa_visual.haveStencilBuffer, 43551bd803fbdade51d674598ed45da3d54190a656cJohn McCall vis->mesa_visual.haveAccumBuffer, 43651bd803fbdade51d674598ed45da3d54190a656cJohn McCall b->swAlpha, 43751bd803fbdade51d674598ed45da3d54190a656cJohn McCall vis->mesa_visual.numAuxBuffers > 0 ); 43851bd803fbdade51d674598ed45da3d54190a656cJohn McCall 43951bd803fbdade51d674598ed45da3d54190a656cJohn McCall /* GLX_EXT_texture_from_pixmap */ 44051bd803fbdade51d674598ed45da3d54190a656cJohn McCall b->TextureTarget = 0; 44151bd803fbdade51d674598ed45da3d54190a656cJohn McCall b->TextureFormat = GLX_TEXTURE_FORMAT_NONE_EXT; 44251bd803fbdade51d674598ed45da3d54190a656cJohn McCall b->TextureMipmap = 0; 44351bd803fbdade51d674598ed45da3d54190a656cJohn McCall 44451bd803fbdade51d674598ed45da3d54190a656cJohn McCall /* insert buffer into linked list */ 44551bd803fbdade51d674598ed45da3d54190a656cJohn McCall b->Next = XMesaBufferList; 44651bd803fbdade51d674598ed45da3d54190a656cJohn McCall XMesaBufferList = b; 44751bd803fbdade51d674598ed45da3d54190a656cJohn McCall 44851bd803fbdade51d674598ed45da3d54190a656cJohn McCall return b; 449b6ab6c1ca733fda2302a1c5066bdfc6218c89e41Abramo Bagnara} 45051bd803fbdade51d674598ed45da3d54190a656cJohn McCall 45151bd803fbdade51d674598ed45da3d54190a656cJohn McCall 45251bd803fbdade51d674598ed45da3d54190a656cJohn McCall/** 45351bd803fbdade51d674598ed45da3d54190a656cJohn McCall * Find an XMesaBuffer by matching X display and colormap but NOT matching 45451bd803fbdade51d674598ed45da3d54190a656cJohn McCall * the notThis buffer. 45551bd803fbdade51d674598ed45da3d54190a656cJohn McCall */ 45651bd803fbdade51d674598ed45da3d54190a656cJohn McCallXMesaBuffer 45751bd803fbdade51d674598ed45da3d54190a656cJohn McCallxmesa_find_buffer(XMesaDisplay *dpy, XMesaColormap cmap, XMesaBuffer notThis) 45851bd803fbdade51d674598ed45da3d54190a656cJohn McCall{ 45951bd803fbdade51d674598ed45da3d54190a656cJohn McCall XMesaBuffer b; 46051bd803fbdade51d674598ed45da3d54190a656cJohn McCall for (b=XMesaBufferList; b; b=b->Next) { 46151bd803fbdade51d674598ed45da3d54190a656cJohn McCall if (b->display==dpy && b->cmap==cmap && b!=notThis) { 46251bd803fbdade51d674598ed45da3d54190a656cJohn McCall return b; 46351bd803fbdade51d674598ed45da3d54190a656cJohn McCall } 46451bd803fbdade51d674598ed45da3d54190a656cJohn McCall } 46551bd803fbdade51d674598ed45da3d54190a656cJohn McCall return NULL; 46651bd803fbdade51d674598ed45da3d54190a656cJohn McCall} 46751bd803fbdade51d674598ed45da3d54190a656cJohn McCall 46851bd803fbdade51d674598ed45da3d54190a656cJohn McCall 46951bd803fbdade51d674598ed45da3d54190a656cJohn McCall/** 47051bd803fbdade51d674598ed45da3d54190a656cJohn McCall * Remove buffer from linked list, delete if no longer referenced. 47151bd803fbdade51d674598ed45da3d54190a656cJohn McCall */ 47251bd803fbdade51d674598ed45da3d54190a656cJohn McCallstatic void 47351bd803fbdade51d674598ed45da3d54190a656cJohn McCallxmesa_free_buffer(XMesaBuffer buffer) 47451bd803fbdade51d674598ed45da3d54190a656cJohn McCall{ 47551bd803fbdade51d674598ed45da3d54190a656cJohn McCall XMesaBuffer prev = NULL, b; 47651bd803fbdade51d674598ed45da3d54190a656cJohn McCall 47751bd803fbdade51d674598ed45da3d54190a656cJohn McCall for (b = XMesaBufferList; b; b = b->Next) { 47851bd803fbdade51d674598ed45da3d54190a656cJohn McCall if (b == buffer) { 47951bd803fbdade51d674598ed45da3d54190a656cJohn McCall struct gl_framebuffer *fb = &buffer->mesa_buffer; 48051bd803fbdade51d674598ed45da3d54190a656cJohn McCall 48151bd803fbdade51d674598ed45da3d54190a656cJohn McCall /* unlink buffer from list */ 482796aa443ab5ed036f42ef33fed629e1b4b34871bAbramo Bagnara if (prev) 483796aa443ab5ed036f42ef33fed629e1b4b34871bAbramo Bagnara prev->Next = buffer->Next; 484dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor else 48551bd803fbdade51d674598ed45da3d54190a656cJohn McCall XMesaBufferList = buffer->Next; 48651bd803fbdade51d674598ed45da3d54190a656cJohn McCall 48751bd803fbdade51d674598ed45da3d54190a656cJohn McCall /* mark as delete pending */ 48851bd803fbdade51d674598ed45da3d54190a656cJohn McCall fb->DeletePending = GL_TRUE; 48951bd803fbdade51d674598ed45da3d54190a656cJohn McCall 49051bd803fbdade51d674598ed45da3d54190a656cJohn McCall /* Since the X window for the XMesaBuffer is going away, we don't 49151bd803fbdade51d674598ed45da3d54190a656cJohn McCall * want to dereference this pointer in the future. 49251bd803fbdade51d674598ed45da3d54190a656cJohn McCall */ 49351bd803fbdade51d674598ed45da3d54190a656cJohn McCall b->frontxrb->drawable = 0; 494ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 495ed97649e9574b9d854fa4d6109c9333ae0993554John McCall /* Unreference. If count = zero we'll really delete the buffer */ 496ed97649e9574b9d854fa4d6109c9333ae0993554John McCall _mesa_reference_framebuffer(&fb, NULL); 49751bd803fbdade51d674598ed45da3d54190a656cJohn McCall 49851bd803fbdade51d674598ed45da3d54190a656cJohn McCall return; 49951bd803fbdade51d674598ed45da3d54190a656cJohn McCall } 50051bd803fbdade51d674598ed45da3d54190a656cJohn McCall /* continue search */ 501cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall prev = b; 502cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall } 503cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall /* buffer not found in XMesaBufferList */ 50451bd803fbdade51d674598ed45da3d54190a656cJohn McCall _mesa_problem(NULL,"xmesa_free_buffer() - buffer not found\n"); 50551bd803fbdade51d674598ed45da3d54190a656cJohn McCall} 506cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall 507cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall 508cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall/** 509cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall * Copy X color table stuff from one XMesaBuffer to another. 51051bd803fbdade51d674598ed45da3d54190a656cJohn McCall */ 51151bd803fbdade51d674598ed45da3d54190a656cJohn McCallstatic void 51251bd803fbdade51d674598ed45da3d54190a656cJohn McCallcopy_colortable_info(XMesaBuffer dst, const XMesaBuffer src) 513a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall{ 514ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt memcpy(dst->color_table, src->color_table, sizeof(src->color_table)); 515ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt memcpy(dst->pixel_to_r, src->pixel_to_r, sizeof(src->pixel_to_r)); 516ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt memcpy(dst->pixel_to_g, src->pixel_to_g, sizeof(src->pixel_to_g)); 517ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt memcpy(dst->pixel_to_b, src->pixel_to_b, sizeof(src->pixel_to_b)); 518ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt dst->num_alloced = src->num_alloced; 519ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt memcpy(dst->alloced_colors, src->alloced_colors, 52034b41d939a1328f484511c6002ba2456db879a29Richard Smith sizeof(src->alloced_colors)); 52134b41d939a1328f484511c6002ba2456db879a29Richard Smith} 52234b41d939a1328f484511c6002ba2456db879a29Richard Smith 52351bd803fbdade51d674598ed45da3d54190a656cJohn McCall 52451bd803fbdade51d674598ed45da3d54190a656cJohn McCall 525a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall/**********************************************************************/ 52651bd803fbdade51d674598ed45da3d54190a656cJohn McCall/***** Misc Private Functions *****/ 52751bd803fbdade51d674598ed45da3d54190a656cJohn McCall/**********************************************************************/ 528a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall 5299d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall 5309d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall/** 5319d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall * A replacement for XAllocColor. This function should never 5329d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall * fail to allocate a color. When XAllocColor fails, we return 5339d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall * the nearest matching color. If we have to allocate many colors 5349d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall * this function isn't too efficient; the XQueryColors() could be 5359d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall * done just once. 5369d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall * Written by Michael Pichler, Brian Paul, Mark Kilgard 5379d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall * Input: dpy - X display 5389d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall * cmap - X colormap 5399d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall * cmapSize - size of colormap 5409d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall * In/Out: color - the XColor struct 5419d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall * Output: exact - 1=exact color match, 0=closest match 5429d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall * alloced - 1=XAlloc worked, 0=XAlloc failed 5439d156a7b1b2771e191f2f5a45a7b7a694129463bJohn McCall */ 54451bd803fbdade51d674598ed45da3d54190a656cJohn McCallstatic void 54551bd803fbdade51d674598ed45da3d54190a656cJohn McCallnoFaultXAllocColor( int client, 546a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall XMesaDisplay *dpy, 54749a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall XMesaColormap cmap, 54849a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall int cmapSize, 54949a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall XMesaColor *color, 55049a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall int *exact, int *alloced ) 551c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor{ 552c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor#ifdef XFree86Server 553c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor Pixel *ppixIn; 554c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor xrgb *ctable; 55551bd803fbdade51d674598ed45da3d54190a656cJohn McCall#else 55651bd803fbdade51d674598ed45da3d54190a656cJohn McCall /* we'll try to cache ctable for better remote display performance */ 55755d23c925b058be29b792008ddb7d68f6c4fa9a0Abramo Bagnara static Display *prevDisplay = NULL; 558833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall static XMesaColormap prevCmap = 0; 559833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall static int prevCmapSize = 0; 560833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall static XMesaColor *ctable = NULL; 561833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall#endif 56244f8c37e378f716e8cbb600e3800f437cf58f9e5Argyrios Kyrtzidis XMesaColor subColor; 56344f8c37e378f716e8cbb600e3800f437cf58f9e5Argyrios Kyrtzidis int i, bestmatch; 564a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall double mindist; /* 3*2^16^2 exceeds long int precision. */ 565075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara 566075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara (void) client; 567075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara 568075f8f1b6bed4d1b224c74f87508534cc6392ce6Abramo Bagnara /* First try just using XAllocColor. */ 569465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara#ifdef XFree86Server 57038a42916cb07fd368d9e2ae1e7915fa896f9ec06Abramo Bagnara if (AllocColor(cmap, 5719e876876afc13aa671cc11a17c19907c599b9ab9Douglas Gregor &color->red, &color->green, &color->blue, 572a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall &color->pixel, 5733cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall client) == Success) 5743cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall#else 5753cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall if (XAllocColor(dpy, cmap, color)) 5764714c12a1ab759156b78be8f109ea4c12213af57Douglas Gregor#endif 57738a42916cb07fd368d9e2ae1e7915fa896f9ec06Abramo Bagnara { 5782494dd024b392b8def58bf067cc94b51c214cf77Douglas Gregor *exact = 1; 57951bd803fbdade51d674598ed45da3d54190a656cJohn McCall *alloced = 1; 580a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall return; 58133500955d731c73717af52088b7fc0e7a85681e7John McCall } 58233500955d731c73717af52088b7fc0e7a85681e7John McCall 58355d23c925b058be29b792008ddb7d68f6c4fa9a0Abramo Bagnara /* Alloc failed, search for closest match */ 58494fdffa4a572fc14ac296f5f1aae9db3734c72f1Douglas Gregor 58566581d41527628d4b37f7b05c288f77be7415d7dAbramo Bagnara /* Retrieve color table entries. */ 58655d23c925b058be29b792008ddb7d68f6c4fa9a0Abramo Bagnara /* XXX alloca candidate. */ 58733500955d731c73717af52088b7fc0e7a85681e7John McCall#ifdef XFree86Server 58833500955d731c73717af52088b7fc0e7a85681e7John McCall ppixIn = (Pixel *) MALLOC(cmapSize * sizeof(Pixel)); 58933500955d731c73717af52088b7fc0e7a85681e7John McCall ctable = (xrgb *) MALLOC(cmapSize * sizeof(xrgb)); 59044f8c37e378f716e8cbb600e3800f437cf58f9e5Argyrios Kyrtzidis for (i = 0; i < cmapSize; i++) { 59144f8c37e378f716e8cbb600e3800f437cf58f9e5Argyrios Kyrtzidis ppixIn[i] = i; 59233500955d731c73717af52088b7fc0e7a85681e7John McCall } 5937536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor QueryColors(cmap, cmapSize, ppixIn, ctable); 5947536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor#else 5957536dd5e6c99584481b7dab68b7e7d8df9c54054Douglas Gregor if (prevDisplay != dpy || prevCmap != cmap 59651bd803fbdade51d674598ed45da3d54190a656cJohn McCall || prevCmapSize != cmapSize || !ctable) { 59751bd803fbdade51d674598ed45da3d54190a656cJohn McCall /* free previously cached color table */ 598c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall if (ctable) 599c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall free(ctable); 600c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall /* Get the color table from X */ 60154e14c4db764c0636160d26c5bbf491637c83a76John McCall ctable = (XMesaColor *) MALLOC(cmapSize * sizeof(XMesaColor)); 60254e14c4db764c0636160d26c5bbf491637c83a76John McCall assert(ctable); 60354e14c4db764c0636160d26c5bbf491637c83a76John McCall for (i = 0; i < cmapSize; i++) { 60454e14c4db764c0636160d26c5bbf491637c83a76John McCall ctable[i].pixel = i; 605a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall } 60651bd803fbdade51d674598ed45da3d54190a656cJohn McCall XQueryColors(dpy, cmap, ctable, cmapSize); 60751bd803fbdade51d674598ed45da3d54190a656cJohn McCall prevDisplay = dpy; 608a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall prevCmap = cmap; 609b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman prevCmapSize = cmapSize; 610b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman } 611b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman#endif 612b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman 613b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman /* Find best match. */ 614a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall bestmatch = -1; 6154dcf151a555ff51e4d643e8e6eeb80f121d11d1bChris Lattner mindist = 0.0; 616a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl for (i = 0; i < cmapSize; i++) { 6172cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor double dr = 0.30 * ((double) color->red - (double) ctable[i].red); 6182cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor double dg = 0.59 * ((double) color->green - (double) ctable[i].green); 619b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner double db = 0.11 * ((double) color->blue - (double) ctable[i].blue); 620b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner double dist = dr * dr + dg * dg + db * db; 62189eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis if (bestmatch < 0 || dist < mindist) { 622b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner bestmatch = i; 623b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner mindist = dist; 624b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner } 625b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner } 626b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner 627b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner /* Return result. */ 628b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner subColor.red = ctable[bestmatch].red; 629b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner subColor.green = ctable[bestmatch].green; 630b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner subColor.blue = ctable[bestmatch].blue; 631b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner /* Try to allocate the closest match color. This should only 632b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner * fail if the cell is read/write. Otherwise, we're incrementing 633b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner * the cell's reference count. 634b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner */ 635b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner#ifdef XFree86Server 63689eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis if (AllocColor(cmap, 637b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner &subColor.red, &subColor.green, &subColor.blue, 638b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner &subColor.pixel, 639b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner client) == Success) { 640b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner#else 641b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner if (XAllocColor(dpy, cmap, &subColor)) { 6420558df2da807646e65d4fa290f4e92114af1a746Chris Lattner#endif 6430558df2da807646e65d4fa290f4e92114af1a746Chris Lattner *alloced = 1; 6440558df2da807646e65d4fa290f4e92114af1a746Chris Lattner } 64589eaf3af92c72c0c1aae807644e39cabc461d685Argyrios Kyrtzidis else { 6468538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl /* do this to work around a problem reported by Frank Ortega */ 6470558df2da807646e65d4fa290f4e92114af1a746Chris Lattner subColor.pixel = (unsigned long) bestmatch; 6480558df2da807646e65d4fa290f4e92114af1a746Chris Lattner subColor.red = ctable[bestmatch].red; 6490558df2da807646e65d4fa290f4e92114af1a746Chris Lattner subColor.green = ctable[bestmatch].green; 6500558df2da807646e65d4fa290f4e92114af1a746Chris Lattner subColor.blue = ctable[bestmatch].blue; 6510558df2da807646e65d4fa290f4e92114af1a746Chris Lattner subColor.flags = DoRed | DoGreen | DoBlue; 6520558df2da807646e65d4fa290f4e92114af1a746Chris Lattner *alloced = 0; 6530558df2da807646e65d4fa290f4e92114af1a746Chris Lattner } 6540558df2da807646e65d4fa290f4e92114af1a746Chris Lattner#ifdef XFree86Server 6550558df2da807646e65d4fa290f4e92114af1a746Chris Lattner free(ppixIn); 6560558df2da807646e65d4fa290f4e92114af1a746Chris Lattner free(ctable); 6570558df2da807646e65d4fa290f4e92114af1a746Chris Lattner#else 6580558df2da807646e65d4fa290f4e92114af1a746Chris Lattner /* don't free table, save it for next time */ 6590558df2da807646e65d4fa290f4e92114af1a746Chris Lattner#endif 6600558df2da807646e65d4fa290f4e92114af1a746Chris Lattner 6610558df2da807646e65d4fa290f4e92114af1a746Chris Lattner *color = subColor; 6620558df2da807646e65d4fa290f4e92114af1a746Chris Lattner *exact = 0; 6630558df2da807646e65d4fa290f4e92114af1a746Chris Lattner} 6640558df2da807646e65d4fa290f4e92114af1a746Chris Lattner 6650558df2da807646e65d4fa290f4e92114af1a746Chris Lattner 6660558df2da807646e65d4fa290f4e92114af1a746Chris Lattner 6670558df2da807646e65d4fa290f4e92114af1a746Chris Lattner/** 6680558df2da807646e65d4fa290f4e92114af1a746Chris Lattner * Do setup for PF_GRAYSCALE pixel format. 6690558df2da807646e65d4fa290f4e92114af1a746Chris Lattner * Note that buffer may be NULL. 6700558df2da807646e65d4fa290f4e92114af1a746Chris Lattner */ 6710558df2da807646e65d4fa290f4e92114af1a746Chris Lattnerstatic GLboolean 6720558df2da807646e65d4fa290f4e92114af1a746Chris Lattnersetup_grayscale(int client, XMesaVisual v, 6730558df2da807646e65d4fa290f4e92114af1a746Chris Lattner XMesaBuffer buffer, XMesaColormap cmap) 6740558df2da807646e65d4fa290f4e92114af1a746Chris Lattner{ 6750558df2da807646e65d4fa290f4e92114af1a746Chris Lattner if (GET_VISUAL_DEPTH(v)<4 || GET_VISUAL_DEPTH(v)>16) { 6760558df2da807646e65d4fa290f4e92114af1a746Chris Lattner return GL_FALSE; 6770558df2da807646e65d4fa290f4e92114af1a746Chris Lattner } 6780558df2da807646e65d4fa290f4e92114af1a746Chris Lattner 6790558df2da807646e65d4fa290f4e92114af1a746Chris Lattner if (buffer) { 6800558df2da807646e65d4fa290f4e92114af1a746Chris Lattner XMesaBuffer prevBuffer; 6810558df2da807646e65d4fa290f4e92114af1a746Chris Lattner 6820558df2da807646e65d4fa290f4e92114af1a746Chris Lattner if (!cmap) { 6830558df2da807646e65d4fa290f4e92114af1a746Chris Lattner return GL_FALSE; 6840558df2da807646e65d4fa290f4e92114af1a746Chris Lattner } 6850558df2da807646e65d4fa290f4e92114af1a746Chris Lattner 6860558df2da807646e65d4fa290f4e92114af1a746Chris Lattner prevBuffer = xmesa_find_buffer(v->display, cmap, buffer); 6870558df2da807646e65d4fa290f4e92114af1a746Chris Lattner if (prevBuffer) { 6880558df2da807646e65d4fa290f4e92114af1a746Chris Lattner /* Copy colormap stuff from previous XMesaBuffer which uses same 6890558df2da807646e65d4fa290f4e92114af1a746Chris Lattner * X colormap. Do this to avoid time spent in noFaultXAllocColor. 6900558df2da807646e65d4fa290f4e92114af1a746Chris Lattner */ 6910558df2da807646e65d4fa290f4e92114af1a746Chris Lattner copy_colortable_info(buffer, prevBuffer); 6920558df2da807646e65d4fa290f4e92114af1a746Chris Lattner } 6930558df2da807646e65d4fa290f4e92114af1a746Chris Lattner else { 6940558df2da807646e65d4fa290f4e92114af1a746Chris Lattner /* Allocate 256 shades of gray */ 6950558df2da807646e65d4fa290f4e92114af1a746Chris Lattner int gray; 6960558df2da807646e65d4fa290f4e92114af1a746Chris Lattner int colorsfailed = 0; 697f111d935722ed488144600cea5ed03a6b5069e8fPeter Collingbourne for (gray=0;gray<256;gray++) { 6980558df2da807646e65d4fa290f4e92114af1a746Chris Lattner GLint r = gamma_adjust( v->RedGamma, gray, 255 ); 699ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek GLint g = gamma_adjust( v->GreenGamma, gray, 255 ); 700ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek GLint b = gamma_adjust( v->BlueGamma, gray, 255 ); 701ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek int exact, alloced; 7020558df2da807646e65d4fa290f4e92114af1a746Chris Lattner XMesaColor xcol; 7030558df2da807646e65d4fa290f4e92114af1a746Chris Lattner xcol.red = (r << 8) | r; 7040558df2da807646e65d4fa290f4e92114af1a746Chris Lattner xcol.green = (g << 8) | g; 7050558df2da807646e65d4fa290f4e92114af1a746Chris Lattner xcol.blue = (b << 8) | b; 7060558df2da807646e65d4fa290f4e92114af1a746Chris Lattner noFaultXAllocColor( client, v->display, 7070558df2da807646e65d4fa290f4e92114af1a746Chris Lattner cmap, GET_COLORMAP_SIZE(v), 7080558df2da807646e65d4fa290f4e92114af1a746Chris Lattner &xcol, &exact, &alloced ); 7090558df2da807646e65d4fa290f4e92114af1a746Chris Lattner if (!exact) { 7100558df2da807646e65d4fa290f4e92114af1a746Chris Lattner colorsfailed++; 7110558df2da807646e65d4fa290f4e92114af1a746Chris Lattner } 7120558df2da807646e65d4fa290f4e92114af1a746Chris Lattner if (alloced) { 7130558df2da807646e65d4fa290f4e92114af1a746Chris Lattner assert(buffer->num_alloced<256); 7140558df2da807646e65d4fa290f4e92114af1a746Chris Lattner buffer->alloced_colors[buffer->num_alloced] = xcol.pixel; 715ebcb57a8d298862c65043e88b2429591ab3c58d3Ted Kremenek buffer->num_alloced++; 716eb7f96141f754150a92433286fa385910a22f494Sam Weinig } 717eb7f96141f754150a92433286fa385910a22f494Sam Weinig 718eb7f96141f754150a92433286fa385910a22f494Sam Weinig /*OLD 719eb7f96141f754150a92433286fa385910a22f494Sam Weinig assert(gray < 576); 720eb7f96141f754150a92433286fa385910a22f494Sam Weinig buffer->color_table[gray*3+0] = xcol.pixel; 721eb7f96141f754150a92433286fa385910a22f494Sam Weinig buffer->color_table[gray*3+1] = xcol.pixel; 722eb7f96141f754150a92433286fa385910a22f494Sam Weinig buffer->color_table[gray*3+2] = xcol.pixel; 7239fcce65e7e1307b5b8da9be13e4092d6bb94dc1dRichard Smith assert(xcol.pixel < 65536); 724eb7f96141f754150a92433286fa385910a22f494Sam Weinig buffer->pixel_to_r[xcol.pixel] = gray * 30 / 100; 725eb7f96141f754150a92433286fa385910a22f494Sam Weinig buffer->pixel_to_g[xcol.pixel] = gray * 59 / 100; 726b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor buffer->pixel_to_b[xcol.pixel] = gray * 11 / 100; 727b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor */ 728b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor buffer->color_table[gray] = xcol.pixel; 729b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor assert(xcol.pixel < 65536); 730b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor buffer->pixel_to_r[xcol.pixel] = gray; 731b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor buffer->pixel_to_g[xcol.pixel] = gray; 732b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor buffer->pixel_to_b[xcol.pixel] = gray; 733b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor } 734b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor 735b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor if (colorsfailed && _mesa_getenv("MESA_DEBUG")) { 736b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor _mesa_warning(NULL, 737b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor "Note: %d out of 256 needed colors do not match exactly.\n", 738b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor colorsfailed ); 739b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor } 740b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor } 741b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor } 742b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor 743b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor v->dithered_pf = PF_Grayscale; 744b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor v->undithered_pf = PF_Grayscale; 745b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor return GL_TRUE; 746b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor} 747b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor 748b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor 749b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor 750b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor/** 751e08ce650a2b02410eddd1f60a4aa6b3d4be71e73Peter Collingbourne * Setup RGB rendering for a window with a PseudoColor, StaticColor, 7520558df2da807646e65d4fa290f4e92114af1a746Chris Lattner * or 8-bit TrueColor visual visual. We try to allocate a palette of 225 753b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner * colors (5 red, 9 green, 5 blue) and dither to approximate a 24-bit RGB 7541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump * color. While this function was originally designed just for 8-bit 755a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl * visuals, it has also proven to work from 4-bit up to 16-bit visuals. 756b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner * Dithering code contributed by Bob Mercier. 757b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner */ 7581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpstatic GLboolean 7598538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redlsetup_dithered_color(int client, XMesaVisual v, 7608538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl XMesaBuffer buffer, XMesaColormap cmap) 7611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump{ 7623397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl if (GET_VISUAL_DEPTH(v)<4 || GET_VISUAL_DEPTH(v)>16) { 763f29f0a28c4d9599b389bbb6d186e14af753dc5a3Sebastian Redl return GL_FALSE; 76451e774d42269e3b22d746184c0b9076fc13b32e6Zhongxing Xu } 76531d375f056447d4e2418275d4913661d3bfedb3eDouglas Gregor 766b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner if (buffer) { 767b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner XMesaBuffer prevBuffer; 768b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner 769ab41e63821dc60ad144d0684df8d79a9eef86b75Douglas Gregor if (!cmap) { 770b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner return GL_FALSE; 771b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner } 772b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner 773b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner prevBuffer = xmesa_find_buffer(v->display, cmap, buffer); 774b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner if (prevBuffer) { 775b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner /* Copy colormap stuff from previous, matching XMesaBuffer. 77649b96d1a382ae9f31456166f1a734d3f7f30b992Argyrios Kyrtzidis * Do this to avoid time spent in noFaultXAllocColor. 777b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner */ 778b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner copy_colortable_info(buffer, prevBuffer); 779b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner } 780b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner else { 7817f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor /* Allocate X colors and initialize color_table[], red_table[], etc */ 7827f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor int r, g, b, i; 7834fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor int colorsfailed = 0; 784b81c17092039f39be60e9656a37cffbdf2e2c783Douglas Gregor for (r = 0; r < DITH_R; r++) { 7855b4ec636637c9d876102240127cc0dca9280e83aTed Kremenek for (g = 0; g < DITH_G; g++) { 786e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis for (b = 0; b < DITH_B; b++) { 787e95b9198b8b70ce0219cfb89483b41102e02dbf5Douglas Gregor XMesaColor xcol; 788320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian int exact, alloced; 789b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor xcol.red =gamma_adjust(v->RedGamma, r*65535/(DITH_R-1),65535); 7902171bf1caba4d4b9eeb6a91efac4300b41f38b07Douglas Gregor xcol.green=gamma_adjust(v->GreenGamma, g*65535/(DITH_G-1),65535); 791b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor xcol.blue =gamma_adjust(v->BlueGamma, b*65535/(DITH_B-1),65535); 792b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor noFaultXAllocColor( client, v->display, 793b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor cmap, GET_COLORMAP_SIZE(v), 794b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor &xcol, &exact, &alloced ); 795b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor if (!exact) { 796b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor colorsfailed++; 797b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor } 798b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor if (alloced) { 799b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor assert(buffer->num_alloced<256); 80084bccea1ad9fd8bc1f4ec3d1fc5dd8d15dabffbcPeter Collingbourne buffer->alloced_colors[buffer->num_alloced] = xcol.pixel; 801cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor buffer->num_alloced++; 802837593fec8389eea3143920d7f2180b079b609e8Douglas Gregor } 80384bccea1ad9fd8bc1f4ec3d1fc5dd8d15dabffbcPeter Collingbourne i = DITH_MIX( r, g, b ); 80484bccea1ad9fd8bc1f4ec3d1fc5dd8d15dabffbcPeter Collingbourne assert(i < 576); 805ebcbe1d3dc7d4f0c1f540a632fa0684dd0a857d5Sean Hunt buffer->color_table[i] = xcol.pixel; 806d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor assert(xcol.pixel < 65536); 807d8bba9c15230d2b1b3893e272106aa79efc50251Douglas Gregor buffer->pixel_to_r[xcol.pixel] = r * 255 / (DITH_R-1); 808837593fec8389eea3143920d7f2180b079b609e8Douglas Gregor buffer->pixel_to_g[xcol.pixel] = g * 255 / (DITH_G-1); 809837593fec8389eea3143920d7f2180b079b609e8Douglas Gregor buffer->pixel_to_b[xcol.pixel] = b * 255 / (DITH_B-1); 810cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor } 811a126651270acf17c434f60f86a3ab3687f87813aDouglas Gregor } 812a126651270acf17c434f60f86a3ab3687f87813aDouglas Gregor } 8132171bf1caba4d4b9eeb6a91efac4300b41f38b07Douglas Gregor 8142171bf1caba4d4b9eeb6a91efac4300b41f38b07Douglas Gregor if (colorsfailed && _mesa_getenv("MESA_DEBUG")) { 815cff9f26ce0ed76d555cd33b3dca84dd5cdf376afDouglas Gregor _mesa_warning(NULL, 8162171bf1caba4d4b9eeb6a91efac4300b41f38b07Douglas Gregor "Note: %d out of %d needed colors do not match exactly.\n", 817b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner colorsfailed, DITH_R * DITH_G * DITH_B ); 8182f4efd10c805cb779618c1a22a35eb07b5043c4eChris Lattner } 819b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner } 820b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner } 821b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner 822f70d12dbd49fcc25f1dfc0127217112ae76bcb8fChandler Carruth v->dithered_pf = PF_Dither; 8231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump v->undithered_pf = PF_Lookup; 824b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner return GL_TRUE; 8252f4efd10c805cb779618c1a22a35eb07b5043c4eChris Lattner} 826b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner 827b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner 828b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner/** 829b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor * Setup for Hewlett Packard Color Recovery 8-bit TrueColor mode. 83061d60ee6aa0a5ded0ddcf48679673b37506a1895Douglas Gregor * HPCR simulates 24-bit color fidelity with an 8-bit frame buffer. 83161d60ee6aa0a5ded0ddcf48679673b37506a1895Douglas Gregor * Special dithering tables have to be initialized. 832b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner */ 833b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattnerstatic void 834b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattnersetup_8bit_hpcr(XMesaVisual v) 835b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner{ 836b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner /* HP Color Recovery contributed by: Alex De Bruyn (ad@lms.be) 837b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner * To work properly, the atom _HP_RGB_SMOOTH_MAP_LIST must be defined 838b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner * on the root window AND the colormap obtainable by XGetRGBColormaps 839b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner * for that atom must be set on the window. (see also tkInitWindow) 840b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner * If that colormap is not set, the output will look stripy. 841b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner */ 842b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner 843b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner /* Setup color tables with gamma correction */ 844b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner int i; 845b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner double g; 846b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner 847b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner g = 1.0 / v->RedGamma; 848b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner for (i=0; i<256; i++) { 849b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner GLint red = IROUND_POS(255.0 * _mesa_pow( hpcr_rgbTbl[0][i]/255.0, g )); 850b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner v->hpcr_rgbTbl[0][i] = CLAMP( red, 16, 239 ); 851b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner } 852a53d2cbe37e4be0d95b9d3e09f74eafae31fc940John McCall 853d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff g = 1.0 / v->GreenGamma; 854b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor for (i=0; i<256; i++) { 855b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor GLint green = IROUND_POS(255.0 * _mesa_pow( hpcr_rgbTbl[1][i]/255.0, g )); 856b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor v->hpcr_rgbTbl[1][i] = CLAMP( green, 16, 239 ); 857b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor } 858b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor 859b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor g = 1.0 / v->BlueGamma; 860b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor for (i=0; i<256; i++) { 861b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor GLint blue = IROUND_POS(255.0 * _mesa_pow( hpcr_rgbTbl[2][i]/255.0, g )); 862b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor v->hpcr_rgbTbl[2][i] = CLAMP( blue, 32, 223 ); 863b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor } 864b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor v->undithered_pf = PF_HPCR; /* can't really disable dithering for now */ 865b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor v->dithered_pf = PF_HPCR; 866b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor 867b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor /* which method should I use to clear */ 868b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor /* GL_FALSE: keep the ordinary method */ 869b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman /* GL_TRUE : clear with dither pattern */ 8700ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner v->hpcr_clear_flag = _mesa_getenv("MESA_HPCR_CLEAR") ? GL_TRUE : GL_FALSE; 8710ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner 8720ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner if (v->hpcr_clear_flag) { 8730ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner v->hpcr_clear_pixmap = XMesaCreatePixmap(v->display, 8740ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner DefaultRootWindow(v->display), 8750ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner 16, 2, 8); 8760ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner#ifndef XFree86Server 8770ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner v->hpcr_clear_ximage = XGetImage(v->display, v->hpcr_clear_pixmap, 8780ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner 0, 0, 16, 2, AllPlanes, ZPixmap); 8790ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner#endif 8800ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner } 8810ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner} 8820ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner 8830ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner 8840ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner/** 8850ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner * Setup RGB rendering for a window with a True/DirectColor visual. 886b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner */ 887b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattnerstatic void 8880ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattnersetup_truecolor(XMesaVisual v, XMesaBuffer buffer, XMesaColormap cmap) 889b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner{ 8900ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner unsigned long rmask, gmask, bmask; 8910ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner (void) buffer; 8920ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner (void) cmap; 8930ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner 894b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor /* Compute red multiplier (mask) and bit shift */ 895b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor v->rshift = 0; 896b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor rmask = GET_REDMASK(v); 897b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor while ((rmask & 1)==0) { 898b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor v->rshift++; 899b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor rmask = rmask >> 1; 900b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor } 901b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor 902b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor /* Compute green multiplier (mask) and bit shift */ 903b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor v->gshift = 0; 904b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor gmask = GET_GREENMASK(v); 905b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor while ((gmask & 1)==0) { 906b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor v->gshift++; 907b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor gmask = gmask >> 1; 908b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor } 909b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor 910b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor /* Compute blue multiplier (mask) and bit shift */ 911b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor v->bshift = 0; 912b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor bmask = GET_BLUEMASK(v); 913b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor while ((bmask & 1)==0) { 914b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor v->bshift++; 915b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor bmask = bmask >> 1; 916b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor } 917b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor 918b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor /* 919b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor * Compute component-to-pixel lookup tables and dithering kernel 920b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor */ 921b6c2b3f658df5525b9c0af606b64d304e7416c2fDouglas Gregor { 922a72d8c4556fbdfca2c9e101722812861fcbdde12Douglas Gregor static GLubyte kernel[16] = { 923a72d8c4556fbdfca2c9e101722812861fcbdde12Douglas Gregor 0*16, 8*16, 2*16, 10*16, 924a72d8c4556fbdfca2c9e101722812861fcbdde12Douglas Gregor 12*16, 4*16, 14*16, 6*16, 9254800a5c79023271408af49797e09be32aca93232Douglas Gregor 3*16, 11*16, 1*16, 9*16, 926f70d12dbd49fcc25f1dfc0127217112ae76bcb8fChandler Carruth 15*16, 7*16, 13*16, 5*16, 9274800a5c79023271408af49797e09be32aca93232Douglas Gregor }; 9284800a5c79023271408af49797e09be32aca93232Douglas Gregor GLint rBits = _mesa_bitcount(rmask); 9294800a5c79023271408af49797e09be32aca93232Douglas Gregor GLint gBits = _mesa_bitcount(gmask); 930b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner GLint bBits = _mesa_bitcount(bmask); 931b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner GLint maxBits; 932b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner GLuint i; 933b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner 934b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner /* convert pixel components in [0,_mask] to RGB values in [0,255] */ 935e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor for (i=0; i<=rmask; i++) 936e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor v->PixelToR[i] = (unsigned char) ((i * 255) / rmask); 9371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump for (i=0; i<=gmask; i++) 938e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor v->PixelToG[i] = (unsigned char) ((i * 255) / gmask); 939e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor for (i=0; i<=bmask; i++) 940e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor v->PixelToB[i] = (unsigned char) ((i * 255) / bmask); 941e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor 942e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor /* convert RGB values from [0,255] to pixel components */ 943e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor 944e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor for (i=0;i<256;i++) { 9451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump GLint r = gamma_adjust(v->RedGamma, i, 255); 946832d620b4ae0fc5fe28561b885b4cfc65cf5c9abDouglas Gregor GLint g = gamma_adjust(v->GreenGamma, i, 255); 947e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor GLint b = gamma_adjust(v->BlueGamma, i, 255); 9481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump v->RtoPixel[i] = (r >> (8-rBits)) << v->rshift; 949832d620b4ae0fc5fe28561b885b4cfc65cf5c9abDouglas Gregor v->GtoPixel[i] = (g >> (8-gBits)) << v->gshift; 950e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor v->BtoPixel[i] = (b >> (8-bBits)) << v->bshift; 9511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 952e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor /* overflow protection */ 953e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor for (i=256;i<512;i++) { 954832d620b4ae0fc5fe28561b885b4cfc65cf5c9abDouglas Gregor v->RtoPixel[i] = v->RtoPixel[255]; 955e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor v->GtoPixel[i] = v->GtoPixel[255]; 956e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor v->BtoPixel[i] = v->BtoPixel[255]; 9571eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 958e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor 959e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor /* setup dithering kernel */ 960e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor maxBits = rBits; 9611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (gBits > maxBits) maxBits = gBits; 962e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor if (bBits > maxBits) maxBits = bBits; 963e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor for (i=0;i<16;i++) { 964e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor v->Kernel[i] = kernel[i] >> maxBits; 965e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor } 966e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor 9671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump v->undithered_pf = PF_Truecolor; 968e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor v->dithered_pf = (GET_VISUAL_DEPTH(v)<24) ? PF_Dither_True : PF_Truecolor; 969e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor } 970b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner 9713397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl /* 972832d620b4ae0fc5fe28561b885b4cfc65cf5c9abDouglas Gregor * Now check for TrueColor visuals which we can optimize. 9738e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis */ 9742bec0410d268779f601bd509e0302a500af7ac6aDouglas Gregor if ( GET_REDMASK(v) ==0x0000ff 975b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor && GET_GREENMASK(v)==0x00ff00 976e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor && GET_BLUEMASK(v) ==0xff0000 977bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor && CHECK_BYTE_ORDER(v) 978e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor && v->BitsPerPixel==32 979e95b9198b8b70ce0219cfb89483b41102e02dbf5Douglas Gregor && v->RedGamma==1.0 && v->GreenGamma==1.0 && v->BlueGamma==1.0) { 9803397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl /* common 32 bpp config used on SGI, Sun */ 9813397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl v->undithered_pf = v->dithered_pf = PF_8A8B8G8R; /* ABGR */ 982e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor } 983e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor else if (GET_REDMASK(v) == 0xff0000 984e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor && GET_GREENMASK(v)== 0x00ff00 985bef35c91b594f66216f4aab303b71a6c5ab7abcfArgyrios Kyrtzidis && GET_BLUEMASK(v) == 0x0000ff 986e95b9198b8b70ce0219cfb89483b41102e02dbf5Douglas Gregor && CHECK_BYTE_ORDER(v) 987e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor && v->RedGamma == 1.0 && v->GreenGamma == 1.0 && v->BlueGamma == 1.0){ 9881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (v->BitsPerPixel==32) { 989e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor /* if 32 bpp, and visual indicates 8 bpp alpha channel */ 990e95b9198b8b70ce0219cfb89483b41102e02dbf5Douglas Gregor if (GET_VISUAL_DEPTH(v) == 32 && v->mesa_visual.alphaBits == 8) 9918538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl v->undithered_pf = v->dithered_pf = PF_8A8R8G8B; /* ARGB */ 9928538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl else 993e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor v->undithered_pf = v->dithered_pf = PF_8R8G8B; /* xRGB */ 994e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor } 995832d620b4ae0fc5fe28561b885b4cfc65cf5c9abDouglas Gregor else if (v->BitsPerPixel == 24) { 996bef35c91b594f66216f4aab303b71a6c5ab7abcfArgyrios Kyrtzidis v->undithered_pf = v->dithered_pf = PF_8R8G8B24; /* RGB */ 997e95b9198b8b70ce0219cfb89483b41102e02dbf5Douglas Gregor } 998e95b9198b8b70ce0219cfb89483b41102e02dbf5Douglas Gregor } 999e95b9198b8b70ce0219cfb89483b41102e02dbf5Douglas Gregor else if (GET_REDMASK(v) ==0xf800 1000e95b9198b8b70ce0219cfb89483b41102e02dbf5Douglas Gregor && GET_GREENMASK(v)==0x07e0 1001e95b9198b8b70ce0219cfb89483b41102e02dbf5Douglas Gregor && GET_BLUEMASK(v) ==0x001f 1002e95b9198b8b70ce0219cfb89483b41102e02dbf5Douglas Gregor && CHECK_BYTE_ORDER(v) 1003e95b9198b8b70ce0219cfb89483b41102e02dbf5Douglas Gregor && v->BitsPerPixel==16 100410bc00fd45824f9b5cd139d63af8b0f6d28aaddaDouglas Gregor && v->RedGamma==1.0 && v->GreenGamma==1.0 && v->BlueGamma==1.0) { 100510bc00fd45824f9b5cd139d63af8b0f6d28aaddaDouglas Gregor /* 5-6-5 RGB */ 100610bc00fd45824f9b5cd139d63af8b0f6d28aaddaDouglas Gregor v->undithered_pf = PF_5R6G5B; 100710bc00fd45824f9b5cd139d63af8b0f6d28aaddaDouglas Gregor v->dithered_pf = PF_Dither_5R6G5B; 100810bc00fd45824f9b5cd139d63af8b0f6d28aaddaDouglas Gregor } 100910bc00fd45824f9b5cd139d63af8b0f6d28aaddaDouglas Gregor else if (GET_REDMASK(v) ==0xe0 101010bc00fd45824f9b5cd139d63af8b0f6d28aaddaDouglas Gregor && GET_GREENMASK(v)==0x1c 101110bc00fd45824f9b5cd139d63af8b0f6d28aaddaDouglas Gregor && GET_BLUEMASK(v) ==0x03 101210bc00fd45824f9b5cd139d63af8b0f6d28aaddaDouglas Gregor && CHECK_FOR_HPCR(v)) { 101310bc00fd45824f9b5cd139d63af8b0f6d28aaddaDouglas Gregor /* 8-bit HP color recovery */ 101410bc00fd45824f9b5cd139d63af8b0f6d28aaddaDouglas Gregor setup_8bit_hpcr( v ); 101510bc00fd45824f9b5cd139d63af8b0f6d28aaddaDouglas Gregor } 101610bc00fd45824f9b5cd139d63af8b0f6d28aaddaDouglas Gregor} 101710bc00fd45824f9b5cd139d63af8b0f6d28aaddaDouglas Gregor 1018e95b9198b8b70ce0219cfb89483b41102e02dbf5Douglas Gregor 1019e95b9198b8b70ce0219cfb89483b41102e02dbf5Douglas Gregor 10201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/** 102131d375f056447d4e2418275d4913661d3bfedb3eDouglas Gregor * Setup RGB rendering for a window with a monochrome visual. 1022b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor */ 1023b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregorstatic void 1024b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregorsetup_monochrome( XMesaVisual v, XMesaBuffer b ) 10258538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl{ 1026b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor (void) b; 1027b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor v->dithered_pf = v->undithered_pf = PF_1Bit; 1028b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor /* if black=1 then we must flip pixel values */ 1029f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith v->bitFlip = (GET_BLACK_PIXEL(v) != 0); 10301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump} 1031fbfd180495e7800975c6d9bdc6d24e706ef70e34Michael J. Spencer 1032b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor 1033aba54a95e9d5e4dc9056abec6bb70ea777c4a7bcKovarththanan Rajaratnam 10341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/** 1035e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor * When a context is bound for the first time, we can finally finish 1036b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor * initializing the context's visual and buffer information. 10378538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl * \param v the XMesaVisual to initialize 1038ec312a1f0557b1d27f3eb6cf49acbf7e72696422Daniel Dunbar * \param b the XMesaBuffer to initialize (may be NULL) 103931d375f056447d4e2418275d4913661d3bfedb3eDouglas Gregor * \param rgb_flag TRUE = RGBA mode, FALSE = color index mode 104031d375f056447d4e2418275d4913661d3bfedb3eDouglas Gregor * \param window the window/pixmap we're rendering into 104131d375f056447d4e2418275d4913661d3bfedb3eDouglas Gregor * \param cmap the colormap associated with the window/pixmap 104231d375f056447d4e2418275d4913661d3bfedb3eDouglas Gregor * \return GL_TRUE=success, GL_FALSE=failure 1043b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor */ 104411a18f115e8974ef24e8d5bb549ed3289871efa4Kovarththanan Rajaratnamstatic GLboolean 10458e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidisinitialize_visual_and_buffer(XMesaVisual v, XMesaBuffer b, 10468e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis XMesaDrawable window, 10478e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis XMesaColormap cmap) 10488e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis{ 10498e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis int client = 0; 10508e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis const int xclass = v->mesa_visual.visualType; 10518e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis 1052f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith#ifdef XFree86Server 10538e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis client = (window) ? CLIENT_ID(window->id) : 0; 10548e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis#endif 10558e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis 10568e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis ASSERT(!b || b->xm_visual == v); 10578e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis 10588e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis /* Save true bits/pixel */ 10598e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis v->BitsPerPixel = bits_per_pixel(v); 10608e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis assert(v->BitsPerPixel > 0); 10618e3df4d0864f0a966c20088ca1a29c3398b7639dArgyrios Kyrtzidis 1062f7a96a39958b3f919f26764777eec948b43d74bcTed Kremenek /* RGB WINDOW: 1063f7a96a39958b3f919f26764777eec948b43d74bcTed Kremenek * We support RGB rendering into almost any kind of visual. 10648538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl */ 1065f7a96a39958b3f919f26764777eec948b43d74bcTed Kremenek if (xclass == GLX_TRUE_COLOR || xclass == GLX_DIRECT_COLOR) { 1066f7a96a39958b3f919f26764777eec948b43d74bcTed Kremenek setup_truecolor( v, b, cmap ); 1067445e23e9b909ec8e21303c7dd82c90b72fc09ac4Douglas Gregor } 10688538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl else if (xclass == GLX_STATIC_GRAY && GET_VISUAL_DEPTH(v) == 1) { 1069f7a96a39958b3f919f26764777eec948b43d74bcTed Kremenek setup_monochrome( v, b ); 1070f7a96a39958b3f919f26764777eec948b43d74bcTed Kremenek } 10712bec0410d268779f601bd509e0302a500af7ac6aDouglas Gregor else if (xclass == GLX_GRAY_SCALE || xclass == GLX_STATIC_GRAY) { 10722bec0410d268779f601bd509e0302a500af7ac6aDouglas Gregor if (!setup_grayscale( client, v, b, cmap )) { 10732bec0410d268779f601bd509e0302a500af7ac6aDouglas Gregor return GL_FALSE; 1074a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl } 10750a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor } 10767d5e81bf24dbfd334a7c62a7ae51043c79a69aa9Douglas Gregor else if ((xclass == GLX_PSEUDO_COLOR || xclass == GLX_STATIC_COLOR) 10777d5e81bf24dbfd334a7c62a7ae51043c79a69aa9Douglas Gregor && GET_VISUAL_DEPTH(v)>=4 && GET_VISUAL_DEPTH(v)<=16) { 10787d5e81bf24dbfd334a7c62a7ae51043c79a69aa9Douglas Gregor if (!setup_dithered_color( client, v, b, cmap )) { 10797d5e81bf24dbfd334a7c62a7ae51043c79a69aa9Douglas Gregor return GL_FALSE; 10807d5e81bf24dbfd334a7c62a7ae51043c79a69aa9Douglas Gregor } 1081b86b8dc7ef89405205f94635c1073cdb1a7093ebDouglas Gregor } 1082b86b8dc7ef89405205f94635c1073cdb1a7093ebDouglas Gregor else { 1083b86b8dc7ef89405205f94635c1073cdb1a7093ebDouglas Gregor _mesa_warning(NULL, "XMesa: RGB mode rendering not supported in given visual.\n"); 10848538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl return GL_FALSE; 10850a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor } 10860a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor v->mesa_visual.indexBits = 0; 108714f79002e58556798e86168c63e48d533287eda5Douglas Gregor 10884fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor if (_mesa_getenv("MESA_NO_DITHER")) { 10894fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor v->dithered_pf = v->undithered_pf; 10904fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor } 10914fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor 10924fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor 10933397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl /* 10944fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor * If MESA_INFO env var is set print out some debugging info 10954fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor * which can help Brian figure out what's going on when a user 10964fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor * reports bugs. 10971eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump */ 109874e976ba4b0d407bb798ea26476f618e256fc8c7Chris Lattner if (_mesa_getenv("MESA_INFO")) { 109974e976ba4b0d407bb798ea26476f618e256fc8c7Chris Lattner printf("X/Mesa visual = %p\n", (void *) v); 11004fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor printf("X/Mesa dithered pf = %u\n", v->dithered_pf); 11014fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor printf("X/Mesa undithered pf = %u\n", v->undithered_pf); 11022596e429a61602312bdd149786045b8a90cd2d10Daniel Dunbar printf("X/Mesa level = %d\n", v->mesa_visual.level); 11034fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor printf("X/Mesa depth = %d\n", GET_VISUAL_DEPTH(v)); 11041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump printf("X/Mesa bits per pixel = %d\n", v->BitsPerPixel); 11051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 11065f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner 11074fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor if (b && window) { 11084fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor char *data; 11094fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor 111074e976ba4b0d407bb798ea26476f618e256fc8c7Chris Lattner /* Do window-specific initializations */ 11114fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor 11124fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor /* these should have been set in create_xmesa_buffer */ 11134fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor ASSERT(b->frontxrb->drawable == window); 11141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump ASSERT(b->frontxrb->pixmap == (XMesaPixmap) window); 11155f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner 11164fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor /* Setup for single/double buffering */ 11174fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor if (v->mesa_visual.doubleBufferMode) { 11181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /* Double buffered */ 11195f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner b->shm = check_for_xshm( v->display ); 11204fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor } 11214fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor 11224fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor /* X11 graphics contexts */ 11231eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump#ifdef XFree86Server 112474e976ba4b0d407bb798ea26476f618e256fc8c7Chris Lattner b->gc = CreateScratchGC(v->display, window->depth); 112574e976ba4b0d407bb798ea26476f618e256fc8c7Chris Lattner#else 112674e976ba4b0d407bb798ea26476f618e256fc8c7Chris Lattner b->gc = XCreateGC( v->display, window, 0, NULL ); 112774e976ba4b0d407bb798ea26476f618e256fc8c7Chris Lattner#endif 112874e976ba4b0d407bb798ea26476f618e256fc8c7Chris Lattner XMesaSetFunction( v->display, b->gc, GXcopy ); 11294fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor 11304fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor /* cleargc - for glClear() */ 11314fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor#ifdef XFree86Server 11324fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor b->cleargc = CreateScratchGC(v->display, window->depth); 11334fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor#else 11344fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor b->cleargc = XCreateGC( v->display, window, 0, NULL ); 11353397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl#endif 1136a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl XMesaSetFunction( v->display, b->cleargc, GXcopy ); 11374fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor 11384fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor /* 11393397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl * Don't generate Graphics Expose/NoExpose events in swapbuffers(). 11404fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor * Patch contributed by Michael Pichler May 15, 1995. 11411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump */ 11424fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor#ifdef XFree86Server 1143e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor b->swapgc = CreateScratchGC(v->display, window->depth); 11445f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner { 11451e5f83ba515157dc7f263dc91b1d51c7a5754c35Chris Lattner CARD32 v[1]; 1146e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor v[0] = FALSE; 11471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump dixChangeGC(NullClient, b->swapgc, GCGraphicsExposures, v, NULL); 11484fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor } 1149f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith#else 11504fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor { 11514fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor XGCValues gcvalues; 11524fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor gcvalues.graphics_exposures = False; 11534fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor b->swapgc = XCreateGC(v->display, window, 11544fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor GCGraphicsExposures, &gcvalues); 11554fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor } 11564fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor#endif 11574fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor XMesaSetFunction( v->display, b->swapgc, GXcopy ); 11584fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor /* 11594fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor * Set fill style and tile pixmap once for all for HPCR stuff 11604fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor * (instead of doing it each time in clear_color_HPCR_pixmap()) 11618538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl * Initialize whole stuff 11624fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor * Patch contributed by Jacques Leroy March 8, 1998. 11634fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor */ 11644fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor if (v->hpcr_clear_flag && b->backxrb && b->backxrb->pixmap) { 11654fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor int i; 11664fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor for (i = 0; i < 16; i++) { 11674fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor XMesaPutPixel(v->hpcr_clear_ximage, i, 0, 0); 11684fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor XMesaPutPixel(v->hpcr_clear_ximage, i, 1, 0); 11698538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl } 11704fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor XMesaPutImage(b->display, (XMesaDrawable) v->hpcr_clear_pixmap, 11714fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor b->cleargc, v->hpcr_clear_ximage, 0, 0, 0, 0, 16, 2); 1172ec312a1f0557b1d27f3eb6cf49acbf7e72696422Daniel Dunbar XMesaSetFillStyle( v->display, b->cleargc, FillTiled); 11734fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor XMesaSetTile( v->display, b->cleargc, v->hpcr_clear_pixmap ); 11744fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor } 11754fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor 117614f79002e58556798e86168c63e48d533287eda5Douglas Gregor /* Initialize the row buffer XImage for use in write_color_span() */ 117714f79002e58556798e86168c63e48d533287eda5Douglas Gregor data = (char*) MALLOC(MAX_WIDTH*4); 117814f79002e58556798e86168c63e48d533287eda5Douglas Gregor#ifdef XFree86Server 117914f79002e58556798e86168c63e48d533287eda5Douglas Gregor b->rowimage = XMesaCreateImage(GET_VISUAL_DEPTH(v), MAX_WIDTH, 1, data); 118014f79002e58556798e86168c63e48d533287eda5Douglas Gregor#else 1181c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor b->rowimage = XCreateImage( v->display, 118214f79002e58556798e86168c63e48d533287eda5Douglas Gregor v->visinfo->visual, 118314f79002e58556798e86168c63e48d533287eda5Douglas Gregor v->visinfo->depth, 11848538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl ZPixmap, 0, /*format, offset*/ 118514f79002e58556798e86168c63e48d533287eda5Douglas Gregor data, /*data*/ 118614f79002e58556798e86168c63e48d533287eda5Douglas Gregor MAX_WIDTH, 1, /*width, height*/ 118714f79002e58556798e86168c63e48d533287eda5Douglas Gregor 32, /*bitmap_pad*/ 118814f79002e58556798e86168c63e48d533287eda5Douglas Gregor 0 /*bytes_per_line*/ ); 11892d52be56ff595341be3c6cec337af6763804ce66Douglas Gregor#endif 11902d52be56ff595341be3c6cec337af6763804ce66Douglas Gregor if (!b->rowimage) 11912d52be56ff595341be3c6cec337af6763804ce66Douglas Gregor return GL_FALSE; 1192a081da5e44600d02983d6562bed1b4fd61e410fdDouglas Gregor } 1193d9d2b679d0728ea7f539f38aaea38e26b8b08043Argyrios Kyrtzidis 119410f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis return GL_TRUE; 119510f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis} 119614f79002e58556798e86168c63e48d533287eda5Douglas Gregor 1197c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor 119814f79002e58556798e86168c63e48d533287eda5Douglas Gregor 119914f79002e58556798e86168c63e48d533287eda5Douglas Gregor/* 120014f79002e58556798e86168c63e48d533287eda5Douglas Gregor * Convert an RGBA color to a pixel value. 120114f79002e58556798e86168c63e48d533287eda5Douglas Gregor */ 1202c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregorunsigned long 120314f79002e58556798e86168c63e48d533287eda5Douglas Gregorxmesa_color_to_pixel(GLcontext *ctx, 120414f79002e58556798e86168c63e48d533287eda5Douglas Gregor GLubyte r, GLubyte g, GLubyte b, GLubyte a, 12058538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl GLuint pixelFormat) 120614f79002e58556798e86168c63e48d533287eda5Douglas Gregor{ 120714f79002e58556798e86168c63e48d533287eda5Douglas Gregor XMesaContext xmesa = XMESA_CONTEXT(ctx); 120814f79002e58556798e86168c63e48d533287eda5Douglas Gregor switch (pixelFormat) { 120914f79002e58556798e86168c63e48d533287eda5Douglas Gregor case PF_Index: 121014f79002e58556798e86168c63e48d533287eda5Douglas Gregor return 0; 1211c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor case PF_Truecolor: 121214f79002e58556798e86168c63e48d533287eda5Douglas Gregor { 121314f79002e58556798e86168c63e48d533287eda5Douglas Gregor unsigned long p; 121414f79002e58556798e86168c63e48d533287eda5Douglas Gregor PACK_TRUECOLOR( p, r, g, b ); 121514f79002e58556798e86168c63e48d533287eda5Douglas Gregor return p; 1216c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor } 121714f79002e58556798e86168c63e48d533287eda5Douglas Gregor case PF_8A8B8G8R: 121814f79002e58556798e86168c63e48d533287eda5Douglas Gregor return PACK_8A8B8G8R( r, g, b, a ); 12198538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case PF_8A8R8G8B: 122014f79002e58556798e86168c63e48d533287eda5Douglas Gregor return PACK_8A8R8G8B( r, g, b, a ); 1221c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor case PF_8R8G8B: 122214f79002e58556798e86168c63e48d533287eda5Douglas Gregor /* fall through */ 122314f79002e58556798e86168c63e48d533287eda5Douglas Gregor case PF_8R8G8B24: 1224f70d12dbd49fcc25f1dfc0127217112ae76bcb8fChandler Carruth return PACK_8R8G8B( r, g, b ); 1225f70d12dbd49fcc25f1dfc0127217112ae76bcb8fChandler Carruth case PF_5R6G5B: 1226f70d12dbd49fcc25f1dfc0127217112ae76bcb8fChandler Carruth return PACK_5R6G5B( r, g, b ); 122714f79002e58556798e86168c63e48d533287eda5Douglas Gregor case PF_Dither: 122814f79002e58556798e86168c63e48d533287eda5Douglas Gregor { 1229f70d12dbd49fcc25f1dfc0127217112ae76bcb8fChandler Carruth DITHER_SETUP; 123014f79002e58556798e86168c63e48d533287eda5Douglas Gregor return DITHER( 1, 0, r, g, b ); 123114f79002e58556798e86168c63e48d533287eda5Douglas Gregor } 123214f79002e58556798e86168c63e48d533287eda5Douglas Gregor case PF_1Bit: 123314f79002e58556798e86168c63e48d533287eda5Douglas Gregor /* 382 = (3*255)/2 */ 1234f60e9918690fcf02974bc1ebecd42c99d561855eDouglas Gregor return ((r+g+b) > 382) ^ xmesa->xm_visual->bitFlip; 1235c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor case PF_HPCR: 123614f79002e58556798e86168c63e48d533287eda5Douglas Gregor return DITHER_HPCR(1, 1, r, g, b); 123714f79002e58556798e86168c63e48d533287eda5Douglas Gregor case PF_Lookup: 1238cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor { 1239cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor LOOKUP_SETUP; 1240cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor return LOOKUP( r, g, b ); 1241cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor } 1242590ad93bf59f4e5f6adcba0d78efc3a58cac15ceArgyrios Kyrtzidis case PF_Grayscale: 1243cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor return GRAY_RGB( r, g, b ); 1244b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor case PF_Dither_True: 1245b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor /* fall through */ 1246b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor case PF_Dither_5R6G5B: 1247b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor { 1248cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor unsigned long p; 1249590ad93bf59f4e5f6adcba0d78efc3a58cac15ceArgyrios Kyrtzidis PACK_TRUEDITHER(p, 1, 0, r, g, b); 1250cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor return p; 1251cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor } 1252cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor default: 1253cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor _mesa_problem(ctx, "Bad pixel format in xmesa_color_to_pixel"); 1254cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor } 1255cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor return 0; 1256cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor} 1257cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor 1258cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor 1259cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor#define NUM_VISUAL_TYPES 6 1260cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor 1261cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor/** 1262cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor * Convert an X visual type to a GLX visual type. 1263cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor * 1264cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor * \param visualType X visual type (i.e., \c TrueColor, \c StaticGray, etc.) 1265cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor * to be converted. 1266cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor * \return If \c visualType is a valid X visual type, a GLX visual type will 12675f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner * be returned. Otherwise \c GLX_NONE will be returned. 1268cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor * 1269cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor * \note 1270cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor * This code was lifted directly from lib/GL/glx/glcontextmodes.c in the 1271b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor * DRI CVS tree. 1272cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor */ 1273cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregorstatic GLint 1274cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregorxmesa_convert_from_x_visual_type( int visualType ) 1275cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor{ 12765f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner static const int glx_visual_types[ NUM_VISUAL_TYPES ] = { 1277cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor GLX_STATIC_GRAY, GLX_GRAY_SCALE, 1278cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor GLX_STATIC_COLOR, GLX_PSEUDO_COLOR, 1279cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor GLX_TRUE_COLOR, GLX_DIRECT_COLOR 12805f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner }; 1281cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor 1282cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor return ( (unsigned) visualType < NUM_VISUAL_TYPES ) 1283cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor ? glx_visual_types[ visualType ] : GLX_NONE; 1284cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor} 1285b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor 1286b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor 1287b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor/**********************************************************************/ 1288b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor/***** Public Functions *****/ 1289b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor/**********************************************************************/ 1290cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor 1291cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor 1292cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor/* 1293cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor * Create a new X/Mesa visual. 1294cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor * Input: display - X11 display 1295cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor * visinfo - an XVisualInfo pointer 1296cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor * rgb_flag - GL_TRUE = RGB mode, 1297b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor * GL_FALSE = color index mode 1298b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor * alpha_flag - alpha buffer requested? 1299b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor * db_flag - GL_TRUE = double-buffered, 1300b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor * GL_FALSE = single buffered 1301b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor * stereo_flag - stereo visual? 1302b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor * ximage_flag - GL_TRUE = use an XImage for back buffer, 1303b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor * GL_FALSE = use an off-screen pixmap for back buffer 1304b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor * depth_size - requested bits/depth values, or zero 1305b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor * stencil_size - requested bits/stencil values, or zero 1306b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor * accum_red_size - requested bits/red accum values, or zero 1307b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor * accum_green_size - requested bits/green accum values, or zero 1308b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor * accum_blue_size - requested bits/blue accum values, or zero 1309b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor * accum_alpha_size - requested bits/alpha accum values, or zero 1310b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor * num_samples - number of samples/pixel if multisampling, or zero 1311b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor * level - visual level, usually 0 1312b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor * visualCaveat - ala the GLX extension, usually GLX_NONE 1313b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor * Return; a new XMesaVisual or 0 if error. 1314b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor */ 1315cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas GregorPUBLIC 1316cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas GregorXMesaVisual XMesaCreateVisual( XMesaDisplay *display, 1317b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor XMesaVisualInfo visinfo, 1318b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor GLboolean rgb_flag, 1319b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor GLboolean alpha_flag, 1320cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor GLboolean db_flag, 1321cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor GLboolean stereo_flag, 1322cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor GLboolean ximage_flag, 1323cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor GLint depth_size, 1324cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor GLint stencil_size, 1325cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor GLint accum_red_size, 1326cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor GLint accum_green_size, 1327cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor GLint accum_blue_size, 1328590ad93bf59f4e5f6adcba0d78efc3a58cac15ceArgyrios Kyrtzidis GLint accum_alpha_size, 13295f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner GLint num_samples, 1330cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor GLint level, 1331cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor GLint visualCaveat ) 1332cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor{ 1333cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor char *gamma; 1334cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor XMesaVisual v; 1335cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor GLint red_bits, green_bits, blue_bits, alpha_bits; 1336cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor 13375f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner#ifndef XFree86Server 1338cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor /* For debugging only */ 1339cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor if (_mesa_getenv("MESA_XSYNC")) { 1340cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor /* This makes debugging X easier. 1341cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor * In your debugger, set a breakpoint on _XError to stop when an 1342cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor * X protocol error is generated. 1343cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor */ 1344590ad93bf59f4e5f6adcba0d78efc3a58cac15ceArgyrios Kyrtzidis XSynchronize( display, 1 ); 1345590ad93bf59f4e5f6adcba0d78efc3a58cac15ceArgyrios Kyrtzidis } 1346590ad93bf59f4e5f6adcba0d78efc3a58cac15ceArgyrios Kyrtzidis#endif 1347cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor 1348cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor /* Color-index rendering not supported. */ 1349cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor if (!rgb_flag) 1350cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor return NULL; 1351cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor 1352cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor v = (XMesaVisual) CALLOC_STRUCT(xmesa_visual); 1353cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor if (!v) { 1354cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor return NULL; 1355cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor } 1356cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor 1357cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor v->display = display; 1358cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor 1359cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor /* Save a copy of the XVisualInfo struct because the user may Xfree() 1360cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor * the struct but we may need some of the information contained in it 1361cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor * at a later time. 1362cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor */ 1363cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor#ifndef XFree86Server 1364cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor v->visinfo = (XVisualInfo *) MALLOC(sizeof(*visinfo)); 1365cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor if(!v->visinfo) { 1366f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith free(v); 1367cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor return NULL; 1368cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor } 1369cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor memcpy(v->visinfo, visinfo, sizeof(*visinfo)); 1370cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor#endif 1371cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor 1372cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor /* check for MESA_GAMMA environment variable */ 1373cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor gamma = _mesa_getenv("MESA_GAMMA"); 1374cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor if (gamma) { 1375cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor v->RedGamma = v->GreenGamma = v->BlueGamma = 0.0; 1376cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor sscanf( gamma, "%f %f %f", &v->RedGamma, &v->GreenGamma, &v->BlueGamma ); 1377cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor if (v->RedGamma<=0.0) v->RedGamma = 1.0; 1378cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor if (v->GreenGamma<=0.0) v->GreenGamma = v->RedGamma; 1379cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor if (v->BlueGamma<=0.0) v->BlueGamma = v->RedGamma; 1380cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor } 1381b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor else { 1382cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor v->RedGamma = v->GreenGamma = v->BlueGamma = 1.0; 1383cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor } 1384cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor 1385b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor v->ximage_flag = ximage_flag; 1386cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor 1387cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor#ifdef XFree86Server 1388cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor /* We could calculate these values by ourselves. nplanes is either the sum 1389cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor * of the red, green, and blue bits or the number index bits. 1390b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor * ColormapEntries is either (1U << index_bits) or 1391b4dc485a2b38ea98ba7da01596fd0e8438120346Douglas Gregor * (1U << max(redBits, greenBits, blueBits)). 1392cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor */ 1393cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor assert(visinfo->nplanes > 0); 1394cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor v->nplanes = visinfo->nplanes; 1395cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor v->ColormapEntries = visinfo->ColormapEntries; 1396cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor 1397cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor v->mesa_visual.redMask = visinfo->redMask; 1398cfbf1c7536e016dc275139dd842d4a5f059a749fDouglas Gregor v->mesa_visual.greenMask = visinfo->greenMask; 139914f79002e58556798e86168c63e48d533287eda5Douglas Gregor v->mesa_visual.blueMask = visinfo->blueMask; 140014f79002e58556798e86168c63e48d533287eda5Douglas Gregor v->mesa_visual.visualID = visinfo->vid; 140114f79002e58556798e86168c63e48d533287eda5Douglas Gregor v->mesa_visual.screen = 0; /* FIXME: What should be done here? */ 140214f79002e58556798e86168c63e48d533287eda5Douglas Gregor#else 140314f79002e58556798e86168c63e48d533287eda5Douglas Gregor v->mesa_visual.redMask = visinfo->red_mask; 140414f79002e58556798e86168c63e48d533287eda5Douglas Gregor v->mesa_visual.greenMask = visinfo->green_mask; 140514f79002e58556798e86168c63e48d533287eda5Douglas Gregor v->mesa_visual.blueMask = visinfo->blue_mask; 140614f79002e58556798e86168c63e48d533287eda5Douglas Gregor v->mesa_visual.visualID = visinfo->visualid; 1407a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl v->mesa_visual.screen = visinfo->screen; 1408e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor#endif 1409832d620b4ae0fc5fe28561b885b4cfc65cf5c9abDouglas Gregor 14107f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor#if defined(XFree86Server) || !(defined(__cplusplus) || defined(c_plusplus)) 14117f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor v->mesa_visual.visualType = xmesa_convert_from_x_visual_type(visinfo->class); 1412f04ad69fed38d26fc0d6f7d6fd0a4631ddfbc7feChris Lattner#else 14138538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl v->mesa_visual.visualType = xmesa_convert_from_x_visual_type(visinfo->c_class); 141414f79002e58556798e86168c63e48d533287eda5Douglas Gregor#endif 141514f79002e58556798e86168c63e48d533287eda5Douglas Gregor 1416828e18cd80319c67b9b9776d1ed5411161d9f0bfChris Lattner v->mesa_visual.visualRating = visualCaveat; 1417828e18cd80319c67b9b9776d1ed5411161d9f0bfChris Lattner 1418828e18cd80319c67b9b9776d1ed5411161d9f0bfChris Lattner if (alpha_flag) 1419f70d12dbd49fcc25f1dfc0127217112ae76bcb8fChandler Carruth v->mesa_visual.alphaBits = 8; 14207f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor 142114f79002e58556798e86168c63e48d533287eda5Douglas Gregor (void) initialize_visual_and_buffer( v, NULL, 0, 0 ); 142214f79002e58556798e86168c63e48d533287eda5Douglas Gregor 1423090d9b53e32bb30d9e74de895bb59b409bd49e00Chris Lattner { 14244cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis const int xclass = v->mesa_visual.visualType; 14254cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis if (xclass == GLX_TRUE_COLOR || xclass == GLX_DIRECT_COLOR) { 14264cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis red_bits = _mesa_bitcount(GET_REDMASK(v)); 14277f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor green_bits = _mesa_bitcount(GET_GREENMASK(v)); 1428f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor blue_bits = _mesa_bitcount(GET_BLUEMASK(v)); 1429f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor } 14300fa7d0b15ea2a224bfe43ac745d411f915da87ddSebastian Redl else { 1431bdfe48ac80573e026595af91e541474dbf02565fDouglas Gregor /* this is an approximation */ 1432f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor int depth; 143311a18f115e8974ef24e8d5bb549ed3289871efa4Kovarththanan Rajaratnam depth = GET_VISUAL_DEPTH(v); 14347f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor red_bits = depth / 3; 14357f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor depth -= red_bits; 14367f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor green_bits = depth / 2; 143714f79002e58556798e86168c63e48d533287eda5Douglas Gregor depth -= green_bits; 143814f79002e58556798e86168c63e48d533287eda5Douglas Gregor blue_bits = depth; 143914f79002e58556798e86168c63e48d533287eda5Douglas Gregor alpha_bits = 0; 1440a081da5e44600d02983d6562bed1b4fd61e410fdDouglas Gregor assert( red_bits + green_bits + blue_bits == GET_VISUAL_DEPTH(v) ); 1441a081da5e44600d02983d6562bed1b4fd61e410fdDouglas Gregor } 14428538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl alpha_bits = v->mesa_visual.alphaBits; 14434cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis } 14444cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis 14458538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl _mesa_initialize_visual( &v->mesa_visual, 144614f79002e58556798e86168c63e48d533287eda5Douglas Gregor db_flag, stereo_flag, 1447f70d12dbd49fcc25f1dfc0127217112ae76bcb8fChandler Carruth red_bits, green_bits, 14487f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor blue_bits, alpha_bits, 144914f79002e58556798e86168c63e48d533287eda5Douglas Gregor depth_size, 145014f79002e58556798e86168c63e48d533287eda5Douglas Gregor stencil_size, 1451f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor accum_red_size, accum_green_size, 1452f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor accum_blue_size, accum_alpha_size, 145314f79002e58556798e86168c63e48d533287eda5Douglas Gregor 0 ); 145414f79002e58556798e86168c63e48d533287eda5Douglas Gregor 145514f79002e58556798e86168c63e48d533287eda5Douglas Gregor /* XXX minor hack */ 145614f79002e58556798e86168c63e48d533287eda5Douglas Gregor v->mesa_visual.level = level; 1457bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregor return v; 145814f79002e58556798e86168c63e48d533287eda5Douglas Gregor} 145914f79002e58556798e86168c63e48d533287eda5Douglas Gregor 1460b1c86492f9a9bef01a4567408c22f961bbd604feArgyrios Kyrtzidis 1461b1c86492f9a9bef01a4567408c22f961bbd604feArgyrios KyrtzidisPUBLIC 1462a081da5e44600d02983d6562bed1b4fd61e410fdDouglas Gregorvoid XMesaDestroyVisual( XMesaVisual v ) 1463b1c86492f9a9bef01a4567408c22f961bbd604feArgyrios Kyrtzidis{ 146414f79002e58556798e86168c63e48d533287eda5Douglas Gregor#ifndef XFree86Server 146514f79002e58556798e86168c63e48d533287eda5Douglas Gregor free(v->visinfo); 14661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump#endif 14672d52be56ff595341be3c6cec337af6763804ce66Douglas Gregor free(v); 1468b1c86492f9a9bef01a4567408c22f961bbd604feArgyrios Kyrtzidis} 1469b1c86492f9a9bef01a4567408c22f961bbd604feArgyrios Kyrtzidis 1470a081da5e44600d02983d6562bed1b4fd61e410fdDouglas Gregor 1471d9d2b679d0728ea7f539f38aaea38e26b8b08043Argyrios Kyrtzidis 147210f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis/** 147310f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis * Create a new XMesaContext. 147410f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis * \param v the XMesaVisual 147510f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis * \param share_list another XMesaContext with which to share display 147610f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis * lists or NULL if no sharing is wanted. 147710f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis * \return an XMesaContext or NULL if error. 147810f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis */ 147910f3df54486385e6497c9e5f229ff816e5a6c511Argyrios KyrtzidisPUBLIC 148010f3df54486385e6497c9e5f229ff816e5a6c511Argyrios KyrtzidisXMesaContext XMesaCreateContext( XMesaVisual v, XMesaContext share_list ) 1481a081da5e44600d02983d6562bed1b4fd61e410fdDouglas Gregor{ 1482e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor static GLboolean firstTime = GL_TRUE; 1483b1c86492f9a9bef01a4567408c22f961bbd604feArgyrios Kyrtzidis XMesaContext c; 1484f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith GLcontext *mesaCtx; 14852c10c8072cabeb22651462e435e8b81f3221b6a5Anders Carlsson struct dd_function_table functions; 14862c10c8072cabeb22651462e435e8b81f3221b6a5Anders Carlsson TNLcontext *tnl; 14872c10c8072cabeb22651462e435e8b81f3221b6a5Anders Carlsson 14882c10c8072cabeb22651462e435e8b81f3221b6a5Anders Carlsson if (firstTime) { 14892c10c8072cabeb22651462e435e8b81f3221b6a5Anders Carlsson _glthread_INIT_MUTEX(_xmesa_lock); 14902c10c8072cabeb22651462e435e8b81f3221b6a5Anders Carlsson firstTime = GL_FALSE; 14912c10c8072cabeb22651462e435e8b81f3221b6a5Anders Carlsson } 1492fbfd180495e7800975c6d9bdc6d24e706ef70e34Michael J. Spencer 1493aba54a95e9d5e4dc9056abec6bb70ea777c4a7bcKovarththanan Rajaratnam /* Note: the XMesaContext contains a Mesa GLcontext struct (inheritance) */ 14941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump c = (XMesaContext) CALLOC_STRUCT(xmesa_context); 1495e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor if (!c) 1496ec312a1f0557b1d27f3eb6cf49acbf7e72696422Daniel Dunbar return NULL; 1497a081da5e44600d02983d6562bed1b4fd61e410fdDouglas Gregor 1498a081da5e44600d02983d6562bed1b4fd61e410fdDouglas Gregor mesaCtx = &(c->mesa); 1499a081da5e44600d02983d6562bed1b4fd61e410fdDouglas Gregor 1500a081da5e44600d02983d6562bed1b4fd61e410fdDouglas Gregor /* initialize with default driver functions, then plug in XMesa funcs */ 1501a081da5e44600d02983d6562bed1b4fd61e410fdDouglas Gregor _mesa_init_driver_functions(&functions); 1502a081da5e44600d02983d6562bed1b4fd61e410fdDouglas Gregor xmesa_init_driver_functions(v, &functions); 1503a081da5e44600d02983d6562bed1b4fd61e410fdDouglas Gregor if (!_mesa_initialize_context(mesaCtx, &v->mesa_visual, 1504a081da5e44600d02983d6562bed1b4fd61e410fdDouglas Gregor share_list ? &(share_list->mesa) : (GLcontext *) NULL, 1505a081da5e44600d02983d6562bed1b4fd61e410fdDouglas Gregor &functions, (void *) c)) { 1506a081da5e44600d02983d6562bed1b4fd61e410fdDouglas Gregor free(c); 150714f79002e58556798e86168c63e48d533287eda5Douglas Gregor return NULL; 150814f79002e58556798e86168c63e48d533287eda5Douglas Gregor } 150914f79002e58556798e86168c63e48d533287eda5Douglas Gregor 151014f79002e58556798e86168c63e48d533287eda5Douglas Gregor /* Enable this to exercise fixed function -> shader translation 151114f79002e58556798e86168c63e48d533287eda5Douglas Gregor * with software rendering. 151214f79002e58556798e86168c63e48d533287eda5Douglas Gregor */ 151314f79002e58556798e86168c63e48d533287eda5Douglas Gregor if (0) { 151436c35ba0aca641e60e5dbee8efbc620c08b9bd61Douglas Gregor mesaCtx->VertexProgram._MaintainTnlProgram = GL_TRUE; 1515e127a0d80155b45dafe77f2b4380e5fa111a3345Chris Lattner mesaCtx->FragmentProgram._MaintainTexEnvProgram = GL_TRUE; 151614f79002e58556798e86168c63e48d533287eda5Douglas Gregor } 1517ec312a1f0557b1d27f3eb6cf49acbf7e72696422Daniel Dunbar 15185f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner _mesa_enable_sw_extensions(mesaCtx); 151914f79002e58556798e86168c63e48d533287eda5Douglas Gregor _mesa_enable_1_3_extensions(mesaCtx); 15208538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl _mesa_enable_1_4_extensions(mesaCtx); 1521c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor _mesa_enable_1_5_extensions(mesaCtx); 15225f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner _mesa_enable_2_0_extensions(mesaCtx); 1523ec312a1f0557b1d27f3eb6cf49acbf7e72696422Daniel Dunbar _mesa_enable_2_1_extensions(mesaCtx); 15247f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor#if ENABLE_EXT_texure_compression_s3tc 1525f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor if (mesaCtx->Mesa_DXTn) { 1526f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor _mesa_enable_extension(mesaCtx, "GL_EXT_texture_compression_s3tc"); 1527f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor _mesa_enable_extension(mesaCtx, "GL_S3_s3tc"); 152814f79002e58556798e86168c63e48d533287eda5Douglas Gregor } 152914f79002e58556798e86168c63e48d533287eda5Douglas Gregor _mesa_enable_extension(mesaCtx, "GL_3DFX_texture_compression_FXT1"); 1530f70d12dbd49fcc25f1dfc0127217112ae76bcb8fChandler Carruth#endif 15311728762d5a8cfaf8d64385f47b311e84de1ae7a2Chandler Carruth#if ENABLE_EXT_timer_query 153278df836808aee22c3157e1bc23bc4ec569b80568Chandler Carruth _mesa_enable_extension(mesaCtx, "GL_EXT_timer_query"); 153378df836808aee22c3157e1bc23bc4ec569b80568Chandler Carruth#endif 1534d21683cdc0ff4217bfd98a9d8d0c1083b642caacArgyrios Kyrtzidis 1535d21683cdc0ff4217bfd98a9d8d0c1083b642caacArgyrios Kyrtzidis#ifdef XFree86Server 153614f79002e58556798e86168c63e48d533287eda5Douglas Gregor /* If we're running in the X server, do bounds checking to prevent 1537f60e9918690fcf02974bc1ebecd42c99d561855eDouglas Gregor * segfaults and server crashes! 1538f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor */ 1539bdfe48ac80573e026595af91e541474dbf02565fDouglas Gregor mesaCtx->Const.CheckArrayBounds = GL_TRUE; 1540f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor#endif 1541f60e9918690fcf02974bc1ebecd42c99d561855eDouglas Gregor 1542f70d12dbd49fcc25f1dfc0127217112ae76bcb8fChandler Carruth /* finish up xmesa context initializations */ 154314f79002e58556798e86168c63e48d533287eda5Douglas Gregor c->swapbytes = CHECK_BYTE_ORDER(v) ? GL_FALSE : GL_TRUE; 154414f79002e58556798e86168c63e48d533287eda5Douglas Gregor c->xm_visual = v; 154514f79002e58556798e86168c63e48d533287eda5Douglas Gregor c->xm_buffer = NULL; /* set later by XMesaMakeCurrent */ 15467f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor c->display = v->display; 1547bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregor c->pixelformat = v->dithered_pf; /* Dithering is enabled by default */ 15487f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor 15497f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor /* Initialize the software rasterizer and helper modules. 15502eafc1b56347f772729e082e6bac824b0ef1b585Douglas Gregor */ 15513397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl if (!_swrast_CreateContext( mesaCtx ) || 15527f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor !_vbo_CreateContext( mesaCtx ) || 15537f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor !_tnl_CreateContext( mesaCtx ) || 15547f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor !_swsetup_CreateContext( mesaCtx )) { 15558538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl _mesa_free_context_data(&c->mesa); 15567f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor free(c); 1557f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor return NULL; 15587f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor } 15597f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor 15601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /* tnl setup */ 15617f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor tnl = TNL_CONTEXT(mesaCtx); 15628538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl tnl->Driver.RunPipeline = _tnl_run_pipeline; 15637f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor /* swrast setup */ 1564f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor xmesa_register_swrast_functions( mesaCtx ); 15656e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer _swsetup_Wakeup(mesaCtx); 15667f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor 15674cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis _mesa_meta_init(mesaCtx); 15684cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis 15694cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis return c; 15704cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis} 15714cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis 15724cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis 15734cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis 15744cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios KyrtzidisPUBLIC 15754cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidisvoid XMesaDestroyContext( XMesaContext c ) 15764cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis{ 15774cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis GLcontext *mesaCtx = &c->mesa; 15784cdb0e2a2e9d93805e5ceaf8bc7018bdd166aec1Argyrios Kyrtzidis 15793397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl#ifdef FX 15807f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor FXdestroyContext( XMESA_BUFFER(mesaCtx->DrawBuffer) ); 15818538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl#endif 1582f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor 1583f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor _mesa_meta_free( mesaCtx ); 1584f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor 1585f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor _swsetup_DestroyContext( mesaCtx ); 1586f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor _swrast_DestroyContext( mesaCtx ); 1587f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor _tnl_DestroyContext( mesaCtx ); 1588f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor _vbo_DestroyContext( mesaCtx ); 1589f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor _mesa_free_context_data( mesaCtx ); 1590f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor free( c ); 1591f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor} 1592f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor 1593f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor 1594f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor 1595f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor/** 1596f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor * Private function for creating an XMesaBuffer which corresponds to an 1597f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor * X window or pixmap. 1598f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor * \param v the window's XMesaVisual 1599f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor * \param w the window we're wrapping 1600f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor * \return new XMesaBuffer or NULL if error 1601f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor */ 1602f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas GregorPUBLIC XMesaBuffer 1603f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas GregorXMesaCreateWindowBuffer(XMesaVisual v, XMesaWindow w) 1604f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor{ 1605f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor#ifndef XFree86Server 1606f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor XWindowAttributes attr; 1607f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor#endif 1608f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor XMesaBuffer b; 1609f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor XMesaColormap cmap; 1610f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor int depth; 1611f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor 1612f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor assert(v); 1613f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor assert(w); 1614f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor 1615f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor /* Check that window depth matches visual depth */ 1616f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor#ifdef XFree86Server 1617f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor depth = ((XMesaDrawable)w)->depth; 1618f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor#else 1619f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor XGetWindowAttributes( v->display, w, &attr ); 1620f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor depth = attr.depth; 1621f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor#endif 1622f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor if (GET_VISUAL_DEPTH(v) != depth) { 1623f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor _mesa_warning(NULL, "XMesaCreateWindowBuffer: depth mismatch between visual (%d) and window (%d)!\n", 1624f62d43d2afe1960755a1b5813cae1e5983bcac1bDouglas Gregor GET_VISUAL_DEPTH(v), depth); 162514f79002e58556798e86168c63e48d533287eda5Douglas Gregor return NULL; 162614f79002e58556798e86168c63e48d533287eda5Douglas Gregor } 16274fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor 16284fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor /* Find colormap */ 16294fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor#ifdef XFree86Server 16304fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor cmap = (ColormapPtr)LookupIDByType(wColormap(w), RT_COLORMAP); 16319c7361006b8cd95333958150dd0c803261807b68Douglas Gregor#else 16329c7361006b8cd95333958150dd0c803261807b68Douglas Gregor if (attr.colormap) { 16339c7361006b8cd95333958150dd0c803261807b68Douglas Gregor cmap = attr.colormap; 16349c7361006b8cd95333958150dd0c803261807b68Douglas Gregor } 16359c7361006b8cd95333958150dd0c803261807b68Douglas Gregor else { 16369c7361006b8cd95333958150dd0c803261807b68Douglas Gregor _mesa_warning(NULL, "Window %u has no colormap!\n", (unsigned int) w); 16379c7361006b8cd95333958150dd0c803261807b68Douglas Gregor /* this is weird, a window w/out a colormap!? */ 16389c7361006b8cd95333958150dd0c803261807b68Douglas Gregor /* OK, let's just allocate a new one and hope for the best */ 16390b1fb988012da21d996c43e36867787a7a07b889Chris Lattner cmap = XCreateColormap(v->display, w, attr.visual, AllocNone); 16400b1fb988012da21d996c43e36867787a7a07b889Chris Lattner } 16410b1fb988012da21d996c43e36867787a7a07b889Chris Lattner#endif 16427143aab97c6e849a5a5005b7853b8c7d5af008edDouglas Gregor 1643e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis b = create_xmesa_buffer((XMesaDrawable) w, WINDOW, v, cmap); 1644e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis if (!b) 1645e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis return NULL; 1646e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis 16477c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner if (!initialize_visual_and_buffer( v, b, (XMesaDrawable) w, cmap )) { 16487c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner xmesa_free_buffer(b); 1649c1f9d828c733ec1eba06d01070735d1f36fda733Chris Lattner return NULL; 1650c1f9d828c733ec1eba06d01070735d1f36fda733Chris Lattner } 1651c1f9d828c733ec1eba06d01070735d1f36fda733Chris Lattner 16528538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl return b; 1653c1f9d828c733ec1eba06d01070735d1f36fda733Chris Lattner} 16542eafc1b56347f772729e082e6bac824b0ef1b585Douglas Gregor 16552eafc1b56347f772729e082e6bac824b0ef1b585Douglas Gregor 16562eafc1b56347f772729e082e6bac824b0ef1b585Douglas Gregor 1657ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor/** 16581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump * Create a new XMesaBuffer from an X pixmap. 16593397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl * 16602eafc1b56347f772729e082e6bac824b0ef1b585Douglas Gregor * \param v the XMesaVisual 16612eafc1b56347f772729e082e6bac824b0ef1b585Douglas Gregor * \param p the pixmap 16622eafc1b56347f772729e082e6bac824b0ef1b585Douglas Gregor * \param cmap the colormap, may be 0 if using a \c GLX_TRUE_COLOR or 16631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump * \c GLX_DIRECT_COLOR visual for the pixmap 1664ecdcb883cbc6bb4a2445dc6f02d58d9bdb54a0edDouglas Gregor * \returns new XMesaBuffer or NULL if error 16657c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner */ 16667c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris LattnerPUBLIC XMesaBuffer 166720249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. SpencerXMesaCreatePixmapBuffer(XMesaVisual v, XMesaPixmap p, XMesaColormap cmap) 16689c7361006b8cd95333958150dd0c803261807b68Douglas Gregor{ 16695f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner XMesaBuffer b; 16709c7361006b8cd95333958150dd0c803261807b68Douglas Gregor 16719c7361006b8cd95333958150dd0c803261807b68Douglas Gregor assert(v); 1672040a804f852c45c8b8c371ce1d421fd4cd84b6fbDouglas Gregor 1673040a804f852c45c8b8c371ce1d421fd4cd84b6fbDouglas Gregor b = create_xmesa_buffer((XMesaDrawable) p, PIXMAP, v, cmap); 16747c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner if (!b) 16751d4c1137c314cfb9ced32006cacdb80deffb66d4Douglas Gregor return NULL; 1676aa93a875605536d72a10359a0098396192b7d4ecDouglas Gregor 16771d4c1137c314cfb9ced32006cacdb80deffb66d4Douglas Gregor if (!initialize_visual_and_buffer(v, b, (XMesaDrawable) p, cmap)) { 16787143aab97c6e849a5a5005b7853b8c7d5af008edDouglas Gregor xmesa_free_buffer(b); 16797143aab97c6e849a5a5005b7853b8c7d5af008edDouglas Gregor return NULL; 16809c7361006b8cd95333958150dd0c803261807b68Douglas Gregor } 16819c7361006b8cd95333958150dd0c803261807b68Douglas Gregor 16829c7361006b8cd95333958150dd0c803261807b68Douglas Gregor return b; 16839c7361006b8cd95333958150dd0c803261807b68Douglas Gregor} 16849c7361006b8cd95333958150dd0c803261807b68Douglas Gregor 16859c7361006b8cd95333958150dd0c803261807b68Douglas Gregor 16869c7361006b8cd95333958150dd0c803261807b68Douglas Gregor/** 1687040a804f852c45c8b8c371ce1d421fd4cd84b6fbDouglas Gregor * For GLX_EXT_texture_from_pixmap 1688040a804f852c45c8b8c371ce1d421fd4cd84b6fbDouglas Gregor */ 1689040a804f852c45c8b8c371ce1d421fd4cd84b6fbDouglas GregorXMesaBuffer 1690040a804f852c45c8b8c371ce1d421fd4cd84b6fbDouglas GregorXMesaCreatePixmapTextureBuffer(XMesaVisual v, XMesaPixmap p, 1691040a804f852c45c8b8c371ce1d421fd4cd84b6fbDouglas Gregor XMesaColormap cmap, 1692040a804f852c45c8b8c371ce1d421fd4cd84b6fbDouglas Gregor int format, int target, int mipmap) 1693040a804f852c45c8b8c371ce1d421fd4cd84b6fbDouglas Gregor{ 1694040a804f852c45c8b8c371ce1d421fd4cd84b6fbDouglas Gregor GET_CURRENT_CONTEXT(ctx); 1695040a804f852c45c8b8c371ce1d421fd4cd84b6fbDouglas Gregor XMesaBuffer b; 16969c7361006b8cd95333958150dd0c803261807b68Douglas Gregor GLuint width, height; 16979c7361006b8cd95333958150dd0c803261807b68Douglas Gregor 16989c7361006b8cd95333958150dd0c803261807b68Douglas Gregor assert(v); 1699040a804f852c45c8b8c371ce1d421fd4cd84b6fbDouglas Gregor 1700040a804f852c45c8b8c371ce1d421fd4cd84b6fbDouglas Gregor b = create_xmesa_buffer((XMesaDrawable) p, PIXMAP, v, cmap); 1701040a804f852c45c8b8c371ce1d421fd4cd84b6fbDouglas Gregor if (!b) 17023397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl return NULL; 17037c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner 17043397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl /* get pixmap size, update framebuffer/renderbuffer dims */ 1705ee9b0ba29094eb177a285e726ab96e979e5b9c61Douglas Gregor xmesa_get_window_size(v->display, b, &width, &height); 1706ee9b0ba29094eb177a285e726ab96e979e5b9c61Douglas Gregor _mesa_resize_framebuffer(NULL, &(b->mesa_buffer), width, height); 1707ee9b0ba29094eb177a285e726ab96e979e5b9c61Douglas Gregor 1708ee9b0ba29094eb177a285e726ab96e979e5b9c61Douglas Gregor if (target == 0) { 1709ee9b0ba29094eb177a285e726ab96e979e5b9c61Douglas Gregor /* examine dims */ 171020249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer if (ctx->Extensions.ARB_texture_non_power_of_two) { 1711eee242ff426bf79149f221798966e58688383c1eDouglas Gregor target = GLX_TEXTURE_2D_EXT; 1712eee242ff426bf79149f221798966e58688383c1eDouglas Gregor } 1713eee242ff426bf79149f221798966e58688383c1eDouglas Gregor else if ( _mesa_bitcount(width) == 1 17147c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner && _mesa_bitcount(height) == 1) { 17157c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner /* power of two size */ 17169c7361006b8cd95333958150dd0c803261807b68Douglas Gregor if (height == 1) { 17179c7361006b8cd95333958150dd0c803261807b68Douglas Gregor target = GLX_TEXTURE_1D_EXT; 17187c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner } 17197c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner else { 1720aa93a875605536d72a10359a0098396192b7d4ecDouglas Gregor target = GLX_TEXTURE_2D_EXT; 1721aa93a875605536d72a10359a0098396192b7d4ecDouglas Gregor } 17227c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner } 17237c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner else if (ctx->Extensions.NV_texture_rectangle) { 17248538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl target = GLX_TEXTURE_RECTANGLE_EXT; 17257c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner } 17268538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl else { 17271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /* non power of two textures not supported */ 17287c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner XMesaDestroyBuffer(b); 17297c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner return 0; 17307c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner } 17317c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner } 17327c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner 17337356a31327be9b3c3434a0c88746028980da5684Chris Lattner b->TextureTarget = target; 17347c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner b->TextureFormat = format; 173520249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer b->TextureMipmap = mipmap; 17366a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor 17376a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor if (!initialize_visual_and_buffer(v, b, (XMesaDrawable) p, cmap)) { 17386a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor xmesa_free_buffer(b); 1739e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis return NULL; 174020249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer } 1741c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor 17427c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner return b; 1743f04ad69fed38d26fc0d6f7d6fd0a4631ddfbc7feChris Lattner} 1744df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner 1745df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner 1746df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner 1747df961c28f84666051ad59d2da1f44023f6366d02Chris LattnerXMesaBuffer 1748df961c28f84666051ad59d2da1f44023f6366d02Chris LattnerXMesaCreatePBuffer(XMesaVisual v, XMesaColormap cmap, 1749df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner unsigned int width, unsigned int height) 17501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump{ 1751df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner#ifndef XFree86Server 1752df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner XMesaWindow root; 1753df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner XMesaDrawable drawable; /* X Pixmap Drawable */ 1754df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner XMesaBuffer b; 1755df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner 17567356a31327be9b3c3434a0c88746028980da5684Chris Lattner /* allocate pixmap for front buffer */ 1757df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner root = RootWindow( v->display, v->visinfo->screen ); 1758df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner drawable = XCreatePixmap(v->display, root, width, height, 1759df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner v->visinfo->depth); 1760df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner if (!drawable) 17611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return NULL; 17628538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl 1763df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner b = create_xmesa_buffer(drawable, PBUFFER, v, cmap); 1764df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner if (!b) 176537e2684abfe38207fdb90620da062bb18c23f29aDouglas Gregor return NULL; 17667c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner 17674800a5c79023271408af49797e09be32aca93232Douglas Gregor if (!initialize_visual_and_buffer(v, b, drawable, cmap)) { 17684800a5c79023271408af49797e09be32aca93232Douglas Gregor xmesa_free_buffer(b); 17694800a5c79023271408af49797e09be32aca93232Douglas Gregor return NULL; 17704800a5c79023271408af49797e09be32aca93232Douglas Gregor } 1771b6441ef9b7285bd1aa77b05b10f473f7a3f413e7Argyrios Kyrtzidis 17724800a5c79023271408af49797e09be32aca93232Douglas Gregor return b; 1773e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis#else 17742dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis return 0; 1775e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis#endif 17764800a5c79023271408af49797e09be32aca93232Douglas Gregor} 17774800a5c79023271408af49797e09be32aca93232Douglas Gregor 177820249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer 17796a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor 17806a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor/* 17814800a5c79023271408af49797e09be32aca93232Douglas Gregor * Deallocate an XMesaBuffer structure and all related info. 17824800a5c79023271408af49797e09be32aca93232Douglas Gregor */ 17834800a5c79023271408af49797e09be32aca93232Douglas GregorPUBLIC void 17844800a5c79023271408af49797e09be32aca93232Douglas GregorXMesaDestroyBuffer(XMesaBuffer b) 17854800a5c79023271408af49797e09be32aca93232Douglas Gregor{ 17864800a5c79023271408af49797e09be32aca93232Douglas Gregor xmesa_free_buffer(b); 17874800a5c79023271408af49797e09be32aca93232Douglas Gregor} 17884800a5c79023271408af49797e09be32aca93232Douglas Gregor 17894800a5c79023271408af49797e09be32aca93232Douglas Gregor 17904800a5c79023271408af49797e09be32aca93232Douglas Gregor/** 17914800a5c79023271408af49797e09be32aca93232Douglas Gregor * Query the current window size and update the corresponding GLframebuffer 17924800a5c79023271408af49797e09be32aca93232Douglas Gregor * and all attached renderbuffers. 17934800a5c79023271408af49797e09be32aca93232Douglas Gregor * Called when: 17944800a5c79023271408af49797e09be32aca93232Douglas Gregor * 1. the first time a buffer is bound to a context. 1795272b6bc6a6c8fc04f951ad850df68c44d137f513Douglas Gregor * 2. from glViewport to poll for window size changes 1796272b6bc6a6c8fc04f951ad850df68c44d137f513Douglas Gregor * 3. from the XMesaResizeBuffers() API function. 1797272b6bc6a6c8fc04f951ad850df68c44d137f513Douglas Gregor * Note: it's possible (and legal) for xmctx to be NULL. That can happen 1798272b6bc6a6c8fc04f951ad850df68c44d137f513Douglas Gregor * when resizing a buffer when no rendering context is bound. 17994800a5c79023271408af49797e09be32aca93232Douglas Gregor */ 1800b6441ef9b7285bd1aa77b05b10f473f7a3f413e7Argyrios Kyrtzidisvoid 1801b6441ef9b7285bd1aa77b05b10f473f7a3f413e7Argyrios Kyrtzidisxmesa_check_and_update_buffer_size(XMesaContext xmctx, XMesaBuffer drawBuffer) 18027338a922dd1164002922163200b18a2c24eb0209Douglas Gregor{ 18037338a922dd1164002922163200b18a2c24eb0209Douglas Gregor GLuint width, height; 18044800a5c79023271408af49797e09be32aca93232Douglas Gregor xmesa_get_window_size(drawBuffer->display, drawBuffer, &width, &height); 180520249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer if (drawBuffer->mesa_buffer.Width != width || 18062dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis drawBuffer->mesa_buffer.Height != height) { 18072dbaca748bc3eb6539f417bd8354c930bdf88fa4Argyrios Kyrtzidis GLcontext *ctx = xmctx ? &xmctx->mesa : NULL; 1808e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis _mesa_resize_framebuffer(ctx, &(drawBuffer->mesa_buffer), width, height); 18094800a5c79023271408af49797e09be32aca93232Douglas Gregor } 1810e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis drawBuffer->mesa_buffer.Initialized = GL_TRUE; /* XXX TEMPORARY? */ 1811e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis} 18124800a5c79023271408af49797e09be32aca93232Douglas Gregor 18134800a5c79023271408af49797e09be32aca93232Douglas Gregor 18144800a5c79023271408af49797e09be32aca93232Douglas Gregor/* 18154800a5c79023271408af49797e09be32aca93232Douglas Gregor * Bind buffer b to context c and make c the current rendering context. 18164800a5c79023271408af49797e09be32aca93232Douglas Gregor */ 18174800a5c79023271408af49797e09be32aca93232Douglas GregorGLboolean XMesaMakeCurrent( XMesaContext c, XMesaBuffer b ) 18189e5bb85ac899eeab7c21b5ff9030c3da6ff4837bChandler Carruth{ 18198f7c540ac42370c40ebcdc4b69018c938faf94ecArgyrios Kyrtzidis return XMesaMakeCurrent2( c, b, b ); 18208f7c540ac42370c40ebcdc4b69018c938faf94ecArgyrios Kyrtzidis} 18218f7c540ac42370c40ebcdc4b69018c938faf94ecArgyrios Kyrtzidis 18228f7c540ac42370c40ebcdc4b69018c938faf94ecArgyrios Kyrtzidis 1823e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis/* 1824f70d12dbd49fcc25f1dfc0127217112ae76bcb8fChandler Carruth * Bind buffer b to context c and make c the current rendering context. 18254800a5c79023271408af49797e09be32aca93232Douglas Gregor */ 18266a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas GregorPUBLIC 182720249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. SpencerGLboolean XMesaMakeCurrent2( XMesaContext c, XMesaBuffer drawBuffer, 18284800a5c79023271408af49797e09be32aca93232Douglas Gregor XMesaBuffer readBuffer ) 18294800a5c79023271408af49797e09be32aca93232Douglas Gregor{ 18304800a5c79023271408af49797e09be32aca93232Douglas Gregor if (c) { 18314800a5c79023271408af49797e09be32aca93232Douglas Gregor if (!drawBuffer || !readBuffer) 18324800a5c79023271408af49797e09be32aca93232Douglas Gregor return GL_FALSE; /* must specify buffers! */ 1833f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith 18344800a5c79023271408af49797e09be32aca93232Douglas Gregor if (&(c->mesa) == _mesa_get_current_context() 183529f98b40caabca1ec820d546c5c08206a1d4f520Argyrios Kyrtzidis && c->mesa.DrawBuffer == &drawBuffer->mesa_buffer 183629f98b40caabca1ec820d546c5c08206a1d4f520Argyrios Kyrtzidis && c->mesa.ReadBuffer == &readBuffer->mesa_buffer 183729f98b40caabca1ec820d546c5c08206a1d4f520Argyrios Kyrtzidis && XMESA_BUFFER(c->mesa.DrawBuffer)->wasCurrent) { 183829f98b40caabca1ec820d546c5c08206a1d4f520Argyrios Kyrtzidis /* same context and buffer, do nothing */ 18394800a5c79023271408af49797e09be32aca93232Douglas Gregor return GL_TRUE; 18404800a5c79023271408af49797e09be32aca93232Douglas Gregor } 18414800a5c79023271408af49797e09be32aca93232Douglas Gregor 18424800a5c79023271408af49797e09be32aca93232Douglas Gregor c->xm_buffer = drawBuffer; 18434800a5c79023271408af49797e09be32aca93232Douglas Gregor 18444800a5c79023271408af49797e09be32aca93232Douglas Gregor#ifdef FX 1845c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor if (FXmakeCurrent( drawBuffer )) 184620249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer return GL_TRUE; 18476a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor#endif 18486a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor 1849e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis /* Call this periodically to detect when the user has begun using 1850e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis * GL rendering from multiple threads. 18516a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor */ 18526a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor _glapi_check_multithread(); 18536a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor 1854e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis xmesa_check_and_update_buffer_size(c, drawBuffer); 1855272b6bc6a6c8fc04f951ad850df68c44d137f513Douglas Gregor if (readBuffer != drawBuffer) 18566a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor xmesa_check_and_update_buffer_size(c, readBuffer); 1857e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis 185820249a1af2e462dcafdd6a350f1c7967b264ff25Michael J. Spencer _mesa_make_current(&(c->mesa), 18596a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor &drawBuffer->mesa_buffer, 1860e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis &readBuffer->mesa_buffer); 1861272b6bc6a6c8fc04f951ad850df68c44d137f513Douglas Gregor 1862e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis /* 1863e24692b30adbe8144597678a0e3354912e99c747Argyrios Kyrtzidis * Must recompute and set these pixel values because colormap 18646a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor * can be different for different windows. 18650b1fb988012da21d996c43e36867787a7a07b889Chris Lattner */ 18660b1fb988012da21d996c43e36867787a7a07b889Chris Lattner c->clearpixel = xmesa_color_to_pixel( &c->mesa, 1867e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor c->clearcolor[0], 1868e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor c->clearcolor[1], 1869e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor c->clearcolor[2], 1870e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor c->clearcolor[3], 1871e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor c->xm_visual->undithered_pf); 1872e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor XMesaSetForeground(c->display, drawBuffer->cleargc, c->clearpixel); 1873e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor 1874e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor /* Solution to Stephane Rehel's problem with glXReleaseBuffersMESA(): */ 187526ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor drawBuffer->wasCurrent = GL_TRUE; 187626ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor } 187726ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor else { 187826ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor /* Detach */ 1879b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor _mesa_make_current( NULL, NULL, NULL ); 1880b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor } 188126ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor return GL_TRUE; 1882b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor} 188326ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor 188426ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor 188526ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor/* 188626ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor * Unbind the context c from its buffer. 18871a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregor */ 18884bc8738d837e5d401235f99e55277338e20e3651Douglas GregorGLboolean XMesaUnbindContext( XMesaContext c ) 188955988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor{ 189055988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor /* A no-op for XFree86 integration purposes */ 189155988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor return GL_TRUE; 189255988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor} 189355988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor 189455988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor 189555988680ece66b8e505ee136b35e74fcb1173aeeDouglas GregorXMesaContext XMesaGetCurrentContext( void ) 189655988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor{ 189755988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor GET_CURRENT_CONTEXT(ctx); 189855988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor if (ctx) { 189955988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor XMesaContext xmesa = XMESA_CONTEXT(ctx); 190055988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor return xmesa; 190155988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor } 190255988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor else { 1903392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor return 0; 1904392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor } 1905392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor} 1906392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor 1907392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor 1908392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas GregorXMesaBuffer XMesaGetCurrentBuffer( void ) 1909392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor{ 1910e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor GET_CURRENT_CONTEXT(ctx); 1911392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor if (ctx) { 1912392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor XMesaBuffer xmbuf = XMESA_BUFFER(ctx->DrawBuffer); 1913392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor return xmbuf; 1914a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor } 1915a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor else { 19161e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor return 0; 19171e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor } 1918392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor} 1919392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor 1920392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor 1921392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor/* New in Mesa 3.1 */ 192277d029f6a24dbf70d97e61757945df53fb250ea0Douglas GregorXMesaBuffer XMesaGetCurrentReadBuffer( void ) 1923392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor{ 1924392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor GET_CURRENT_CONTEXT(ctx); 1925392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor if (ctx) { 1926392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor return XMESA_BUFFER(ctx->ReadBuffer); 1927392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor } 1928392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor else { 1929392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor return 0; 193077d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor } 193177d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor} 193277d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor 193377d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor 193477d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor#ifdef XFree86Server 193577d029f6a24dbf70d97e61757945df53fb250ea0Douglas GregorPUBLIC 193651f564f80d9f71e175635b452ffeeeff899e9bf1Douglas GregorGLboolean XMesaForceCurrent(XMesaContext c) 193751f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor{ 193851f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor if (c) { 193951f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor _glapi_set_dispatch(c->mesa.CurrentDispatch); 194051f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 194126ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor if (&(c->mesa) != _mesa_get_current_context()) { 194226ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor _mesa_make_current(&c->mesa, c->mesa.DrawBuffer, c->mesa.ReadBuffer); 194326ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor } 194426ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor } 194526ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor else { 194626ced127b7d443fcf3472463c9f39c2376bd9d70Douglas Gregor _mesa_make_current(NULL, NULL, NULL); 1947392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor } 19481a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregor return GL_TRUE; 1949392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor} 1950392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor 19511a4761edca58c6b559de825b9abfb66f7f1ba94aDouglas Gregor 1952392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas GregorPUBLIC 1953e209e5026892cb07294f733c72bd51359c0f0e72Douglas GregorGLboolean XMesaLoseCurrent(XMesaContext c) 1954392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor{ 1955392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor (void) c; 1956392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor _mesa_make_current(NULL, NULL, NULL); 1957392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor return GL_TRUE; 1958e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor} 1959392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor 1960392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor 1961392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas GregorPUBLIC 1962392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas GregorGLboolean XMesaCopyContext( XMesaContext xm_src, XMesaContext xm_dst, GLuint mask ) 1963392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor{ 1964392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor _mesa_copy_context(&xm_src->mesa, &xm_dst->mesa, mask); 1965392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor return GL_TRUE; 1966392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor} 1967a1f1fad8b60e1cb9d21a40a37f2e03150bcbeb6fDouglas Gregor#endif /* XFree86Server */ 19681e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor 19691e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor 19701e12368db12005ddd92fd9188c86383fe30ef443Douglas Gregor#ifndef FX 1971392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas GregorGLboolean XMesaSetFXmode( GLint mode ) 1972392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor{ 197351f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor (void) mode; 197451f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor return GL_FALSE; 197551f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor} 197651f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor#endif 197751f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 197851f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 197951f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor 198051f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor/* 198151f564f80d9f71e175635b452ffeeeff899e9bf1Douglas Gregor * Copy the back buffer to the front buffer. If there's no back buffer 1982392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor * this is a no-op. 198310694cee2588442bee1e717f5042c58ffee25279Douglas Gregor */ 1984392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas GregorPUBLIC 198577d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregorvoid XMesaSwapBuffers( XMesaBuffer b ) 1986392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor{ 198710694cee2588442bee1e717f5042c58ffee25279Douglas Gregor GET_CURRENT_CONTEXT(ctx); 198877d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor 198977d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor if (!b->backxrb) { 199077d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor /* single buffered */ 199177d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor return; 199277d029f6a24dbf70d97e61757945df53fb250ea0Douglas Gregor } 1993392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor 1994392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor /* If we're swapping the buffer associated with the current context 1995392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor * we have to flush any pending rendering commands first. 1996392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor */ 1997392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor if (ctx && ctx->DrawBuffer == &(b->mesa_buffer)) 1998392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor _mesa_notifySwapBuffers(ctx); 1999392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor 2000392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor if (b->db_mode) { 2001392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor#ifdef FX 200255988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor if (FXswapBuffers(b)) 200355988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor return; 200455988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor#endif 200555988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor if (b->backxrb->ximage) { 200655988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor /* Copy Ximage (back buf) from client memory to server window */ 2007bab9f4afaeb99319ac3567239d41cc1be3fb7e8cDouglas Gregor#if defined(USE_XSHM) && !defined(XFree86Server) 200855988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor if (b->shm) { 200955988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor /*_glthread_LOCK_MUTEX(_xmesa_lock);*/ 201055988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor XShmPutImage( b->xm_visual->display, b->frontxrb->drawable, 201155988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor b->swapgc, 201255988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor b->backxrb->ximage, 0, 0, 201355988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor 0, 0, b->mesa_buffer.Width, b->mesa_buffer.Height, 2014af13bfc3b40aa4a46f4e71d200ecfb10f45297fcDouglas Gregor False ); 2015af13bfc3b40aa4a46f4e71d200ecfb10f45297fcDouglas Gregor /*_glthread_UNLOCK_MUTEX(_xmesa_lock);*/ 2016af13bfc3b40aa4a46f4e71d200ecfb10f45297fcDouglas Gregor } 2017af13bfc3b40aa4a46f4e71d200ecfb10f45297fcDouglas Gregor else 2018bab9f4afaeb99319ac3567239d41cc1be3fb7e8cDouglas Gregor#endif 2019bab9f4afaeb99319ac3567239d41cc1be3fb7e8cDouglas Gregor { 2020bab9f4afaeb99319ac3567239d41cc1be3fb7e8cDouglas Gregor /*_glthread_LOCK_MUTEX(_xmesa_lock);*/ 2021bab9f4afaeb99319ac3567239d41cc1be3fb7e8cDouglas Gregor XMesaPutImage( b->xm_visual->display, b->frontxrb->drawable, 2022bab9f4afaeb99319ac3567239d41cc1be3fb7e8cDouglas Gregor b->swapgc, 2023bab9f4afaeb99319ac3567239d41cc1be3fb7e8cDouglas Gregor b->backxrb->ximage, 0, 0, 2024bab9f4afaeb99319ac3567239d41cc1be3fb7e8cDouglas Gregor 0, 0, b->mesa_buffer.Width, b->mesa_buffer.Height ); 2025bab9f4afaeb99319ac3567239d41cc1be3fb7e8cDouglas Gregor /*_glthread_UNLOCK_MUTEX(_xmesa_lock);*/ 2026af13bfc3b40aa4a46f4e71d200ecfb10f45297fcDouglas Gregor } 2027af13bfc3b40aa4a46f4e71d200ecfb10f45297fcDouglas Gregor } 2028af13bfc3b40aa4a46f4e71d200ecfb10f45297fcDouglas Gregor else if (b->backxrb->pixmap) { 2029af13bfc3b40aa4a46f4e71d200ecfb10f45297fcDouglas Gregor /* Copy pixmap (back buf) to window (front buf) on server */ 2030af13bfc3b40aa4a46f4e71d200ecfb10f45297fcDouglas Gregor /*_glthread_LOCK_MUTEX(_xmesa_lock);*/ 2031392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor XMesaCopyArea( b->xm_visual->display, 2032b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor b->backxrb->pixmap, /* source drawable */ 2033b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor b->frontxrb->drawable, /* dest. drawable */ 2034392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor b->swapgc, 2035b7a7819473709c01ea024a2dc15e99d38f0f8760Douglas Gregor 0, 0, b->mesa_buffer.Width, b->mesa_buffer.Height, 2036392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor 0, 0 /* dest region */ 2037392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor ); 2038392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor /*_glthread_UNLOCK_MUTEX(_xmesa_lock);*/ 2039e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor } 2040e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor 2041e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor if (b->swAlpha) 2042392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor _mesa_copy_soft_alpha_renderbuffers(ctx, &b->mesa_buffer); 2043392ed2b717d86ebdd202cb9bb58d18d8b3b4cd87Douglas Gregor } 2044185dbd7782a45d0f830218bfbc196c6b664ed8d9Douglas Gregor#if !defined(XFree86Server) 2045185dbd7782a45d0f830218bfbc196c6b664ed8d9Douglas Gregor XSync( b->xm_visual->display, False ); 2046e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor#endif 2047185dbd7782a45d0f830218bfbc196c6b664ed8d9Douglas Gregor} 204855988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor 204955988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor 2050185dbd7782a45d0f830218bfbc196c6b664ed8d9Douglas Gregor 205155988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor/* 205255988680ece66b8e505ee136b35e74fcb1173aeeDouglas Gregor * Copy sub-region of back buffer to front buffer 2053185dbd7782a45d0f830218bfbc196c6b664ed8d9Douglas Gregor */ 2054185dbd7782a45d0f830218bfbc196c6b664ed8d9Douglas Gregorvoid XMesaCopySubBuffer( XMesaBuffer b, int x, int y, int width, int height ) 2055185dbd7782a45d0f830218bfbc196c6b664ed8d9Douglas Gregor{ 2056e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor GET_CURRENT_CONTEXT(ctx); 2057e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor 2058185dbd7782a45d0f830218bfbc196c6b664ed8d9Douglas Gregor /* If we're swapping the buffer associated with the current context 2059185dbd7782a45d0f830218bfbc196c6b664ed8d9Douglas Gregor * we have to flush any pending rendering commands first. 2060e209e5026892cb07294f733c72bd51359c0f0e72Douglas Gregor */ 2061185dbd7782a45d0f830218bfbc196c6b664ed8d9Douglas Gregor if (ctx && ctx->DrawBuffer == &(b->mesa_buffer)) 2062185dbd7782a45d0f830218bfbc196c6b664ed8d9Douglas Gregor _mesa_notifySwapBuffers(ctx); 2063d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie 2064f41d3be39980d40849850d3fb90403623cc8459eArgyrios Kyrtzidis if (!b->backxrb) { 2065d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie /* single buffered */ 20663efd52cf8f4e57c5571bd8cc3168264c3bc46a1eArgyrios Kyrtzidis return; 20673efd52cf8f4e57c5571bd8cc3168264c3bc46a1eArgyrios Kyrtzidis } 2068d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie 20693efd52cf8f4e57c5571bd8cc3168264c3bc46a1eArgyrios Kyrtzidis if (b->db_mode) { 20703efd52cf8f4e57c5571bd8cc3168264c3bc46a1eArgyrios Kyrtzidis int yTop = b->mesa_buffer.Height - y - height; 20713efd52cf8f4e57c5571bd8cc3168264c3bc46a1eArgyrios Kyrtzidis#ifdef FX 20723efd52cf8f4e57c5571bd8cc3168264c3bc46a1eArgyrios Kyrtzidis if (FXswapBuffers(b)) 2073ba494c64365d78b1cdb6baea4d1e79263389fda9Daniel Dunbar return; 20743efd52cf8f4e57c5571bd8cc3168264c3bc46a1eArgyrios Kyrtzidis#endif 2075b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar if (b->backxrb->ximage) { 2076b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar /* Copy Ximage from host's memory to server's window */ 2077b1c99c679adb53be8f478d08be83af6c9c22ae4bDaniel Dunbar#if defined(USE_XSHM) && !defined(XFree86Server) 20783efd52cf8f4e57c5571bd8cc3168264c3bc46a1eArgyrios Kyrtzidis if (b->shm) { 2079f41d3be39980d40849850d3fb90403623cc8459eArgyrios Kyrtzidis /* XXX assuming width and height aren't too large! */ 20803efd52cf8f4e57c5571bd8cc3168264c3bc46a1eArgyrios Kyrtzidis XShmPutImage( b->xm_visual->display, b->frontxrb->drawable, 20813efd52cf8f4e57c5571bd8cc3168264c3bc46a1eArgyrios Kyrtzidis b->swapgc, 2082f41d3be39980d40849850d3fb90403623cc8459eArgyrios Kyrtzidis b->backxrb->ximage, x, yTop, 2083f41d3be39980d40849850d3fb90403623cc8459eArgyrios Kyrtzidis x, yTop, width, height, False ); 208460f7684881f9f6bc779e91212aea89d9afc723ddArgyrios Kyrtzidis /* wait for finished event??? */ 20853efd52cf8f4e57c5571bd8cc3168264c3bc46a1eArgyrios Kyrtzidis } 2086f41d3be39980d40849850d3fb90403623cc8459eArgyrios Kyrtzidis else 2087f41d3be39980d40849850d3fb90403623cc8459eArgyrios Kyrtzidis#endif 2088c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson { 2089c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson /* XXX assuming width and height aren't too large! */ 2090c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson XMesaPutImage( b->xm_visual->display, b->frontxrb->drawable, 2091c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson b->swapgc, 2092c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson b->backxrb->ximage, x, yTop, 2093c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson x, yTop, width, height ); 2094c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson } 2095c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson } 2096c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson else { 2097c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson /* Copy pixmap to window on server */ 2098c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson XMesaCopyArea( b->xm_visual->display, 2099c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson b->backxrb->pixmap, /* source drawable */ 2100c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson b->frontxrb->drawable, /* dest. drawable */ 2101c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson b->swapgc, 2102c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson x, yTop, width, height, /* source region */ 2103e92b8a1dbba150e213c4980710fcb59ec5c5c570Douglas Gregor x, yTop /* dest region */ 2104c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson ); 2105c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson } 2106c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson } 2107c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson} 21086e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer 2109c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson 2110c850578dbfa68cf2d2776f59a5cb0009134d970eAnders Carlsson/* 21114fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor * Return a pointer to the XMesa backbuffer Pixmap or XImage. This function 21124fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor * is a way to get "under the hood" of X/Mesa so one can manipulate the 21134fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor * back buffer directly. 21140b1fb988012da21d996c43e36867787a7a07b889Chris Lattner * Output: pixmap - pointer to back buffer's Pixmap, or 0 21153397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl * ximage - pointer to back buffer's XImage, or NULL 2116a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl * Return: GL_TRUE = context is double buffered 211701b81c4d074bba9c18372d521405dfe32fc4f552Argyrios Kyrtzidis * GL_FALSE = context is single buffered 2118c8e5d51f51e46c6f7717761537c6609ef9daf57cArgyrios Kyrtzidis */ 2119c8e5d51f51e46c6f7717761537c6609ef9daf57cArgyrios Kyrtzidis#ifndef XFree86Server 21201eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpGLboolean XMesaGetBackBuffer( XMesaBuffer b, 212197475834207bf5abb5b58534f783c9b71d4b9df1Douglas Gregor XMesaPixmap *pixmap, 212255f48de5f6b10b50f4d88a9f7235f4532f799550Douglas Gregor XMesaImage **ximage ) 21232cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor{ 2124c8e5d51f51e46c6f7717761537c6609ef9daf57cArgyrios Kyrtzidis if (b->db_mode) { 2125681d7237e1014bf64dd5ead6bf74ae55cdd19e61Sebastian Redl if (pixmap) 2126c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor *pixmap = b->backxrb->pixmap; 2127681d7237e1014bf64dd5ead6bf74ae55cdd19e61Sebastian Redl if (ximage) 2128681d7237e1014bf64dd5ead6bf74ae55cdd19e61Sebastian Redl *ximage = b->backxrb->ximage; 2129681d7237e1014bf64dd5ead6bf74ae55cdd19e61Sebastian Redl return GL_TRUE; 21302cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor } 21312cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor else { 21322cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor *pixmap = 0; 21331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump *ximage = NULL; 21342cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor return GL_FALSE; 21353397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl } 21360953e767ff7817f97b3ab20896b229891eeff45bJohn McCall} 2137a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor#endif /* XFree86Server */ 2138a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor 2139a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor 21400953e767ff7817f97b3ab20896b229891eeff45bJohn McCall/* 21418538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl * Return the depth buffer associated with an XMesaBuffer. 21420953e767ff7817f97b3ab20896b229891eeff45bJohn McCall * Input: b - the XMesa buffer handle 21430953e767ff7817f97b3ab20896b229891eeff45bJohn McCall * Output: width, height - size of buffer in pixels 21440953e767ff7817f97b3ab20896b229891eeff45bJohn McCall * bytesPerValue - bytes per depth value (2 or 4) 21450953e767ff7817f97b3ab20896b229891eeff45bJohn McCall * buffer - pointer to depth buffer values 21462cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * Return: GL_TRUE or GL_FALSE to indicate success or failure. 2147b7166334d897e1e4e6a5b428fe2d0ec752ef187fMike Stump */ 21482cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas GregorGLboolean XMesaGetDepthBuffer( XMesaBuffer b, GLint *width, GLint *height, 21492cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor GLint *bytesPerValue, void **buffer ) 21500953e767ff7817f97b3ab20896b229891eeff45bJohn McCall{ 21512cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor struct gl_renderbuffer *rb 21522cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor = b->mesa_buffer.Attachment[BUFFER_DEPTH].Renderbuffer; 21532cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor if (!rb || !rb->Data) { 2154c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor *width = 0; 21550b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor *height = 0; 21560b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor *bytesPerValue = 0; 2157c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor *buffer = 0; 21582cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor return GL_FALSE; 21592cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor } 21604fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor else { 21614fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor *width = b->mesa_buffer.Width; 21624fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor *height = b->mesa_buffer.Height; 21634fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor *bytesPerValue = b->mesa_buffer.Visual.depthBits <= 16 21642cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor ? sizeof(GLushort) : sizeof(GLuint); 21652cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor *buffer = rb->Data; 21662cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor return GL_TRUE; 21672cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor } 21682cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor} 2169a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl 21702cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 217117945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidisvoid XMesaFlush( XMesaContext c ) 21722cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor{ 21732cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor if (c && c->xm_visual) { 2174c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor#ifdef XFree86Server 21752cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor /* NOT_NEEDED */ 21768538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl#else 21775f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner XSync( c->xm_visual->display, False ); 217817945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis#endif 217917945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis } 2180eb5e9986e577b1e2bff3cca5973a2494fb593fbbArgyrios Kyrtzidis} 21812cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 21822512308525ff328aa992da0b5ee14a488d2ea93aDouglas Gregor 21836e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer 21842cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregorconst char *XMesaGetString( XMesaContext c, int name ) 21852cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor{ 21862cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor (void) c; 2187a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl if (name==XMESA_VERSION) { 21881476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl return "5.0"; 21891476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl } 21901476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl else if (name==XMESA_EXTENSIONS) { 21911476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl return ""; 21921476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl } 21938538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl else { 21941476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl return NULL; 2195a119da0761cb6b85f53857eaee50f6ad8c5ea0a0Douglas Gregor } 21961476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl} 21971476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl 21981476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl 21998538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl 22001476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian RedlXMesaBuffer XMesaFindBuffer( XMesaDisplay *dpy, XMesaDrawable d ) 2201a119da0761cb6b85f53857eaee50f6ad8c5ea0a0Douglas Gregor{ 22026e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer XMesaBuffer b; 22031476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl for (b=XMesaBufferList; b; b=b->Next) { 22041476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl if (b->frontxrb->drawable == d && b->display == dpy) { 22051476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl return b; 22068538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl } 22071476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl } 2208496c709a6f08f5c502b6f592ddd9ed40f953a5e5Douglas Gregor return NULL; 22091476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl} 22101476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl 22111476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl 22128538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl/** 22131476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl * Free/destroy all XMesaBuffers associated with given display. 22140a14e4bf604a91b035a479235adf4c2f6c9128a2Douglas Gregor */ 22156e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramervoid xmesa_destroy_buffers_on_display(XMesaDisplay *dpy) 22161476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl{ 22171476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl XMesaBuffer b, next; 221810f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis for (b = XMesaBufferList; b; b = next) { 221910f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis next = b->Next; 222010f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis if (b->display == dpy) { 222110f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis xmesa_free_buffer(b); 222210f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis } 222310f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis } 222410f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis} 222510f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis 222610f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis 222710f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis/* 222810f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis * Look for XMesaBuffers whose X window has been destroyed. 222910f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis * Deallocate any such XMesaBuffers. 223010f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis */ 223110f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidisvoid XMesaGarbageCollect( void ) 223210f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis{ 223310f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis XMesaBuffer b, next; 223410f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis for (b=XMesaBufferList; b; b=next) { 223510f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis next = b->Next; 223610f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis if (b->display && b->frontxrb->drawable && b->type == WINDOW) { 223710f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis#ifdef XFree86Server 223810f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis /* NOT_NEEDED */ 223910f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis#else 224010f3df54486385e6497c9e5f229ff816e5a6c511Argyrios Kyrtzidis XSync(b->display, False); 22414fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor if (!window_exists( b->display, b->frontxrb->drawable )) { 22424fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor /* found a dead window, free the ancillary info */ 22434fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor XMesaDestroyBuffer( b ); 22444fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor } 22453251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor#endif 2246f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor } 22473397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl } 2248a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl} 2249f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor 2250f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor 2251f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregorunsigned long XMesaDitherColor( XMesaContext xmesa, GLint x, GLint y, 2252f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor GLfloat red, GLfloat green, 22531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump GLfloat blue, GLfloat alpha ) 22545d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl{ 22558538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl GLcontext *ctx = &xmesa->mesa; 22565d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl GLint r = (GLint) (red * 255.0F); 22575d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl GLint g = (GLint) (green * 255.0F); 2258f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor GLint b = (GLint) (blue * 255.0F); 2259f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor GLint a = (GLint) (alpha * 255.0F); 22603397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl 22611eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump switch (xmesa->pixelformat) { 2262f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor case PF_Index: 22630eca89e9890db4d8336ce762a5b359a1d58ca02bArgyrios Kyrtzidis return 0; 2264f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor case PF_Truecolor: 22651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump { 22661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump unsigned long p; 22675f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner PACK_TRUECOLOR( p, r, g, b ); 2268f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor return p; 2269f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor } 2270f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor case PF_8A8B8G8R: 22715d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl return PACK_8A8B8G8R( r, g, b, a ); 22725d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl case PF_8A8R8G8B: 2273f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor return PACK_8A8R8G8B( r, g, b, a ); 2274f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor case PF_8R8G8B: 2275f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor return PACK_8R8G8B( r, g, b ); 22765d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl case PF_5R6G5B: 2277f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor return PACK_5R6G5B( r, g, b ); 2278f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor case PF_Dither: 2279f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor { 2280f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor DITHER_SETUP; 2281f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor return DITHER( x, y, r, g, b ); 2282f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor } 22831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump case PF_1Bit: 22845f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner /* 382 = (3*255)/2 */ 22851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return ((r+g+b) > 382) ^ xmesa->xm_visual->bitFlip; 228683941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor case PF_HPCR: 228783941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor return DITHER_HPCR(x, y, r, g, b); 2288f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor case PF_Lookup: 2289f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor { 2290f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor LOOKUP_SETUP; 2291f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor return LOOKUP( r, g, b ); 2292f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor } 22931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump case PF_Grayscale: 2294f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor return GRAY_RGB( r, g, b ); 2295f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor case PF_Dither_5R6G5B: 22961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /* fall through */ 22975f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner case PF_Dither_True: 2298a67e58c8fa03c2f1aa7609bf5a436d1adba75eefDouglas Gregor { 2299a67e58c8fa03c2f1aa7609bf5a436d1adba75eefDouglas Gregor unsigned long p; 23005d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl PACK_TRUEDITHER(p, x, y, r, g, b); 2301f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor return p; 23025d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl } 2303f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor default: 2304f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor _mesa_problem(NULL, "Bad pixel format in XMesaDitherColor"); 2305f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor } 2306f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor return 0; 2307f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor} 23085d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl 2309f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor 2310f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor/* 2311f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor * This is typically called when the window size changes and we need 2312f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor * to reallocate the buffer's back/depth/stencil/accum buffers. 2313f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor */ 2314f0aaf7a59729a4ae0146e3464ee987745be95829Douglas GregorPUBLIC void 23155d05007b7a7883159154e3f65f338a2542d53913Sebastian RedlXMesaResizeBuffers( XMesaBuffer b ) 2316f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor{ 2317f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor GET_CURRENT_CONTEXT(ctx); 2318f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor XMesaContext xmctx = XMESA_CONTEXT(ctx); 23195d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl if (!xmctx) 2320f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor return; 2321f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor xmesa_check_and_update_buffer_size(xmctx, b); 2322f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor} 2323a67e58c8fa03c2f1aa7609bf5a436d1adba75eefDouglas Gregor 2324a67e58c8fa03c2f1aa7609bf5a436d1adba75eefDouglas Gregor 2325f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregorstatic GLint 2326f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregorxbuffer_to_renderbuffer(int buffer) 2327f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor{ 2328f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor assert(MAX_AUX_BUFFERS <= 4); 2329059612dd3429cef2d61f11950f3d93a40182bf69Sebastian Redl 2330f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor switch (buffer) { 2331f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor case GLX_FRONT_LEFT_EXT: 2332059612dd3429cef2d61f11950f3d93a40182bf69Sebastian Redl return BUFFER_FRONT_LEFT; 2333059612dd3429cef2d61f11950f3d93a40182bf69Sebastian Redl case GLX_FRONT_RIGHT_EXT: 2334a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl return BUFFER_FRONT_RIGHT; 2335f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor case GLX_BACK_LEFT_EXT: 2336f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor return BUFFER_BACK_LEFT; 2337059612dd3429cef2d61f11950f3d93a40182bf69Sebastian Redl case GLX_BACK_RIGHT_EXT: 23385d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl return BUFFER_BACK_RIGHT; 2339059612dd3429cef2d61f11950f3d93a40182bf69Sebastian Redl case GLX_AUX0_EXT: 2340e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl return BUFFER_AUX0; 2341059612dd3429cef2d61f11950f3d93a40182bf69Sebastian Redl case GLX_AUX1_EXT: 2342f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor case GLX_AUX2_EXT: 23433397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl case GLX_AUX3_EXT: 23445d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis case GLX_AUX4_EXT: 23451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump case GLX_AUX5_EXT: 2346059612dd3429cef2d61f11950f3d93a40182bf69Sebastian Redl case GLX_AUX6_EXT: 2347059612dd3429cef2d61f11950f3d93a40182bf69Sebastian Redl case GLX_AUX7_EXT: 2348e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl case GLX_AUX8_EXT: 23498538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case GLX_AUX9_EXT: 23505d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl default: 23515d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl /* BadValue error */ 23525d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl return -1; 2353059612dd3429cef2d61f11950f3d93a40182bf69Sebastian Redl } 23543397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl} 23555d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl 23565d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl 23575d05007b7a7883159154e3f65f338a2542d53913Sebastian RedlPUBLIC void 23585d05007b7a7883159154e3f65f338a2542d53913Sebastian RedlXMesaBindTexImage(XMesaDisplay *dpy, XMesaBuffer drawable, int buffer, 23595d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl const int *attrib_list) 23605d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl{ 23615d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl#if 0 23625d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl GET_CURRENT_CONTEXT(ctx); 23633397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl const GLuint unit = ctx->Texture.CurrentUnit; 2364e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit]; 2365e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl struct gl_texture_object *texObj; 2366e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl#endif 2367e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl struct gl_renderbuffer *rb; 2368e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl struct xmesa_renderbuffer *xrb; 2369e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl GLint b; 2370919814def90acecd25a35445862f0c0ff72a9b05Douglas Gregor XMesaImage *img = NULL; 2371e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl GLboolean freeImg = GL_FALSE; 2372e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl 2373e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl b = xbuffer_to_renderbuffer(buffer); 2374e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl if (b < 0) 2375919814def90acecd25a35445862f0c0ff72a9b05Douglas Gregor return; 2376e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl 2377e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl if (drawable->TextureFormat == GLX_TEXTURE_FORMAT_NONE_EXT) 2378e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl return; /* BadMatch error */ 2379e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl 2380fa78dec572259aca763457b435744f79d822c5d4Sebastian Redl rb = drawable->mesa_buffer.Attachment[b].Renderbuffer; 2381fa78dec572259aca763457b435744f79d822c5d4Sebastian Redl if (!rb) { 2382fa78dec572259aca763457b435744f79d822c5d4Sebastian Redl /* invalid buffer */ 2383e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl return; 23845d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis } 2385f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor xrb = xmesa_renderbuffer(rb); 2386f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor 2387f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor#if 0 2388f7ccbad5d9949e7ddd1cbef43d482553b811e026Dylan Noblesmith switch (drawable->TextureTarget) { 2389f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor case GLX_TEXTURE_1D_EXT: 2390f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor texObj = texUnit->CurrentTex[TEXTURE_1D_INDEX]; 23913397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl break; 2392f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor case GLX_TEXTURE_2D_EXT: 2393f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor texObj = texUnit->CurrentTex[TEXTURE_2D_INDEX]; 2394a67e58c8fa03c2f1aa7609bf5a436d1adba75eefDouglas Gregor break; 2395f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor case GLX_TEXTURE_RECTANGLE_EXT: 2396f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor texObj = texUnit->CurrentTex[TEXTURE_RECT_INDEX]; 2397f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor break; 2398f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor default: 2399f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor return; /* BadMatch error */ 24008538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl } 2401f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor#endif 240283941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor 2403f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor /* 2404f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor * The following is a quick and simple way to implement 2405f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor * BindTexImage. The better way is to write some new FetchTexel() 240683941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor * functions which would extract texels from XImages. We'd still 2407f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor * need to use GetImage when texturing from a Pixmap (front buffer) 24088538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl * but texturing from a back buffer (XImage) would avoid an image 2409f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor * copy. 2410e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl */ 2411ec312a1f0557b1d27f3eb6cf49acbf7e72696422Daniel Dunbar 241283941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor /* get XImage */ 241383941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor if (xrb->pixmap) { 241483941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor img = XMesaGetImage(dpy, xrb->pixmap, 0, 0, rb->Width, rb->Height, ~0L, 24158538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl ZPixmap); 24167c789c1a3f77f24032aa0bed2afacdb9e094e952Douglas Gregor freeImg = GL_TRUE; 2417b18b1fd33f958264630fbae2602c81275bae8c9aDouglas Gregor } 241883941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor else if (xrb->ximage) { 241983941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor img = xrb->ximage; 242083941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor } 242183941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor 242283941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor /* store the XImage as a new texture image */ 24238538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl if (img) { 242483941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor GLenum format, type, intFormat; 2425b18b1fd33f958264630fbae2602c81275bae8c9aDouglas Gregor if (img->bits_per_pixel == 32) { 242683941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor format = GL_BGRA; 24276e089c687cc2b914c46859ab7e46fe4c3c6b0afbBenjamin Kramer type = GL_UNSIGNED_BYTE; 2428f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor intFormat = GL_RGBA; 2429f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor } 2430f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor else if (img->bits_per_pixel == 24) { 24313397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl format = GL_BGR; 2432a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl type = GL_UNSIGNED_BYTE; 2433320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian intFormat = GL_RGB; 2434320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian } 2435320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian else if (img->bits_per_pixel == 16) { 2436725cd9686a0f5bb6c994cb3e43f58b63567c6860Sebastian Redl format = GL_BGR; 2437320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian type = GL_UNSIGNED_SHORT_5_6_5; 2438725cd9686a0f5bb6c994cb3e43f58b63567c6860Sebastian Redl intFormat = GL_RGB; 24393397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl } 2440a68340fd55e177a5849cb3adbf66aedce1f6e91bSebastian Redl else { 2441a68340fd55e177a5849cb3adbf66aedce1f6e91bSebastian Redl _mesa_problem(NULL, "Unexpected XImage format in XMesaBindTexImage"); 2442320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian return; 2443320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian } 2444320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian if (drawable->TextureFormat == GLX_TEXTURE_FORMAT_RGBA_EXT) { 2445320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian intFormat = GL_RGBA; 2446320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian } 2447320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian else if (drawable->TextureFormat == GLX_TEXTURE_FORMAT_RGB_EXT) { 2448320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian intFormat = GL_RGB; 2449320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian } 24508538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl 2451320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian _mesa_TexImage2D(GL_TEXTURE_2D, 0, intFormat, rb->Width, rb->Height, 0, 2452320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian format, type, img->data); 24534fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor 24544fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor if (freeImg) { 24554fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor XMesaDestroyImage(img); 24564fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor } 2457f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor } 24583397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl} 2459a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl 246037e2684abfe38207fdb90620da062bb18c23f29aDouglas Gregor 2461eee242ff426bf79149f221798966e58688383c1eDouglas Gregor 24627143aab97c6e849a5a5005b7853b8c7d5af008edDouglas GregorPUBLIC void 24637143aab97c6e849a5a5005b7853b8c7d5af008edDouglas GregorXMesaReleaseTexImage(XMesaDisplay *dpy, XMesaBuffer drawable, int buffer) 2464a92193ebd9840e5ce4de1b09e49f1b024c0f5c2fDouglas Gregor{ 2465a92193ebd9840e5ce4de1b09e49f1b024c0f5c2fDouglas Gregor const GLint b = xbuffer_to_renderbuffer(buffer); 2466a92193ebd9840e5ce4de1b09e49f1b024c0f5c2fDouglas Gregor if (b < 0) 24677143aab97c6e849a5a5005b7853b8c7d5af008edDouglas Gregor return; 24687143aab97c6e849a5a5005b7853b8c7d5af008edDouglas Gregor 24697143aab97c6e849a5a5005b7853b8c7d5af008edDouglas Gregor /* no-op for now */ 24707143aab97c6e849a5a5005b7853b8c7d5af008edDouglas Gregor} 2471eee242ff426bf79149f221798966e58688383c1eDouglas Gregor 24727143aab97c6e849a5a5005b7853b8c7d5af008edDouglas Gregor