xm_api.c revision 2c1937480a68b066a1a0b8ee3770e675bfad859b
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 210b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 222cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall */ 246ab7cd853e9c15cf986a8a7c3db1f8d20e275409Sebastian Redl 257c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner/** 266a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor * \file xm_api.c 277c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner * 2883d63c78810556d26b62ac4cbae2eda6cdd2570cSteve Naroff * All the XMesa* API functions. 2914f79002e58556798e86168c63e48d533287eda5Douglas Gregor * 303251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor * 3114f79002e58556798e86168c63e48d533287eda5Douglas Gregor * NOTES: 32bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregor * 332bec0410d268779f601bd509e0302a500af7ac6aDouglas Gregor * The window coordinate system origin (0,0) is in the lower-left corner 34ab41e63821dc60ad144d0684df8d79a9eef86b75Douglas Gregor * of the window. X11's window coordinate origin is in the upper-left 3517fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregor * corner of the window. Therefore, most drawing functions in this 3617fc223395d51be582fc666bb6ea21bd1dff26dcDouglas Gregor * file have to flip Y coordinates. 372596e429a61602312bdd149786045b8a90cd2d10Daniel Dunbar * 382cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * Define USE_XSHM in the Makefile with -DUSE_XSHM if you want to compile 3914f79002e58556798e86168c63e48d533287eda5Douglas Gregor * in support for the MIT Shared Memory extension. If enabled, when you 40b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor * use an Ximage for the back buffer in double buffered mode, the "swap" 413c304bd9ec2b4611572d4cbae9e1727bbecb5dc9Chris Lattner * operation will be faster. You must also link with -lXext. 422cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * 438538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl * Byte swapping: If the Mesa host and the X display use a different 442cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * byte order then there's some trickiness to be aware of when using 45ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl * XImages. The byte ordering used for the XImage is that of the X 46ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl * display, not the Mesa host. 47ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl * The color-to-pixel encoding for True/DirectColor must be done 48ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl * according to the display's visual red_mask, green_mask, and blue_mask. 49ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl * If XPutPixel is used to put a pixel into an XImage then XPutPixel will 50ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl * do byte swapping if needed. If one wants to directly "poke" the pixel 51ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl * into the XImage's buffer then the pixel must be byte swapped first. In 52ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl * Mesa, when byte swapping is needed we use the PF_TRUECOLOR pixel format 53ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl * and use XPutPixel everywhere except in the implementation of 542cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * glClear(GL_COLOR_BUFFER_BIT). We want this function to be fast so 552cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * instead of using XPutPixel we "poke" our values after byte-swapping 562cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * the clear pixel value if needed. 5712b1c7615d4f9a2edc544be499f895f16ac100edChris Lattner * 582cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor */ 593397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl 60a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl#ifdef __CYGWIN__ 61a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl#undef WIN32 622cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#undef __WIN32__ 632cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#endif 642cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 658538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl#include "glxheader.h" 662cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "xmesaP.h" 673397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl#include "main/context.h" 688538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl#include "main/extensions.h" 692cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "main/framebuffer.h" 702cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "main/imports.h" 712cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "main/macros.h" 722cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "main/renderbuffer.h" 732cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "main/teximage.h" 742cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "glapi/glthread.h" 752cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "swrast/swrast.h" 762cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "swrast_setup/swrast_setup.h" 772cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "vbo/vbo.h" 782cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "tnl/tnl.h" 792cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "tnl/t_context.h" 803397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl#include "tnl/t_pipeline.h" 812cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "drivers/common/driverfuncs.h" 822cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#include "drivers/common/meta.h" 832cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 843397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl/** 852cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * Global X driver lock 868538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl */ 872cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor_glthread_Mutex _xmesa_lock; 882cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 893397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl 902cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 918538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl/** 922cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * Lookup tables for HPCR pixel format: 932cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor */ 943397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redlstatic short hpcr_rgbTbl[3][256] = { 951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump{ 968538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 972cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 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, 993397c5570369f19b2d6c52e898f708d75ceede1fSebastian 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, 1018538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 1022cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 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, 1043397c5570369f19b2d6c52e898f708d75ceede1fSebastian 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, 1068538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 1072cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 1082cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 1093397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 1101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 1111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239 1128538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl}, 1132cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor{ 1142cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 1153397c5570369f19b2d6c52e898f708d75ceede1fSebastian 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, 1180953e767ff7817f97b3ab20896b229891eeff45bJohn McCall 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 1192cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 1202cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 1213397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl 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, 1232cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 1248538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 1252cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 1262cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 1273397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl192, 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, 1298538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239 1302cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor}, 1312cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor{ 1323397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl 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, 1347e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor 48, 48, 49, 49, 50, 50, 51, 51, 52, 52, 53, 53, 54, 54, 55, 55, 1357e7eb3da052a6d80ddf2377cab0384c798f73f75Douglas Gregor 56, 56, 57, 57, 58, 58, 59, 59, 60, 60, 61, 61, 62, 62, 63, 63, 136c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor 64, 64, 65, 65, 66, 66, 67, 67, 68, 68, 69, 69, 70, 70, 71, 71, 1378538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl 72, 72, 73, 73, 74, 74, 75, 75, 76, 76, 77, 77, 78, 78, 79, 79, 1382cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 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, 1403397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 1412cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor112, 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, 143788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 1448538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl160, 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, 1462cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 1473397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223 1482cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor} 1498538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl}; 1502cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 1512cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 1523397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl 1532cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor/**********************************************************************/ 154264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola/***** X Utility Functions *****/ 155264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola/**********************************************************************/ 156425ef72306d4ff6b3698b744353e5f0e56b4b884Rafael Espindola 157ab8bbf4ebd3e3e6eab913cb044772a62b7581941Douglas Gregor 158264ba48dc98f3f843935a485d5b086f7e0fdc4f1Rafael Espindola/** 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} 1682cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#endif 1692cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 1702cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 1712cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor/** 1722cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * Check if the X Shared Memory extension is available. 173465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl * Return: 0 = not available 174465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl * 1 = shared XImage support available 175465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl * 2 = shared Pixmap support available also 176465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redl */ 177465226e23a3008bd68973513dda1f9e3cd27dbddSebastian Redlstatic int check_for_xshm( XMesaDisplay *display ) 1788538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl{ 1792cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#if defined(USE_XSHM) && !defined(XFree86Server) 1802cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor int major, minor, ignore; 1813397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl Bool pixmaps; 182ed97649e9574b9d854fa4d6109c9333ae0993554John McCall 1838538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl if (XQueryExtension( display, "MIT-SHM", &ignore, &ignore, &ignore )) { 184ed97649e9574b9d854fa4d6109c9333ae0993554John McCall if (XShmQueryVersion( display, &major, &minor, &pixmaps )==True) { 185ed97649e9574b9d854fa4d6109c9333ae0993554John McCall return (pixmaps==True) ? 2 : 1; 1863397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl } 1872cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor else { 1889763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis return 0; 1899763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis } 1908538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl } 1912cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor else { 1922cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor return 0; 1933397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl } 194c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor#else 1958538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl /* No XSHM support */ 1962cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor return 0; 1972cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#endif 1983397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl} 1992cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 2008538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl 2012cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor/** 2022cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * Apply gamma correction to an intensity value in [0..max]. Return the 2033397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl * new intensity value. 204395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson */ 2058538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redlstatic GLint 206395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlssongamma_adjust( GLfloat gamma, GLint value, GLint max ) 207395b475a4474f1c7574d927ad142ca0c7997cbcaAnders Carlsson{ 2083397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl if (gamma == 1.0) { 209be191100e034b23a3e13053757a57b7f5068c24aArgyrios Kyrtzidis return value; 2102cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor } 2111eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump else { 2122cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor double x = (double) value / (double) max; 2132cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor return IROUND_POS((GLfloat) max * _mesa_pow(x, 1.0F/gamma)); 2142cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor } 2153397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl} 2162cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 2178538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl 2182cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 2192cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor/** 2203397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl * Return the true number of bits per pixel for XImages. 2212cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * For example, if we request a 24-bit deep visual we may actually need/get 2228538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl * 32bpp XImages. This function returns the appropriate bpp. 2232cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * Input: dpy - the X display 2242cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * visinfo - desribes the visual to be used for XImages 2251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump * Return: true number of bits per pixel for XImages 2263397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl */ 22749a832bd499d6f61c23655f1fac99f0dd229756eJohn McCallstatic int 22849a832bd499d6f61c23655f1fac99f0dd229756eJohn McCallbits_per_pixel( XMesaVisual xmv ) 22949a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall{ 2308538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl#ifdef XFree86Server 23149a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall const int depth = xmv->nplanes; 23249a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall int i; 23349a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall assert(depth > 0); 2343397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl for (i = 0; i < screenInfo.numPixmapFormats; i++) { 2352cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor if (screenInfo.formats[i].depth == depth) 236be191100e034b23a3e13053757a57b7f5068c24aArgyrios Kyrtzidis return screenInfo.formats[i].bitsPerPixel; 23790b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis } 23890b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis return depth; /* should never get here, but this should be safe */ 23990b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis#else 24090b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis XMesaDisplay *dpy = xmv->display; 24190b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis XMesaVisualInfo visinfo = xmv->visinfo; 2429763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis XMesaImage *img; 2439763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis int bitsPerPixel; 2449763e221e16026ddf487d2564ed349d2c874a1a1Argyrios Kyrtzidis /* Create a temporary XImage */ 2458538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl img = XCreateImage( dpy, visinfo->visual, visinfo->depth, 24690b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis ZPixmap, 0, /*format, offset*/ 24790b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis (char*) MALLOC(8), /*data*/ 24890b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis 1, 1, /*width, height*/ 2493397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl 32, /*bitmap_pad*/ 250ae8b17f1d5d303af53db5a4f4a375ea6b9356566Argyrios Kyrtzidis 0 /*bytes_per_line*/ 251ae8b17f1d5d303af53db5a4f4a375ea6b9356566Argyrios Kyrtzidis ); 252ae8b17f1d5d303af53db5a4f4a375ea6b9356566Argyrios Kyrtzidis assert(img); 2538538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl /* grab the bits/pixel value */ 25490b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis bitsPerPixel = img->bits_per_pixel; 25590b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis /* free the XImage */ 25690b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis _mesa_free( img->data ); 2573397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl img->data = NULL; 25890b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis XMesaDestroyImage( img ); 25990b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis return bitsPerPixel; 26090b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis#endif 26190b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis} 26290b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis 26390b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis 2643397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl 26590b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis/* 26690b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis * Determine if a given X window ID is valid (window exists). 26790b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis * Do this by calling XGetWindowAttributes() for the window and 26890b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis * checking if we catch an X error. 2698538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl * Input: dpy - the display 27090b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis * win - the window to check for existance 27190b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis * Return: GL_TRUE - window exists 27290b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis * GL_FALSE - window doesn't exist 2733397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl */ 2748dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis#ifndef XFree86Server 2758dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidisstatic GLboolean WindowExistsFlag; 2768dfbd8b252ba4e6cf4b7a3422f6ef0ca21312dfeArgyrios Kyrtzidis 277f48d45e3e36c132bdee3373beec4e8b19ae3f9c4Argyrios Kyrtzidisstatic int window_exists_err_handler( XMesaDisplay* dpy, XErrorEvent* xerr ) 278f48d45e3e36c132bdee3373beec4e8b19ae3f9c4Argyrios Kyrtzidis{ 279f48d45e3e36c132bdee3373beec4e8b19ae3f9c4Argyrios Kyrtzidis (void) dpy; 2808538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl if (xerr->error_code == BadWindow) { 28190b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis WindowExistsFlag = GL_FALSE; 28290b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis } 28390b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis return 0; 2843397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl} 28590b715e0df34eae2b50b9b43ec60828ed31dcf94Argyrios Kyrtzidis 2863acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidisstatic GLboolean window_exists( XMesaDisplay *dpy, Window win ) 2873acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis{ 2883acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis XWindowAttributes wa; 2893acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis int (*old_handler)( XMesaDisplay*, XErrorEvent* ); 2903acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis WindowExistsFlag = GL_TRUE; 2913acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis old_handler = XSetErrorHandler(window_exists_err_handler); 2923acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis XGetWindowAttributes( dpy, win, &wa ); /* dummy request */ 2938538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl XSetErrorHandler(old_handler); 2942cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor return WindowExistsFlag; 2952cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor} 2963397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl 297465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnarastatic Status 2983acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidisget_drawable_size( XMesaDisplay *dpy, Drawable d, GLuint *width, GLuint *height ) 2993acad62a239448bef0f5848b2a0d5f7dfefd3d14Argyrios Kyrtzidis{ 3008538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl Window root; 3012cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor Status stat; 3022cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor int xpos, ypos; 3033397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl unsigned int w, h, bw, depth; 3043cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall stat = XGetGeometry(dpy, d, &root, &xpos, &ypos, &w, &h, &bw, &depth); 30531f17ecbef57b5679c017c375db330546b7b5145John McCall *width = w; 3068538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl *height = h; 3073cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall return stat; 3083cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall} 3093397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl#endif 310deacbdca554298ccdf636f19c6094a8825ec6b34Douglas Gregor 3118538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl 312c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall/** 313c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall * Return the size of the window (or pixmap) that corresponds to the 3143397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl * given XMesaBuffer. 315c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall * \param width returns width in pixels 3162cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * \param height returns height in pixels 317c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall */ 318446ee4eb4fc4c705a59365252df7a5c253daafa1Steve Naroffvoid 319446ee4eb4fc4c705a59365252df7a5c253daafa1Steve Naroffxmesa_get_window_size(XMesaDisplay *dpy, XMesaBuffer b, 3208538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl GLuint *width, GLuint *height) 3212cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor{ 3222cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#ifdef XFree86Server 323d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff *width = MIN2(b->frontxrb->drawable->width, MAX_WIDTH); 3243397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl *height = MIN2(b->frontxrb->drawable->height, MAX_HEIGHT); 3251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump#else 3268538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl Status stat; 3272cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 3282cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor _glthread_LOCK_MUTEX(_xmesa_lock); 329a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall XSync(b->xm_visual->display, 0); /* added for Chromium */ 330a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall stat = get_drawable_size(dpy, b->frontxrb->pixmap, width, height); 331a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall _glthread_UNLOCK_MUTEX(_xmesa_lock); 332a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl 333a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl if (!stat) { 334a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall /* probably querying a window that's recently been destroyed */ 335a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall _mesa_warning(NULL, "XGetGeometry failed!\n"); 336a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl *width = *height = 1; 337a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall } 338a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall#endif 33951bd803fbdade51d674598ed45da3d54190a656cJohn McCall} 340a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall 34151bd803fbdade51d674598ed45da3d54190a656cJohn McCall 342a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall 343a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall/**********************************************************************/ 34451bd803fbdade51d674598ed45da3d54190a656cJohn McCall/***** Linked list of XMesaBuffers *****/ 34551bd803fbdade51d674598ed45da3d54190a656cJohn McCall/**********************************************************************/ 346a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall 347a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCallXMesaBuffer XMesaBufferList = NULL; 348a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall 349a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall 35051bd803fbdade51d674598ed45da3d54190a656cJohn McCall/** 35151bd803fbdade51d674598ed45da3d54190a656cJohn McCall * Allocate a new XMesaBuffer object which corresponds to the given drawable. 35251bd803fbdade51d674598ed45da3d54190a656cJohn McCall * Note that XMesaBuffer is derived from GLframebuffer. 35351bd803fbdade51d674598ed45da3d54190a656cJohn McCall * The new XMesaBuffer will not have any size (Width=Height=0). 354ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor * 355ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor * \param d the corresponding X drawable (window or pixmap) 356ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor * \param type either WINDOW, PIXMAP or PBUFFER, describing d 357ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor * \param vis the buffer's visual 358ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor * \param cmap the window's colormap, if known. 359ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor * \return new XMesaBuffer or NULL if any problem 360ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor */ 36151bd803fbdade51d674598ed45da3d54190a656cJohn McCallstatic XMesaBuffer 36251bd803fbdade51d674598ed45da3d54190a656cJohn McCallcreate_xmesa_buffer(XMesaDrawable d, BufferType type, 36351bd803fbdade51d674598ed45da3d54190a656cJohn McCall XMesaVisual vis, XMesaColormap cmap) 36451bd803fbdade51d674598ed45da3d54190a656cJohn McCall{ 36551bd803fbdade51d674598ed45da3d54190a656cJohn McCall XMesaBuffer b; 36651bd803fbdade51d674598ed45da3d54190a656cJohn McCall 36751bd803fbdade51d674598ed45da3d54190a656cJohn McCall ASSERT(type == WINDOW || type == PIXMAP || type == PBUFFER); 36851bd803fbdade51d674598ed45da3d54190a656cJohn McCall 36951bd803fbdade51d674598ed45da3d54190a656cJohn McCall b = (XMesaBuffer) CALLOC_STRUCT(xmesa_buffer); 37051bd803fbdade51d674598ed45da3d54190a656cJohn McCall if (!b) 37151bd803fbdade51d674598ed45da3d54190a656cJohn McCall return NULL; 37251bd803fbdade51d674598ed45da3d54190a656cJohn McCall 37351bd803fbdade51d674598ed45da3d54190a656cJohn McCall b->display = vis->display; 37451bd803fbdade51d674598ed45da3d54190a656cJohn McCall b->xm_visual = vis; 37551bd803fbdade51d674598ed45da3d54190a656cJohn McCall b->type = type; 37651bd803fbdade51d674598ed45da3d54190a656cJohn McCall b->cmap = cmap; 37751bd803fbdade51d674598ed45da3d54190a656cJohn McCall 37851bd803fbdade51d674598ed45da3d54190a656cJohn McCall _mesa_initialize_framebuffer(&b->mesa_buffer, &vis->mesa_visual); 37951bd803fbdade51d674598ed45da3d54190a656cJohn McCall b->mesa_buffer.Delete = xmesa_delete_framebuffer; 38051bd803fbdade51d674598ed45da3d54190a656cJohn McCall 38151bd803fbdade51d674598ed45da3d54190a656cJohn McCall /* 38251bd803fbdade51d674598ed45da3d54190a656cJohn McCall * Front renderbuffer 38351bd803fbdade51d674598ed45da3d54190a656cJohn McCall */ 38451bd803fbdade51d674598ed45da3d54190a656cJohn McCall b->frontxrb = xmesa_new_renderbuffer(NULL, 0, &vis->mesa_visual, GL_FALSE); 38551bd803fbdade51d674598ed45da3d54190a656cJohn McCall if (!b->frontxrb) { 38651bd803fbdade51d674598ed45da3d54190a656cJohn McCall _mesa_free(b); 38751bd803fbdade51d674598ed45da3d54190a656cJohn McCall return NULL; 38851bd803fbdade51d674598ed45da3d54190a656cJohn McCall } 38951bd803fbdade51d674598ed45da3d54190a656cJohn McCall b->frontxrb->Parent = b; 39051bd803fbdade51d674598ed45da3d54190a656cJohn McCall b->frontxrb->drawable = d; 39151bd803fbdade51d674598ed45da3d54190a656cJohn McCall b->frontxrb->pixmap = (XMesaPixmap) d; 39251bd803fbdade51d674598ed45da3d54190a656cJohn McCall _mesa_add_renderbuffer(&b->mesa_buffer, BUFFER_FRONT_LEFT, 39351bd803fbdade51d674598ed45da3d54190a656cJohn McCall &b->frontxrb->Base); 39451bd803fbdade51d674598ed45da3d54190a656cJohn McCall 39551bd803fbdade51d674598ed45da3d54190a656cJohn McCall /* 39651bd803fbdade51d674598ed45da3d54190a656cJohn McCall * Back renderbuffer 39751bd803fbdade51d674598ed45da3d54190a656cJohn McCall */ 39851bd803fbdade51d674598ed45da3d54190a656cJohn McCall if (vis->mesa_visual.doubleBufferMode) { 39951bd803fbdade51d674598ed45da3d54190a656cJohn McCall b->backxrb = xmesa_new_renderbuffer(NULL, 0, &vis->mesa_visual, GL_TRUE); 40051bd803fbdade51d674598ed45da3d54190a656cJohn McCall if (!b->backxrb) { 40151bd803fbdade51d674598ed45da3d54190a656cJohn McCall /* XXX free front xrb too */ 40251bd803fbdade51d674598ed45da3d54190a656cJohn McCall _mesa_free(b); 40351bd803fbdade51d674598ed45da3d54190a656cJohn McCall return NULL; 40451bd803fbdade51d674598ed45da3d54190a656cJohn McCall } 40551bd803fbdade51d674598ed45da3d54190a656cJohn McCall b->backxrb->Parent = b; 40651bd803fbdade51d674598ed45da3d54190a656cJohn McCall /* determine back buffer implementation */ 40751bd803fbdade51d674598ed45da3d54190a656cJohn McCall b->db_mode = vis->ximage_flag ? BACK_XIMAGE : BACK_PIXMAP; 40851bd803fbdade51d674598ed45da3d54190a656cJohn McCall 40951bd803fbdade51d674598ed45da3d54190a656cJohn McCall _mesa_add_renderbuffer(&b->mesa_buffer, BUFFER_BACK_LEFT, 41051bd803fbdade51d674598ed45da3d54190a656cJohn McCall &b->backxrb->Base); 41151bd803fbdade51d674598ed45da3d54190a656cJohn McCall } 41251bd803fbdade51d674598ed45da3d54190a656cJohn McCall 41351bd803fbdade51d674598ed45da3d54190a656cJohn McCall /* 41451bd803fbdade51d674598ed45da3d54190a656cJohn McCall * Software alpha planes 41551bd803fbdade51d674598ed45da3d54190a656cJohn McCall */ 41651bd803fbdade51d674598ed45da3d54190a656cJohn McCall if (vis->mesa_visual.alphaBits > 0 41751bd803fbdade51d674598ed45da3d54190a656cJohn McCall && vis->undithered_pf != PF_8A8B8G8R 41851bd803fbdade51d674598ed45da3d54190a656cJohn McCall && vis->undithered_pf != PF_8A8R8G8B) { 41951bd803fbdade51d674598ed45da3d54190a656cJohn McCall /* Visual has alpha, but pixel format doesn't support it. 42051bd803fbdade51d674598ed45da3d54190a656cJohn McCall * We'll use an alpha renderbuffer wrapper. 42151bd803fbdade51d674598ed45da3d54190a656cJohn McCall */ 422ed97649e9574b9d854fa4d6109c9333ae0993554John McCall b->swAlpha = GL_TRUE; 423ed97649e9574b9d854fa4d6109c9333ae0993554John McCall } 424ed97649e9574b9d854fa4d6109c9333ae0993554John McCall else { 42551bd803fbdade51d674598ed45da3d54190a656cJohn McCall b->swAlpha = GL_FALSE; 42651bd803fbdade51d674598ed45da3d54190a656cJohn McCall } 42751bd803fbdade51d674598ed45da3d54190a656cJohn McCall 42851bd803fbdade51d674598ed45da3d54190a656cJohn McCall /* 429cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall * Other renderbuffer (depth, stencil, etc) 430cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall */ 431cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall _mesa_add_soft_renderbuffers(&b->mesa_buffer, 43251bd803fbdade51d674598ed45da3d54190a656cJohn McCall GL_FALSE, /* color */ 43351bd803fbdade51d674598ed45da3d54190a656cJohn McCall vis->mesa_visual.haveDepthBuffer, 434cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall vis->mesa_visual.haveStencilBuffer, 435cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall vis->mesa_visual.haveAccumBuffer, 436cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall b->swAlpha, 437cfb708c354e2f30ccc5cba9d644650f408a1ec3eJohn McCall vis->mesa_visual.numAuxBuffers > 0 ); 43851bd803fbdade51d674598ed45da3d54190a656cJohn McCall 43951bd803fbdade51d674598ed45da3d54190a656cJohn McCall /* GLX_EXT_texture_from_pixmap */ 44051bd803fbdade51d674598ed45da3d54190a656cJohn McCall b->TextureTarget = 0; 441a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall b->TextureFormat = GLX_TEXTURE_FORMAT_NONE_EXT; 44251bd803fbdade51d674598ed45da3d54190a656cJohn McCall b->TextureMipmap = 0; 44351bd803fbdade51d674598ed45da3d54190a656cJohn McCall 444a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall /* insert buffer into linked list */ 44551bd803fbdade51d674598ed45da3d54190a656cJohn McCall b->Next = XMesaBufferList; 44651bd803fbdade51d674598ed45da3d54190a656cJohn McCall XMesaBufferList = b; 447a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall 44851bd803fbdade51d674598ed45da3d54190a656cJohn McCall return b; 44951bd803fbdade51d674598ed45da3d54190a656cJohn McCall} 450a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall 45149a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall 45249a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall/** 45349a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall * Find an XMesaBuffer by matching X display and colormap but NOT matching 45449a832bd499d6f61c23655f1fac99f0dd229756eJohn McCall * the notThis buffer. 45551bd803fbdade51d674598ed45da3d54190a656cJohn McCall */ 45651bd803fbdade51d674598ed45da3d54190a656cJohn McCallXMesaBuffer 457833ca991c1bfc967f0995974ca86f66ba1f666b5John McCallxmesa_find_buffer(XMesaDisplay *dpy, XMesaColormap cmap, XMesaBuffer notThis) 458833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall{ 459833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall XMesaBuffer b; 460833ca991c1bfc967f0995974ca86f66ba1f666b5John McCall for (b=XMesaBufferList; b; b=b->Next) { 46144f8c37e378f716e8cbb600e3800f437cf58f9e5Argyrios Kyrtzidis if (b->display==dpy && b->cmap==cmap && b!=notThis) { 46244f8c37e378f716e8cbb600e3800f437cf58f9e5Argyrios Kyrtzidis return b; 463a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall } 464465d41b92b2c862f3062c412a0538db65c6a2661Abramo Bagnara } 465e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara return NULL; 466e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnara} 467a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall 4683cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall 4693cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall/** 4703cb0ebd5f76abcb776f7cb4062bd79e3268c0dc4John McCall * Remove buffer from linked list, delete if no longer referenced. 4714714c12a1ab759156b78be8f109ea4c12213af57Douglas Gregor */ 472e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnarastatic void 473e4da7a034a2fcf4b14d0bcc28d05de0878159061Abramo Bagnaraxmesa_free_buffer(XMesaBuffer buffer) 47451bd803fbdade51d674598ed45da3d54190a656cJohn McCall{ 475a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall XMesaBuffer prev = NULL, b; 47633500955d731c73717af52088b7fc0e7a85681e7John McCall 47733500955d731c73717af52088b7fc0e7a85681e7John McCall for (b = XMesaBufferList; b; b = b->Next) { 47833500955d731c73717af52088b7fc0e7a85681e7John McCall if (b == buffer) { 47933500955d731c73717af52088b7fc0e7a85681e7John McCall struct gl_framebuffer *fb = &buffer->mesa_buffer; 48033500955d731c73717af52088b7fc0e7a85681e7John McCall 48133500955d731c73717af52088b7fc0e7a85681e7John McCall /* unlink buffer from list */ 48233500955d731c73717af52088b7fc0e7a85681e7John McCall if (prev) 48333500955d731c73717af52088b7fc0e7a85681e7John McCall prev->Next = buffer->Next; 48444f8c37e378f716e8cbb600e3800f437cf58f9e5Argyrios Kyrtzidis else 48544f8c37e378f716e8cbb600e3800f437cf58f9e5Argyrios Kyrtzidis XMesaBufferList = buffer->Next; 48633500955d731c73717af52088b7fc0e7a85681e7John McCall 48751bd803fbdade51d674598ed45da3d54190a656cJohn McCall /* mark as delete pending */ 48851bd803fbdade51d674598ed45da3d54190a656cJohn McCall fb->DeletePending = GL_TRUE; 489c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall 490c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall /* Since the X window for the XMesaBuffer is going away, we don't 491c12c5bba6ceb6acd4e51e7a0fc03257da9cfd44eJohn McCall * want to dereference this pointer in the future. 49254e14c4db764c0636160d26c5bbf491637c83a76John McCall */ 49354e14c4db764c0636160d26c5bbf491637c83a76John McCall b->frontxrb->drawable = 0; 49454e14c4db764c0636160d26c5bbf491637c83a76John McCall 49554e14c4db764c0636160d26c5bbf491637c83a76John McCall /* Unreference. If count = zero we'll really delete the buffer */ 496a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall _mesa_reference_framebuffer(&fb, NULL); 49751bd803fbdade51d674598ed45da3d54190a656cJohn McCall 49851bd803fbdade51d674598ed45da3d54190a656cJohn McCall return; 499a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall } 500a1ee0c548b8aa4aaf93d1917e304e3da13171a08John McCall /* continue search */ 5014dcf151a555ff51e4d643e8e6eeb80f121d11d1bChris Lattner prev = b; 502a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl } 5032cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor /* buffer not found in XMesaBufferList */ 5042cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor _mesa_problem(NULL,"xmesa_free_buffer() - buffer not found\n"); 505b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner} 506b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner 507a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl 508b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner/** 509b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner * Copy X color table stuff from one XMesaBuffer to another. 510b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner */ 511b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattnerstatic void 512b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattnercopy_colortable_info(XMesaBuffer dst, const XMesaBuffer src) 513b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner{ 514b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner MEMCPY(dst->color_table, src->color_table, sizeof(src->color_table)); 515b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner MEMCPY(dst->pixel_to_r, src->pixel_to_r, sizeof(src->pixel_to_r)); 516b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner MEMCPY(dst->pixel_to_g, src->pixel_to_g, sizeof(src->pixel_to_g)); 517b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner MEMCPY(dst->pixel_to_b, src->pixel_to_b, sizeof(src->pixel_to_b)); 518b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner dst->num_alloced = src->num_alloced; 519b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner MEMCPY(dst->alloced_colors, src->alloced_colors, 520b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner sizeof(src->alloced_colors)); 521b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner} 522a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl 523b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner 524b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner 525b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner/**********************************************************************/ 526b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner/***** Misc Private Functions *****/ 527b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner/**********************************************************************/ 5280558df2da807646e65d4fa290f4e92114af1a746Chris Lattner 5290558df2da807646e65d4fa290f4e92114af1a746Chris Lattner 5300558df2da807646e65d4fa290f4e92114af1a746Chris Lattner/** 531a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl * A replacement for XAllocColor. This function should never 5328538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl * fail to allocate a color. When XAllocColor fails, we return 5330558df2da807646e65d4fa290f4e92114af1a746Chris Lattner * the nearest matching color. If we have to allocate many colors 5340558df2da807646e65d4fa290f4e92114af1a746Chris Lattner * this function isn't too efficient; the XQueryColors() could be 5350558df2da807646e65d4fa290f4e92114af1a746Chris Lattner * done just once. 5360558df2da807646e65d4fa290f4e92114af1a746Chris Lattner * Written by Michael Pichler, Brian Paul, Mark Kilgard 5370558df2da807646e65d4fa290f4e92114af1a746Chris Lattner * Input: dpy - X display 5380558df2da807646e65d4fa290f4e92114af1a746Chris Lattner * cmap - X colormap 5390558df2da807646e65d4fa290f4e92114af1a746Chris Lattner * cmapSize - size of colormap 5400558df2da807646e65d4fa290f4e92114af1a746Chris Lattner * In/Out: color - the XColor struct 5410558df2da807646e65d4fa290f4e92114af1a746Chris Lattner * Output: exact - 1=exact color match, 0=closest match 5420558df2da807646e65d4fa290f4e92114af1a746Chris Lattner * alloced - 1=XAlloc worked, 0=XAlloc failed 5430558df2da807646e65d4fa290f4e92114af1a746Chris Lattner */ 5440558df2da807646e65d4fa290f4e92114af1a746Chris Lattnerstatic void 5450558df2da807646e65d4fa290f4e92114af1a746Chris LattnernoFaultXAllocColor( int client, 5460558df2da807646e65d4fa290f4e92114af1a746Chris Lattner XMesaDisplay *dpy, 5470558df2da807646e65d4fa290f4e92114af1a746Chris Lattner XMesaColormap cmap, 5480558df2da807646e65d4fa290f4e92114af1a746Chris Lattner int cmapSize, 5490558df2da807646e65d4fa290f4e92114af1a746Chris Lattner XMesaColor *color, 5500558df2da807646e65d4fa290f4e92114af1a746Chris Lattner int *exact, int *alloced ) 5510558df2da807646e65d4fa290f4e92114af1a746Chris Lattner{ 5520558df2da807646e65d4fa290f4e92114af1a746Chris Lattner#ifdef XFree86Server 5530558df2da807646e65d4fa290f4e92114af1a746Chris Lattner Pixel *ppixIn; 5540558df2da807646e65d4fa290f4e92114af1a746Chris Lattner xrgb *ctable; 5550558df2da807646e65d4fa290f4e92114af1a746Chris Lattner#else 5560558df2da807646e65d4fa290f4e92114af1a746Chris Lattner /* we'll try to cache ctable for better remote display performance */ 5570558df2da807646e65d4fa290f4e92114af1a746Chris Lattner static Display *prevDisplay = NULL; 5580558df2da807646e65d4fa290f4e92114af1a746Chris Lattner static XMesaColormap prevCmap = 0; 5590558df2da807646e65d4fa290f4e92114af1a746Chris Lattner static int prevCmapSize = 0; 5600558df2da807646e65d4fa290f4e92114af1a746Chris Lattner static XMesaColor *ctable = NULL; 5610558df2da807646e65d4fa290f4e92114af1a746Chris Lattner#endif 5620558df2da807646e65d4fa290f4e92114af1a746Chris Lattner XMesaColor subColor; 5630558df2da807646e65d4fa290f4e92114af1a746Chris Lattner int i, bestmatch; 5640558df2da807646e65d4fa290f4e92114af1a746Chris Lattner double mindist; /* 3*2^16^2 exceeds long int precision. */ 5650558df2da807646e65d4fa290f4e92114af1a746Chris Lattner 5660558df2da807646e65d4fa290f4e92114af1a746Chris Lattner (void) client; 5670558df2da807646e65d4fa290f4e92114af1a746Chris Lattner 5680558df2da807646e65d4fa290f4e92114af1a746Chris Lattner /* First try just using XAllocColor. */ 5690558df2da807646e65d4fa290f4e92114af1a746Chris Lattner#ifdef XFree86Server 5700558df2da807646e65d4fa290f4e92114af1a746Chris Lattner if (AllocColor(cmap, 5710558df2da807646e65d4fa290f4e92114af1a746Chris Lattner &color->red, &color->green, &color->blue, 5720558df2da807646e65d4fa290f4e92114af1a746Chris Lattner &color->pixel, 5730558df2da807646e65d4fa290f4e92114af1a746Chris Lattner client) == Success) 5740558df2da807646e65d4fa290f4e92114af1a746Chris Lattner#else 5750558df2da807646e65d4fa290f4e92114af1a746Chris Lattner if (XAllocColor(dpy, cmap, color)) 5760558df2da807646e65d4fa290f4e92114af1a746Chris Lattner#endif 5770558df2da807646e65d4fa290f4e92114af1a746Chris Lattner { 5780558df2da807646e65d4fa290f4e92114af1a746Chris Lattner *exact = 1; 5790558df2da807646e65d4fa290f4e92114af1a746Chris Lattner *alloced = 1; 5800558df2da807646e65d4fa290f4e92114af1a746Chris Lattner return; 5810558df2da807646e65d4fa290f4e92114af1a746Chris Lattner } 5820558df2da807646e65d4fa290f4e92114af1a746Chris Lattner 5830558df2da807646e65d4fa290f4e92114af1a746Chris Lattner /* Alloc failed, search for closest match */ 5840558df2da807646e65d4fa290f4e92114af1a746Chris Lattner 5850558df2da807646e65d4fa290f4e92114af1a746Chris Lattner /* Retrieve color table entries. */ 5860558df2da807646e65d4fa290f4e92114af1a746Chris Lattner /* XXX alloca candidate. */ 5870558df2da807646e65d4fa290f4e92114af1a746Chris Lattner#ifdef XFree86Server 5880558df2da807646e65d4fa290f4e92114af1a746Chris Lattner ppixIn = (Pixel *) MALLOC(cmapSize * sizeof(Pixel)); 5890558df2da807646e65d4fa290f4e92114af1a746Chris Lattner ctable = (xrgb *) MALLOC(cmapSize * sizeof(xrgb)); 5900558df2da807646e65d4fa290f4e92114af1a746Chris Lattner for (i = 0; i < cmapSize; i++) { 5910558df2da807646e65d4fa290f4e92114af1a746Chris Lattner ppixIn[i] = i; 5920558df2da807646e65d4fa290f4e92114af1a746Chris Lattner } 5930558df2da807646e65d4fa290f4e92114af1a746Chris Lattner QueryColors(cmap, cmapSize, ppixIn, ctable); 5940558df2da807646e65d4fa290f4e92114af1a746Chris Lattner#else 5950558df2da807646e65d4fa290f4e92114af1a746Chris Lattner if (prevDisplay != dpy || prevCmap != cmap 5960558df2da807646e65d4fa290f4e92114af1a746Chris Lattner || prevCmapSize != cmapSize || !ctable) { 5970558df2da807646e65d4fa290f4e92114af1a746Chris Lattner /* free previously cached color table */ 5980558df2da807646e65d4fa290f4e92114af1a746Chris Lattner if (ctable) 599eb7f96141f754150a92433286fa385910a22f494Sam Weinig _mesa_free(ctable); 600eb7f96141f754150a92433286fa385910a22f494Sam Weinig /* Get the color table from X */ 601eb7f96141f754150a92433286fa385910a22f494Sam Weinig ctable = (XMesaColor *) MALLOC(cmapSize * sizeof(XMesaColor)); 602eb7f96141f754150a92433286fa385910a22f494Sam Weinig assert(ctable); 603eb7f96141f754150a92433286fa385910a22f494Sam Weinig for (i = 0; i < cmapSize; i++) { 604eb7f96141f754150a92433286fa385910a22f494Sam Weinig ctable[i].pixel = i; 605eb7f96141f754150a92433286fa385910a22f494Sam Weinig } 606eb7f96141f754150a92433286fa385910a22f494Sam Weinig XQueryColors(dpy, cmap, ctable, cmapSize); 607eb7f96141f754150a92433286fa385910a22f494Sam Weinig prevDisplay = dpy; 6080558df2da807646e65d4fa290f4e92114af1a746Chris Lattner prevCmap = cmap; 609b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner prevCmapSize = cmapSize; 6101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 611a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl#endif 612b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner 613b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner /* Find best match. */ 6141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump bestmatch = -1; 6158538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl mindist = 0.0; 6168538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl for (i = 0; i < cmapSize; i++) { 6171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump double dr = 0.30 * ((double) color->red - (double) ctable[i].red); 6183397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl double dg = 0.59 * ((double) color->green - (double) ctable[i].green); 619f29f0a28c4d9599b389bbb6d186e14af753dc5a3Sebastian Redl double db = 0.11 * ((double) color->blue - (double) ctable[i].blue); 62051e774d42269e3b22d746184c0b9076fc13b32e6Zhongxing Xu double dist = dr * dr + dg * dg + db * db; 621b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner if (bestmatch < 0 || dist < mindist) { 622b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner bestmatch = i; 623b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner mindist = dist; 624ab41e63821dc60ad144d0684df8d79a9eef86b75Douglas Gregor } 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; 63149b96d1a382ae9f31456166f1a734d3f7f30b992Argyrios Kyrtzidis /* 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 6367f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor if (AllocColor(cmap, 6377f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor &subColor.red, &subColor.green, &subColor.blue, 6384fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor &subColor.pixel, 639b81c17092039f39be60e9656a37cffbdf2e2c783Douglas Gregor client) == Success) { 6405b4ec636637c9d876102240127cc0dca9280e83aTed Kremenek#else 6416a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor if (XAllocColor(dpy, cmap, &subColor)) { 642a93e3b5bde9f0a7b59215f19f176f7d69881b81cSebastian Redl#endif 643320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian *alloced = 1; 6446a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor } 645b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner else { 6462f4efd10c805cb779618c1a22a35eb07b5043c4eChris Lattner /* do this to work around a problem reported by Frank Ortega */ 647b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner subColor.pixel = (unsigned long) bestmatch; 648b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner subColor.red = ctable[bestmatch].red; 649b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner subColor.green = ctable[bestmatch].green; 650b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner subColor.blue = ctable[bestmatch].blue; 651b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner subColor.flags = DoRed | DoGreen | DoBlue; 6521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump *alloced = 0; 653b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner } 6542f4efd10c805cb779618c1a22a35eb07b5043c4eChris Lattner#ifdef XFree86Server 655b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner _mesa_free(ppixIn); 656b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner _mesa_free(ctable); 657b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner#else 6586a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor /* don't free table, save it for next time */ 6596a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor#endif 6606a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor 66161d60ee6aa0a5ded0ddcf48679673b37506a1895Douglas Gregor *color = subColor; 66261d60ee6aa0a5ded0ddcf48679673b37506a1895Douglas Gregor *exact = 0; 663b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner} 664b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner 665b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner 666b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner 667b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner/** 668b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner * Do setup for PF_GRAYSCALE pixel format. 669b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner * Note that buffer may be NULL. 670b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner */ 671b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattnerstatic GLboolean 672b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattnersetup_grayscale(int client, XMesaVisual v, 673b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner XMesaBuffer buffer, XMesaColormap cmap) 674b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner{ 675b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner if (GET_VISUAL_DEPTH(v)<4 || GET_VISUAL_DEPTH(v)>16) { 676b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner return GL_FALSE; 677b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner } 678b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner 679b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner if (buffer) { 680b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner XMesaBuffer prevBuffer; 681b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner 682b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner if (!cmap) { 683a53d2cbe37e4be0d95b9d3e09f74eafae31fc940John McCall return GL_FALSE; 684d1b3c2dd5bc1f3103bee6137957aa7c5f8f2f0bcSteve Naroff } 6850ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner 6860ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner prevBuffer = xmesa_find_buffer(v->display, cmap, buffer); 6870ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner if (prevBuffer && 6880ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner (buffer->xm_visual->mesa_visual.rgbMode == 6890ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner prevBuffer->xm_visual->mesa_visual.rgbMode)) { 6900ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner /* Copy colormap stuff from previous XMesaBuffer which uses same 6910ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner * X colormap. Do this to avoid time spent in noFaultXAllocColor. 6920ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner */ 6930ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner copy_colortable_info(buffer, prevBuffer); 6940ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner } 6950ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner else { 6960ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner /* Allocate 256 shades of gray */ 6970ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner int gray; 6980ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner int colorsfailed = 0; 6990ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner for (gray=0;gray<256;gray++) { 7000ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner GLint r = gamma_adjust( v->RedGamma, gray, 255 ); 7010ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner GLint g = gamma_adjust( v->GreenGamma, gray, 255 ); 7020ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner GLint b = gamma_adjust( v->BlueGamma, gray, 255 ); 7030ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner int exact, alloced; 7040ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner XMesaColor xcol; 705b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner xcol.red = (r << 8) | r; 706b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner xcol.green = (g << 8) | g; 7070ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner xcol.blue = (b << 8) | b; 708b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner noFaultXAllocColor( client, v->display, 7090ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner cmap, GET_COLORMAP_SIZE(v), 7100ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner &xcol, &exact, &alloced ); 7110ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner if (!exact) { 7120ff8cda4442cff571aba1be91dd16f64a0bf16aaChris Lattner colorsfailed++; 71361d60ee6aa0a5ded0ddcf48679673b37506a1895Douglas Gregor } 7140558df2da807646e65d4fa290f4e92114af1a746Chris Lattner if (alloced) { 715b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner assert(buffer->num_alloced<256); 716b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner buffer->alloced_colors[buffer->num_alloced] = xcol.pixel; 717b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner buffer->num_alloced++; 718b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner } 719b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner 720e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor /*OLD 721e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor assert(gray < 576); 7221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump buffer->color_table[gray*3+0] = xcol.pixel; 723e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor buffer->color_table[gray*3+1] = xcol.pixel; 724e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor buffer->color_table[gray*3+2] = xcol.pixel; 725e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor assert(xcol.pixel < 65536); 726e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor buffer->pixel_to_r[xcol.pixel] = gray * 30 / 100; 727e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor buffer->pixel_to_g[xcol.pixel] = gray * 59 / 100; 728e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor buffer->pixel_to_b[xcol.pixel] = gray * 11 / 100; 729e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor */ 7301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump buffer->color_table[gray] = xcol.pixel; 731e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor assert(xcol.pixel < 65536); 732e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor buffer->pixel_to_r[xcol.pixel] = gray; 7331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump buffer->pixel_to_g[xcol.pixel] = gray; 734e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor buffer->pixel_to_b[xcol.pixel] = gray; 735e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor } 7361eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 737e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor if (colorsfailed && _mesa_getenv("MESA_DEBUG")) { 738e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor _mesa_warning(NULL, 739e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor "Note: %d out of 256 needed colors do not match exactly.\n", 740e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor colorsfailed ); 741e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor } 7421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 743e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor } 744e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor 745e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor v->dithered_pf = PF_Grayscale; 7461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump v->undithered_pf = PF_Grayscale; 747e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor return GL_TRUE; 748e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor} 749e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor 750e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor 751e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor 7521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/** 753e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor * Setup RGB rendering for a window with a PseudoColor, StaticColor, 754e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor * or 8-bit TrueColor visual visual. We try to allocate a palette of 225 755b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattner * colors (5 red, 9 green, 5 blue) and dither to approximate a 24-bit RGB 7563397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl * color. While this function was originally designed just for 8-bit 757a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl * visuals, it has also proven to work from 4-bit up to 16-bit visuals. 7582bec0410d268779f601bd509e0302a500af7ac6aDouglas Gregor * Dithering code contributed by Bob Mercier. 759b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor */ 760e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregorstatic GLboolean 761e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregorsetup_dithered_color(int client, XMesaVisual v, 762e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor XMesaBuffer buffer, XMesaColormap cmap) 76377f4603c8b142e642300959a601ecec2b7c8e288Sebastian Redl{ 7648538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl if (GET_VISUAL_DEPTH(v)<4 || GET_VISUAL_DEPTH(v)>16) { 7653397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl return GL_FALSE; 7663397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl } 767e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor 768e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor if (buffer) { 769e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor XMesaBuffer prevBuffer; 77077f4603c8b142e642300959a601ecec2b7c8e288Sebastian Redl 77177f4603c8b142e642300959a601ecec2b7c8e288Sebastian Redl if (!cmap) { 772e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor return GL_FALSE; 7731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 774e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor 7758538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl prevBuffer = xmesa_find_buffer(v->display, cmap, buffer); 7768538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl if (prevBuffer && 7778538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl (buffer->xm_visual->mesa_visual.rgbMode == 778e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor prevBuffer->xm_visual->mesa_visual.rgbMode)) { 779e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor /* Copy colormap stuff from previous, matching XMesaBuffer. 780e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor * Do this to avoid time spent in noFaultXAllocColor. 78177f4603c8b142e642300959a601ecec2b7c8e288Sebastian Redl */ 78277f4603c8b142e642300959a601ecec2b7c8e288Sebastian Redl copy_colortable_info(buffer, prevBuffer); 78377f4603c8b142e642300959a601ecec2b7c8e288Sebastian Redl } 7841eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump else { 785b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor /* Allocate X colors and initialize color_table[], red_table[], etc */ 786b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor int r, g, b, i; 787b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor int colorsfailed = 0; 788b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor for (r = 0; r < DITH_R; r++) { 7898538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl for (g = 0; g < DITH_G; g++) { 790b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor for (b = 0; b < DITH_B; b++) { 791b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor XMesaColor xcol; 792b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor int exact, alloced; 793b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor xcol.red =gamma_adjust(v->RedGamma, r*65535/(DITH_R-1),65535); 7941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump xcol.green=gamma_adjust(v->GreenGamma, g*65535/(DITH_G-1),65535); 79511a18f115e8974ef24e8d5bb549ed3289871efa4Kovarththanan Rajaratnam xcol.blue =gamma_adjust(v->BlueGamma, b*65535/(DITH_B-1),65535); 796b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor noFaultXAllocColor( client, v->display, 797aba54a95e9d5e4dc9056abec6bb70ea777c4a7bcKovarththanan Rajaratnam cmap, GET_COLORMAP_SIZE(v), 7981eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump &xcol, &exact, &alloced ); 799e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor if (!exact) { 800b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor colorsfailed++; 8018538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl } 802ec312a1f0557b1d27f3eb6cf49acbf7e72696422Daniel Dunbar if (alloced) { 803b64c19365deab788753d29c9bc881253c3f16f37Douglas Gregor assert(buffer->num_alloced<256); 80411a18f115e8974ef24e8d5bb549ed3289871efa4Kovarththanan Rajaratnam buffer->alloced_colors[buffer->num_alloced] = xcol.pixel; 805f7a96a39958b3f919f26764777eec948b43d74bcTed Kremenek buffer->num_alloced++; 806f7a96a39958b3f919f26764777eec948b43d74bcTed Kremenek } 8078538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl i = DITH_MIX( r, g, b ); 808f7a96a39958b3f919f26764777eec948b43d74bcTed Kremenek assert(i < 576); 809f7a96a39958b3f919f26764777eec948b43d74bcTed Kremenek buffer->color_table[i] = xcol.pixel; 810445e23e9b909ec8e21303c7dd82c90b72fc09ac4Douglas Gregor assert(xcol.pixel < 65536); 8118538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl buffer->pixel_to_r[xcol.pixel] = r * 255 / (DITH_R-1); 812f7a96a39958b3f919f26764777eec948b43d74bcTed Kremenek buffer->pixel_to_g[xcol.pixel] = g * 255 / (DITH_G-1); 813f7a96a39958b3f919f26764777eec948b43d74bcTed Kremenek buffer->pixel_to_b[xcol.pixel] = b * 255 / (DITH_B-1); 8142bec0410d268779f601bd509e0302a500af7ac6aDouglas Gregor } 8152bec0410d268779f601bd509e0302a500af7ac6aDouglas Gregor } 8162bec0410d268779f601bd509e0302a500af7ac6aDouglas Gregor } 817a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl 8180a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor if (colorsfailed && _mesa_getenv("MESA_DEBUG")) { 8190a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor _mesa_warning(NULL, 8200a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor "Note: %d out of %d needed colors do not match exactly.\n", 8210a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor colorsfailed, DITH_R * DITH_G * DITH_B ); 8220a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor } 8230a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor } 824eb5d7b752651283de5abfcc2f91df7227582a08dChandler Carruth } 8250a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor 8260a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor v->dithered_pf = PF_Dither; 8270a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor v->undithered_pf = PF_Lookup; 8280a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor return GL_TRUE; 8290a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor} 8300a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor 8310a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor 8320a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor/** 8331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump * Setup for Hewlett Packard Color Recovery 8-bit TrueColor mode. 8340a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor * HPCR simulates 24-bit color fidelity with an 8-bit frame buffer. 8350a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor * Special dithering tables have to be initialized. 83611a18f115e8974ef24e8d5bb549ed3289871efa4Kovarththanan Rajaratnam */ 837412e798941ca64e2e6b084323915fa9aa5f6bdf3Fariborz Jahanianstatic void 83811a18f115e8974ef24e8d5bb549ed3289871efa4Kovarththanan Rajaratnamsetup_8bit_hpcr(XMesaVisual v) 839412e798941ca64e2e6b084323915fa9aa5f6bdf3Fariborz Jahanian{ 8404c9d8d0eca5ca635d9a30222f690db9140e98325Fariborz Jahanian /* HP Color Recovery contributed by: Alex De Bruyn (ad@lms.be) 8411eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump * To work properly, the atom _HP_RGB_SMOOTH_MAP_LIST must be defined 8420a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor * on the root window AND the colormap obtainable by XGetRGBColormaps 8430a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor * for that atom must be set on the window. (see also tkInitWindow) 8440a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor * If that colormap is not set, the output will look stripy. 845b9e7e63ae2098bc02e79c032df0a3124d09a4b4eNate Begeman */ 8460a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor 84773482884560be041d86eccbd7dd5a6918677393bDaniel Dunbar /* Setup color tables with gamma correction */ 8480a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor int i; 8490a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor double g; 8500a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor 8510a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor g = 1.0 / v->RedGamma; 8520a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor for (i=0; i<256; i++) { 853ea5ce4705df0743093925585d8edc80e0d8fe3ffChris Lattner GLint red = IROUND_POS(255.0 * _mesa_pow( hpcr_rgbTbl[0][i]/255.0, g )); 854ea5ce4705df0743093925585d8edc80e0d8fe3ffChris Lattner v->hpcr_rgbTbl[0][i] = CLAMP( red, 16, 239 ); 855972d954bd216c86a961bb7f81c53af85de17c2f0Douglas Gregor } 8560a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor 8570a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor g = 1.0 / v->GreenGamma; 8580a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor for (i=0; i<256; i++) { 8590a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor GLint green = IROUND_POS(255.0 * _mesa_pow( hpcr_rgbTbl[1][i]/255.0, g )); 8600a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor v->hpcr_rgbTbl[1][i] = CLAMP( green, 16, 239 ); 8610a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor } 862a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner 863a4d71455f0d418e16cc0c5c5aa55a3bad3494aeeChris Lattner g = 1.0 / v->BlueGamma; 8640a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor for (i=0; i<256; i++) { 8650a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor GLint blue = IROUND_POS(255.0 * _mesa_pow( hpcr_rgbTbl[2][i]/255.0, g )); 8661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump v->hpcr_rgbTbl[2][i] = CLAMP( blue, 32, 223 ); 8670a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor } 8680a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor v->undithered_pf = PF_HPCR; /* can't really disable dithering for now */ 8690a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor v->dithered_pf = PF_HPCR; 8700a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor 8710a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor /* which method should I use to clear */ 8720a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor /* GL_FALSE: keep the ordinary method */ 8730a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor /* GL_TRUE : clear with dither pattern */ 8740a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor v->hpcr_clear_flag = _mesa_getenv("MESA_HPCR_CLEAR") ? GL_TRUE : GL_FALSE; 875a33d9b4ebf732a5da6d56fd7319ff6c020789b1cAnders Carlsson 876a33d9b4ebf732a5da6d56fd7319ff6c020789b1cAnders Carlsson if (v->hpcr_clear_flag) { 87715b91764d08e886391c865c4a444d7b51141c284Eli Friedman v->hpcr_clear_pixmap = XMesaCreatePixmap(v->display, 87815b91764d08e886391c865c4a444d7b51141c284Eli Friedman DefaultRootWindow(v->display), 879a6fda124bf380479529d6a80b84b62cacd3cb707John Thompson 16, 2, 8); 8800a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor#ifndef XFree86Server 8810a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor v->hpcr_clear_ximage = XGetImage(v->display, v->hpcr_clear_pixmap, 882ab8e281b32a3d3b9b18257d26844362bf806ecdcDaniel Dunbar 0, 0, 16, 2, AllPlanes, ZPixmap); 8830a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor#endif 884b9e7e63ae2098bc02e79c032df0a3124d09a4b4eNate Begeman } 8859c276ae0f24d4cee8f7954069d4b8eae45d0447dMike Stump} 88692f5822df6a0d7571df44b5d279ed4f017fbb0e6Anders Carlsson 887a0068fc64351db9c47916566e3b85ab733cd8d6dDouglas Gregor 8888538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl/** 8890a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor * Setup RGB rendering for a window with a True/DirectColor visual. 8900a0428e96c6f1e8bef7a481a9eb69a6f6df38951Douglas Gregor */ 89114f79002e58556798e86168c63e48d533287eda5Douglas Gregorstatic void 8924fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregorsetup_truecolor(XMesaVisual v, XMesaBuffer buffer, XMesaColormap cmap) 8934fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor{ 8944fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor unsigned long rmask, gmask, bmask; 8954fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor (void) buffer; 8964fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor (void) cmap; 8973397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl 8984fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor /* Compute red multiplier (mask) and bit shift */ 8994fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor v->rshift = 0; 9004fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor rmask = GET_REDMASK(v); 9011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump while ((rmask & 1)==0) { 9024fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor v->rshift++; 9034fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor rmask = rmask >> 1; 9044fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor } 9054fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor 9062596e429a61602312bdd149786045b8a90cd2d10Daniel Dunbar /* Compute green multiplier (mask) and bit shift */ 9074fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor v->gshift = 0; 9081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump gmask = GET_GREENMASK(v); 9091eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump while ((gmask & 1)==0) { 9104fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor v->gshift++; 9114fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor gmask = gmask >> 1; 9124fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor } 9134fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor 9144fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor /* Compute blue multiplier (mask) and bit shift */ 9154fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor v->bshift = 0; 9164fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor bmask = GET_BLUEMASK(v); 9174fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor while ((bmask & 1)==0) { 9184fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor v->bshift++; 9194fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor bmask = bmask >> 1; 9201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 9214fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor 9224fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor /* 9234fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor * Compute component-to-pixel lookup tables and dithering kernel 9241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump */ 9254fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor { 9264fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor static GLubyte kernel[16] = { 9274fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor 0*16, 8*16, 2*16, 10*16, 9284fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor 12*16, 4*16, 14*16, 6*16, 9291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3*16, 11*16, 1*16, 9*16, 9304fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor 15*16, 7*16, 13*16, 5*16, 9314fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor }; 9321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump GLint rBits = _mesa_bitcount(rmask); 9334fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor GLint gBits = _mesa_bitcount(gmask); 9344fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor GLint bBits = _mesa_bitcount(bmask); 9354fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor GLint maxBits; 9364fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor GLuint i; 9374fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor 9384fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor /* convert pixel components in [0,_mask] to RGB values in [0,255] */ 9394fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor for (i=0; i<=rmask; i++) 9404fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor v->PixelToR[i] = (unsigned char) ((i * 255) / rmask); 9414fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor for (i=0; i<=gmask; i++) 9424fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor v->PixelToG[i] = (unsigned char) ((i * 255) / gmask); 9434fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor for (i=0; i<=bmask; i++) 9444fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor v->PixelToB[i] = (unsigned char) ((i * 255) / bmask); 9454fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor 9463397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl /* convert RGB values from [0,255] to pixel components */ 947a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl 9484fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor for (i=0;i<256;i++) { 9494fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor GLint r = gamma_adjust(v->RedGamma, i, 255); 9503397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl GLint g = gamma_adjust(v->GreenGamma, i, 255); 9514fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor GLint b = gamma_adjust(v->BlueGamma, i, 255); 9521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump v->RtoPixel[i] = (r >> (8-rBits)) << v->rshift; 9534fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor v->GtoPixel[i] = (g >> (8-gBits)) << v->gshift; 954e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor v->BtoPixel[i] = (b >> (8-bBits)) << v->bshift; 955e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor } 956e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor /* overflow protection */ 957e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor for (i=256;i<512;i++) { 9581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump v->RtoPixel[i] = v->RtoPixel[255]; 9594fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor v->GtoPixel[i] = v->GtoPixel[255]; 9601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump v->BtoPixel[i] = v->BtoPixel[255]; 9614fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor } 9624fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor 9634fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor /* setup dithering kernel */ 9644fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor maxBits = rBits; 9654fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor if (gBits > maxBits) maxBits = gBits; 9664fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor if (bBits > maxBits) maxBits = bBits; 9674fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor for (i=0;i<16;i++) { 9684fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor v->Kernel[i] = kernel[i] >> maxBits; 9694fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor } 9704fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor 9714fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor v->undithered_pf = PF_Truecolor; 9728538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl v->dithered_pf = (GET_VISUAL_DEPTH(v)<24) ? PF_Dither_True : PF_Truecolor; 9734fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor } 9744fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor 9754fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor /* 9764fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor * Now check for TrueColor visuals which we can optimize. 9774fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor */ 9784fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor if ( GET_REDMASK(v) ==0x0000ff 9794fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor && GET_GREENMASK(v)==0x00ff00 9808538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl && GET_BLUEMASK(v) ==0xff0000 9814fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor && CHECK_BYTE_ORDER(v) 9824fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor && v->BitsPerPixel==32 983ec312a1f0557b1d27f3eb6cf49acbf7e72696422Daniel Dunbar && v->RedGamma==1.0 && v->GreenGamma==1.0 && v->BlueGamma==1.0) { 9844fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor /* common 32 bpp config used on SGI, Sun */ 9854fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor v->undithered_pf = v->dithered_pf = PF_8A8B8G8R; /* ABGR */ 9864fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor } 98714f79002e58556798e86168c63e48d533287eda5Douglas Gregor else if (GET_REDMASK(v) == 0xff0000 98814f79002e58556798e86168c63e48d533287eda5Douglas Gregor && GET_GREENMASK(v)== 0x00ff00 98914f79002e58556798e86168c63e48d533287eda5Douglas Gregor && GET_BLUEMASK(v) == 0x0000ff 99014f79002e58556798e86168c63e48d533287eda5Douglas Gregor && CHECK_BYTE_ORDER(v) 99114f79002e58556798e86168c63e48d533287eda5Douglas Gregor && v->RedGamma == 1.0 && v->GreenGamma == 1.0 && v->BlueGamma == 1.0){ 992c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor if (v->BitsPerPixel==32) { 99314f79002e58556798e86168c63e48d533287eda5Douglas Gregor /* if 32 bpp, and visual indicates 8 bpp alpha channel */ 99414f79002e58556798e86168c63e48d533287eda5Douglas Gregor if (GET_VISUAL_DEPTH(v) == 32 && v->mesa_visual.alphaBits == 8) 9958538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl v->undithered_pf = v->dithered_pf = PF_8A8R8G8B; /* ARGB */ 99614f79002e58556798e86168c63e48d533287eda5Douglas Gregor else 99714f79002e58556798e86168c63e48d533287eda5Douglas Gregor v->undithered_pf = v->dithered_pf = PF_8R8G8B; /* xRGB */ 99814f79002e58556798e86168c63e48d533287eda5Douglas Gregor } 99914f79002e58556798e86168c63e48d533287eda5Douglas Gregor else if (v->BitsPerPixel == 24) { 10002d52be56ff595341be3c6cec337af6763804ce66Douglas Gregor v->undithered_pf = v->dithered_pf = PF_8R8G8B24; /* RGB */ 10012d52be56ff595341be3c6cec337af6763804ce66Douglas Gregor } 10022d52be56ff595341be3c6cec337af6763804ce66Douglas Gregor } 100312fab31aa5868b1a6b52246b5a87daa48a338fe2Douglas Gregor else if (GET_REDMASK(v) ==0xf800 100412fab31aa5868b1a6b52246b5a87daa48a338fe2Douglas Gregor && GET_GREENMASK(v)==0x07e0 100512fab31aa5868b1a6b52246b5a87daa48a338fe2Douglas Gregor && GET_BLUEMASK(v) ==0x001f 100612fab31aa5868b1a6b52246b5a87daa48a338fe2Douglas Gregor && CHECK_BYTE_ORDER(v) 100712fab31aa5868b1a6b52246b5a87daa48a338fe2Douglas Gregor && v->BitsPerPixel==16 100814f79002e58556798e86168c63e48d533287eda5Douglas Gregor && v->RedGamma==1.0 && v->GreenGamma==1.0 && v->BlueGamma==1.0) { 1009c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor /* 5-6-5 RGB */ 101014f79002e58556798e86168c63e48d533287eda5Douglas Gregor v->undithered_pf = PF_5R6G5B; 101114f79002e58556798e86168c63e48d533287eda5Douglas Gregor v->dithered_pf = PF_Dither_5R6G5B; 101214f79002e58556798e86168c63e48d533287eda5Douglas Gregor } 101314f79002e58556798e86168c63e48d533287eda5Douglas Gregor else if (GET_REDMASK(v) ==0xe0 1014c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor && GET_GREENMASK(v)==0x1c 101514f79002e58556798e86168c63e48d533287eda5Douglas Gregor && GET_BLUEMASK(v) ==0x03 101614f79002e58556798e86168c63e48d533287eda5Douglas Gregor && CHECK_FOR_HPCR(v)) { 10178538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl /* 8-bit HP color recovery */ 101814f79002e58556798e86168c63e48d533287eda5Douglas Gregor setup_8bit_hpcr( v ); 101914f79002e58556798e86168c63e48d533287eda5Douglas Gregor } 102014f79002e58556798e86168c63e48d533287eda5Douglas Gregor} 102114f79002e58556798e86168c63e48d533287eda5Douglas Gregor 102214f79002e58556798e86168c63e48d533287eda5Douglas Gregor 1023c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor 102414f79002e58556798e86168c63e48d533287eda5Douglas Gregor/** 102514f79002e58556798e86168c63e48d533287eda5Douglas Gregor * Setup RGB rendering for a window with a monochrome visual. 102614f79002e58556798e86168c63e48d533287eda5Douglas Gregor */ 102714f79002e58556798e86168c63e48d533287eda5Douglas Gregorstatic void 1028c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregorsetup_monochrome( XMesaVisual v, XMesaBuffer b ) 102914f79002e58556798e86168c63e48d533287eda5Douglas Gregor{ 103014f79002e58556798e86168c63e48d533287eda5Douglas Gregor (void) b; 10318538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl v->dithered_pf = v->undithered_pf = PF_1Bit; 103214f79002e58556798e86168c63e48d533287eda5Douglas Gregor /* if black=1 then we must flip pixel values */ 1033c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor v->bitFlip = (GET_BLACK_PIXEL(v) != 0); 103414f79002e58556798e86168c63e48d533287eda5Douglas Gregor} 103514f79002e58556798e86168c63e48d533287eda5Douglas Gregor 103614f79002e58556798e86168c63e48d533287eda5Douglas Gregor 103714f79002e58556798e86168c63e48d533287eda5Douglas Gregor 1038c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor/** 103914f79002e58556798e86168c63e48d533287eda5Douglas Gregor * When a context is bound for the first time, we can finally finish 104014f79002e58556798e86168c63e48d533287eda5Douglas Gregor * initializing the context's visual and buffer information. 10418538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl * \param v the XMesaVisual to initialize 104214f79002e58556798e86168c63e48d533287eda5Douglas Gregor * \param b the XMesaBuffer to initialize (may be NULL) 104314f79002e58556798e86168c63e48d533287eda5Douglas Gregor * \param rgb_flag TRUE = RGBA mode, FALSE = color index mode 104414f79002e58556798e86168c63e48d533287eda5Douglas Gregor * \param window the window/pixmap we're rendering into 104514f79002e58556798e86168c63e48d533287eda5Douglas Gregor * \param cmap the colormap associated with the window/pixmap 1046f60e9918690fcf02974bc1ebecd42c99d561855eDouglas Gregor * \return GL_TRUE=success, GL_FALSE=failure 1047c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor */ 104814f79002e58556798e86168c63e48d533287eda5Douglas Gregorstatic GLboolean 104914f79002e58556798e86168c63e48d533287eda5Douglas Gregorinitialize_visual_and_buffer(XMesaVisual v, XMesaBuffer b, 105014f79002e58556798e86168c63e48d533287eda5Douglas Gregor GLboolean rgb_flag, XMesaDrawable window, 105114f79002e58556798e86168c63e48d533287eda5Douglas Gregor XMesaColormap cmap) 105214f79002e58556798e86168c63e48d533287eda5Douglas Gregor{ 105314f79002e58556798e86168c63e48d533287eda5Douglas Gregor int client = 0; 105414f79002e58556798e86168c63e48d533287eda5Douglas Gregor 105514f79002e58556798e86168c63e48d533287eda5Douglas Gregor#ifdef XFree86Server 105614f79002e58556798e86168c63e48d533287eda5Douglas Gregor client = (window) ? CLIENT_ID(window->id) : 0; 105714f79002e58556798e86168c63e48d533287eda5Douglas Gregor#endif 1058a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl 1059e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor ASSERT(!b || b->xm_visual == v); 1060e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor 10617f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor /* Save true bits/pixel */ 10627f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor v->BitsPerPixel = bits_per_pixel(v); 1063f04ad69fed38d26fc0d6f7d6fd0a4631ddfbc7feChris Lattner assert(v->BitsPerPixel > 0); 10648538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl 106514f79002e58556798e86168c63e48d533287eda5Douglas Gregor if (rgb_flag == GL_FALSE) { 106614f79002e58556798e86168c63e48d533287eda5Douglas Gregor /* COLOR-INDEXED WINDOW: 1067828e18cd80319c67b9b9776d1ed5411161d9f0bfChris Lattner * Even if the visual is TrueColor or DirectColor we treat it as 1068828e18cd80319c67b9b9776d1ed5411161d9f0bfChris Lattner * being color indexed. This is weird but might be useful to someone. 1069828e18cd80319c67b9b9776d1ed5411161d9f0bfChris Lattner */ 1070828e18cd80319c67b9b9776d1ed5411161d9f0bfChris Lattner v->dithered_pf = v->undithered_pf = PF_Index; 10717f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor v->mesa_visual.indexBits = GET_VISUAL_DEPTH(v); 10727f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor } 10737f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor else { 10747f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor /* RGB WINDOW: 10757f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor * We support RGB rendering into almost any kind of visual. 10767f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor */ 10777f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor const int xclass = v->mesa_visual.visualType; 10787f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor if (xclass == GLX_TRUE_COLOR || xclass == GLX_DIRECT_COLOR) { 10797f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor setup_truecolor( v, b, cmap ); 10807f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor } 1081e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor else if (xclass == GLX_STATIC_GRAY && GET_VISUAL_DEPTH(v) == 1) { 10827f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor setup_monochrome( v, b ); 10837f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor } 10847f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor else if (xclass == GLX_GRAY_SCALE || xclass == GLX_STATIC_GRAY) { 10857f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor if (!setup_grayscale( client, v, b, cmap )) { 10867f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor return GL_FALSE; 10871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 10887f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor } 10897f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor else if ((xclass == GLX_PSEUDO_COLOR || xclass == GLX_STATIC_COLOR) 10907f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor && GET_VISUAL_DEPTH(v)>=4 && GET_VISUAL_DEPTH(v)<=16) { 10917f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor if (!setup_dithered_color( client, v, b, cmap )) { 10927f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor return GL_FALSE; 10931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 10947f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor } 10957f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor else { 10961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump _mesa_warning(NULL, "XMesa: RGB mode rendering not supported in given visual.\n"); 10977f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor return GL_FALSE; 10987f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor } 10997f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor v->mesa_visual.indexBits = 0; 11007f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor 11017f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor if (_mesa_getenv("MESA_NO_DITHER")) { 11027f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor v->dithered_pf = v->undithered_pf; 11037f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor } 11047f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor } 11057f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor 11068538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl 11077f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor /* 11087f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor * If MESA_INFO env var is set print out some debugging info 110914f79002e58556798e86168c63e48d533287eda5Douglas Gregor * which can help Brian figure out what's going on when a user 111014f79002e58556798e86168c63e48d533287eda5Douglas Gregor * reports bugs. 1111090d9b53e32bb30d9e74de895bb59b409bd49e00Chris Lattner */ 11127f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor if (_mesa_getenv("MESA_INFO")) { 11130fa7d0b15ea2a224bfe43ac745d411f915da87ddSebastian Redl _mesa_printf("X/Mesa visual = %p\n", (void *) v); 11140fa7d0b15ea2a224bfe43ac745d411f915da87ddSebastian Redl _mesa_printf("X/Mesa dithered pf = %u\n", v->dithered_pf); 11150fa7d0b15ea2a224bfe43ac745d411f915da87ddSebastian Redl _mesa_printf("X/Mesa undithered pf = %u\n", v->undithered_pf); 11160fa7d0b15ea2a224bfe43ac745d411f915da87ddSebastian Redl _mesa_printf("X/Mesa level = %d\n", v->mesa_visual.level); 1117bdfe48ac80573e026595af91e541474dbf02565fDouglas Gregor _mesa_printf("X/Mesa depth = %d\n", GET_VISUAL_DEPTH(v)); 1118bdfe48ac80573e026595af91e541474dbf02565fDouglas Gregor _mesa_printf("X/Mesa bits per pixel = %d\n", v->BitsPerPixel); 111911a18f115e8974ef24e8d5bb549ed3289871efa4Kovarththanan Rajaratnam } 11207f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor 11217f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor if (b && window) { 11227f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor char *data; 112314f79002e58556798e86168c63e48d533287eda5Douglas Gregor 112414f79002e58556798e86168c63e48d533287eda5Douglas Gregor /* Do window-specific initializations */ 112514f79002e58556798e86168c63e48d533287eda5Douglas Gregor 112614f79002e58556798e86168c63e48d533287eda5Douglas Gregor /* these should have been set in create_xmesa_buffer */ 11278538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl ASSERT(b->frontxrb->drawable == window); 112814f79002e58556798e86168c63e48d533287eda5Douglas Gregor ASSERT(b->frontxrb->pixmap == (XMesaPixmap) window); 11298538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl 113014f79002e58556798e86168c63e48d533287eda5Douglas Gregor /* Setup for single/double buffering */ 11318538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl if (v->mesa_visual.doubleBufferMode) { 11327f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor /* Double buffered */ 113314f79002e58556798e86168c63e48d533287eda5Douglas Gregor b->shm = check_for_xshm( v->display ); 113414f79002e58556798e86168c63e48d533287eda5Douglas Gregor } 113514f79002e58556798e86168c63e48d533287eda5Douglas Gregor 113614f79002e58556798e86168c63e48d533287eda5Douglas Gregor /* X11 graphics contexts */ 113714f79002e58556798e86168c63e48d533287eda5Douglas Gregor#ifdef XFree86Server 113814f79002e58556798e86168c63e48d533287eda5Douglas Gregor b->gc = CreateScratchGC(v->display, window->depth); 113914f79002e58556798e86168c63e48d533287eda5Douglas Gregor#else 1140bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregor b->gc = XCreateGC( v->display, window, 0, NULL ); 114114f79002e58556798e86168c63e48d533287eda5Douglas Gregor#endif 114214f79002e58556798e86168c63e48d533287eda5Douglas Gregor XMesaSetFunction( v->display, b->gc, GXcopy ); 114314f79002e58556798e86168c63e48d533287eda5Douglas Gregor 114414f79002e58556798e86168c63e48d533287eda5Douglas Gregor /* cleargc - for glClear() */ 114514f79002e58556798e86168c63e48d533287eda5Douglas Gregor#ifdef XFree86Server 11461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump b->cleargc = CreateScratchGC(v->display, window->depth); 11472d52be56ff595341be3c6cec337af6763804ce66Douglas Gregor#else 11482d52be56ff595341be3c6cec337af6763804ce66Douglas Gregor b->cleargc = XCreateGC( v->display, window, 0, NULL ); 11492d52be56ff595341be3c6cec337af6763804ce66Douglas Gregor#endif 11502d52be56ff595341be3c6cec337af6763804ce66Douglas Gregor XMesaSetFunction( v->display, b->cleargc, GXcopy ); 115112fab31aa5868b1a6b52246b5a87daa48a338fe2Douglas Gregor 115212fab31aa5868b1a6b52246b5a87daa48a338fe2Douglas Gregor /* 115312fab31aa5868b1a6b52246b5a87daa48a338fe2Douglas Gregor * Don't generate Graphics Expose/NoExpose events in swapbuffers(). 115412fab31aa5868b1a6b52246b5a87daa48a338fe2Douglas Gregor * Patch contributed by Michael Pichler May 15, 1995. 115512fab31aa5868b1a6b52246b5a87daa48a338fe2Douglas Gregor */ 115612fab31aa5868b1a6b52246b5a87daa48a338fe2Douglas Gregor#ifdef XFree86Server 115712fab31aa5868b1a6b52246b5a87daa48a338fe2Douglas Gregor b->swapgc = CreateScratchGC(v->display, window->depth); 115812fab31aa5868b1a6b52246b5a87daa48a338fe2Douglas Gregor { 115912fab31aa5868b1a6b52246b5a87daa48a338fe2Douglas Gregor CARD32 v[1]; 116012fab31aa5868b1a6b52246b5a87daa48a338fe2Douglas Gregor v[0] = FALSE; 1161e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor dixChangeGC(NullClient, b->swapgc, GCGraphicsExposures, v, NULL); 1162e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor } 1163e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor#else 116411a18f115e8974ef24e8d5bb549ed3289871efa4Kovarththanan Rajaratnam { 1165aba54a95e9d5e4dc9056abec6bb70ea777c4a7bcKovarththanan Rajaratnam XGCValues gcvalues; 11661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump gcvalues.graphics_exposures = False; 1167e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor b->swapgc = XCreateGC(v->display, window, 1168ec312a1f0557b1d27f3eb6cf49acbf7e72696422Daniel Dunbar GCGraphicsExposures, &gcvalues); 11697f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor } 11707f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor#endif 11717f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor XMesaSetFunction( v->display, b->swapgc, GXcopy ); 11727f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor /* 11730fa7d0b15ea2a224bfe43ac745d411f915da87ddSebastian Redl * Set fill style and tile pixmap once for all for HPCR stuff 117414f79002e58556798e86168c63e48d533287eda5Douglas Gregor * (instead of doing it each time in clear_color_HPCR_pixmap()) 117514f79002e58556798e86168c63e48d533287eda5Douglas Gregor * Initialize whole stuff 117614f79002e58556798e86168c63e48d533287eda5Douglas Gregor * Patch contributed by Jacques Leroy March 8, 1998. 117714f79002e58556798e86168c63e48d533287eda5Douglas Gregor */ 117814f79002e58556798e86168c63e48d533287eda5Douglas Gregor if (v->hpcr_clear_flag && b->backxrb && b->backxrb->pixmap) { 117914f79002e58556798e86168c63e48d533287eda5Douglas Gregor int i; 118014f79002e58556798e86168c63e48d533287eda5Douglas Gregor for (i = 0; i < 16; i++) { 118136c35ba0aca641e60e5dbee8efbc620c08b9bd61Douglas Gregor XMesaPutPixel(v->hpcr_clear_ximage, i, 0, 0); 1182e127a0d80155b45dafe77f2b4380e5fa111a3345Chris Lattner XMesaPutPixel(v->hpcr_clear_ximage, i, 1, 0); 118314f79002e58556798e86168c63e48d533287eda5Douglas Gregor } 1184ec312a1f0557b1d27f3eb6cf49acbf7e72696422Daniel Dunbar XMesaPutImage(b->display, (XMesaDrawable) v->hpcr_clear_pixmap, 1185ec312a1f0557b1d27f3eb6cf49acbf7e72696422Daniel Dunbar b->cleargc, v->hpcr_clear_ximage, 0, 0, 0, 0, 16, 2); 118614f79002e58556798e86168c63e48d533287eda5Douglas Gregor XMesaSetFillStyle( v->display, b->cleargc, FillTiled); 11878538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl XMesaSetTile( v->display, b->cleargc, v->hpcr_clear_pixmap ); 1188c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor } 1189ec312a1f0557b1d27f3eb6cf49acbf7e72696422Daniel Dunbar 1190ec312a1f0557b1d27f3eb6cf49acbf7e72696422Daniel Dunbar /* Initialize the row buffer XImage for use in write_color_span() */ 11917f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor data = (char*) MALLOC(MAX_WIDTH*4); 11927f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor#ifdef XFree86Server 11930fa7d0b15ea2a224bfe43ac745d411f915da87ddSebastian Redl b->rowimage = XMesaCreateImage(GET_VISUAL_DEPTH(v), MAX_WIDTH, 1, data); 119414f79002e58556798e86168c63e48d533287eda5Douglas Gregor#else 119514f79002e58556798e86168c63e48d533287eda5Douglas Gregor b->rowimage = XCreateImage( v->display, 119614f79002e58556798e86168c63e48d533287eda5Douglas Gregor v->visinfo->visual, 119714f79002e58556798e86168c63e48d533287eda5Douglas Gregor v->visinfo->depth, 119814f79002e58556798e86168c63e48d533287eda5Douglas Gregor ZPixmap, 0, /*format, offset*/ 119914f79002e58556798e86168c63e48d533287eda5Douglas Gregor data, /*data*/ 120014f79002e58556798e86168c63e48d533287eda5Douglas Gregor MAX_WIDTH, 1, /*width, height*/ 120114f79002e58556798e86168c63e48d533287eda5Douglas Gregor 32, /*bitmap_pad*/ 1202f60e9918690fcf02974bc1ebecd42c99d561855eDouglas Gregor 0 /*bytes_per_line*/ ); 1203f60e9918690fcf02974bc1ebecd42c99d561855eDouglas Gregor#endif 1204bdfe48ac80573e026595af91e541474dbf02565fDouglas Gregor if (!b->rowimage) 1205bdfe48ac80573e026595af91e541474dbf02565fDouglas Gregor return GL_FALSE; 1206f60e9918690fcf02974bc1ebecd42c99d561855eDouglas Gregor } 1207c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor 120814f79002e58556798e86168c63e48d533287eda5Douglas Gregor return GL_TRUE; 120914f79002e58556798e86168c63e48d533287eda5Douglas Gregor} 121014f79002e58556798e86168c63e48d533287eda5Douglas Gregor 12117f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor 1212bd94500d3aa60092fb0f1e90f53fb0d03fa502a8Douglas Gregor 12137f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor/* 12147f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor * Convert an RGBA color to a pixel value. 12152eafc1b56347f772729e082e6bac824b0ef1b585Douglas Gregor */ 12163397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redlunsigned long 12177f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregorxmesa_color_to_pixel(GLcontext *ctx, 12187f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor GLubyte r, GLubyte g, GLubyte b, GLubyte a, 12197f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor GLuint pixelFormat) 12208538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl{ 12217f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor XMesaContext xmesa = XMESA_CONTEXT(ctx); 12227f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor switch (pixelFormat) { 12237f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor case PF_Index: 12247f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor return 0; 12251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump case PF_Truecolor: 12267f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor { 12278538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl unsigned long p; 12287f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor PACK_TRUECOLOR( p, r, g, b ); 12297f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor return p; 12307f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor } 1231ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl case PF_8A8B8G8R: 1232090d9b53e32bb30d9e74de895bb59b409bd49e00Chris Lattner return PACK_8A8B8G8R( r, g, b, a ); 12337f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor case PF_8A8R8G8B: 12343397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl return PACK_8A8R8G8B( r, g, b, a ); 12357f94b0b0c6791013d2f72ced9b4bedd3b23673a6Douglas Gregor case PF_8R8G8B: 12368538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl /* fall through */ 123714f79002e58556798e86168c63e48d533287eda5Douglas Gregor case PF_8R8G8B24: 123814f79002e58556798e86168c63e48d533287eda5Douglas Gregor return PACK_8R8G8B( r, g, b ); 12394fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor case PF_5R6G5B: 12404fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor return PACK_5R6G5B( r, g, b ); 12414fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor case PF_Dither: 12424fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor { 12430b1fb988012da21d996c43e36867787a7a07b889Chris Lattner DITHER_SETUP; 12440b1fb988012da21d996c43e36867787a7a07b889Chris Lattner return DITHER( 1, 0, r, g, b ); 12450b1fb988012da21d996c43e36867787a7a07b889Chris Lattner } 1246a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl case PF_1Bit: 12477c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner /* 382 = (3*255)/2 */ 12487c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner return ((r+g+b) > 382) ^ xmesa->xm_visual->bitFlip; 1249c1f9d828c733ec1eba06d01070735d1f36fda733Chris Lattner case PF_HPCR: 1250c1f9d828c733ec1eba06d01070735d1f36fda733Chris Lattner return DITHER_HPCR(1, 1, r, g, b); 1251c1f9d828c733ec1eba06d01070735d1f36fda733Chris Lattner case PF_Lookup: 12528538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl { 1253c1f9d828c733ec1eba06d01070735d1f36fda733Chris Lattner LOOKUP_SETUP; 12542eafc1b56347f772729e082e6bac824b0ef1b585Douglas Gregor return LOOKUP( r, g, b ); 12552eafc1b56347f772729e082e6bac824b0ef1b585Douglas Gregor } 12562eafc1b56347f772729e082e6bac824b0ef1b585Douglas Gregor case PF_Grayscale: 12578538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl return GRAY_RGB( r, g, b ); 12581eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump case PF_Dither_True: 12593397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl /* fall through */ 12602eafc1b56347f772729e082e6bac824b0ef1b585Douglas Gregor case PF_Dither_5R6G5B: 12612eafc1b56347f772729e082e6bac824b0ef1b585Douglas Gregor { 12622eafc1b56347f772729e082e6bac824b0ef1b585Douglas Gregor unsigned long p; 12631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump PACK_TRUEDITHER(p, 1, 0, r, g, b); 12647c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner return p; 12657c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner } 12666a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor default: 12677c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner _mesa_problem(ctx, "Bad pixel format in xmesa_color_to_pixel"); 12687c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner } 126942d42b5b84603032e57add333b5b44e0ef99bd9eChris Lattner return 0; 127042d42b5b84603032e57add333b5b44e0ef99bd9eChris Lattner} 12717c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner 12727c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner 12733397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl#define NUM_VISUAL_TYPES 6 12747c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner 12753397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl/** 12763c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl * Convert an X visual type to a GLX visual type. 12777c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner * 12787c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner * \param visualType X visual type (i.e., \c TrueColor, \c StaticGray, etc.) 12797356a31327be9b3c3434a0c88746028980da5684Chris Lattner * to be converted. 128037e2684abfe38207fdb90620da062bb18c23f29aDouglas Gregor * \return If \c visualType is a valid X visual type, a GLX visual type will 12817c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner * be returned. Otherwise \c GLX_NONE will be returned. 12827c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner * 12831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump * \note 12847c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner * This code was lifted directly from lib/GL/glx/glcontextmodes.c in the 12857c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner * DRI CVS tree. 12868538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl */ 12877c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattnerstatic GLint 12888538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redlxmesa_convert_from_x_visual_type( int visualType ) 12891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump{ 12907c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner static const int glx_visual_types[ NUM_VISUAL_TYPES ] = { 12917c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner GLX_STATIC_GRAY, GLX_GRAY_SCALE, 12927c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner GLX_STATIC_COLOR, GLX_PSEUDO_COLOR, 12937c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner GLX_TRUE_COLOR, GLX_DIRECT_COLOR 12947c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner }; 12957356a31327be9b3c3434a0c88746028980da5684Chris Lattner 12967c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner return ( (unsigned) visualType < NUM_VISUAL_TYPES ) 12976a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor ? glx_visual_types[ visualType ] : GLX_NONE; 12986a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor} 12996a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor 13006a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor 13016a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor/**********************************************************************/ 13026a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor/***** Public Functions *****/ 1303c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor/**********************************************************************/ 13047c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner 1305f04ad69fed38d26fc0d6f7d6fd0a4631ddfbc7feChris Lattner 1306df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner#ifdef IN_DRI_DRIVER 1307df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner#define need_GL_VERSION_1_3 1308df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner#define need_GL_VERSION_1_4 1309df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner#define need_GL_VERSION_1_5 1310df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner#define need_GL_VERSION_2_0 1311df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner 13121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/* sw extensions for imaging */ 1313df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner#define need_GL_EXT_blend_color 1314df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner#define need_GL_EXT_blend_minmax 1315df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner#define need_GL_EXT_convolution 1316df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner#define need_GL_EXT_histogram 1317df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner#define need_GL_SGI_color_table 13187356a31327be9b3c3434a0c88746028980da5684Chris Lattner 13191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump/* sw extensions not associated with some GL version */ 1320df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner#define need_GL_ARB_draw_elements_base_vertex 1321df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner#define need_GL_ARB_shader_objects 1322df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner#define need_GL_ARB_sync 1323df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner#define need_GL_ARB_vertex_program 13241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump#define need_GL_APPLE_vertex_array_object 13258538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl#define need_GL_ATI_fragment_shader 1326df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner#define need_GL_EXT_depth_bounds_test 1327df961c28f84666051ad59d2da1f44023f6366d02Chris Lattner#define need_GL_EXT_framebuffer_object 132837e2684abfe38207fdb90620da062bb18c23f29aDouglas Gregor#define need_GL_EXT_framebuffer_blit 13297c5d24efcd2e505b5739f7def08dfe25ce59a1b2Chris Lattner#define need_GL_EXT_gpu_program_parameters 13306a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor#define need_GL_EXT_paletted_texture 13316a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor#define need_GL_MESA_resize_buffers 13326a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor#define need_GL_NV_vertex_program 13336a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor#define need_GL_NV_fragment_program 13346a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor 13356a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor#include "extension_helper.h" 13366a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor#include "utils.h" 13376a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor 13386a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregorconst struct dri_extension card_extensions[] = 13396a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor{ 13406a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor { "GL_VERSION_1_3", GL_VERSION_1_3_functions }, 13416a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor { "GL_VERSION_1_4", GL_VERSION_1_4_functions }, 13426a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor { "GL_VERSION_1_5", GL_VERSION_1_5_functions }, 13436a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor { "GL_VERSION_2_0", GL_VERSION_2_0_functions }, 13448538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl 13456a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor { "GL_EXT_blend_color", GL_EXT_blend_color_functions }, 13466a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor { "GL_EXT_blend_minmax", GL_EXT_blend_minmax_functions }, 13476a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor { "GL_EXT_convolution", GL_EXT_convolution_functions }, 13486a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor { "GL_EXT_histogram", GL_EXT_histogram_functions }, 13496a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor { "GL_SGI_color_table", GL_SGI_color_table_functions }, 13508538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl 13516a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor { "GL_ARB_depth_clamp", NULL }, 13526a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor { "GL_ARB_draw_elements_base_vertex", GL_ARB_draw_elements_base_vertex_functions }, 13536a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor { "GL_ARB_shader_objects", GL_ARB_shader_objects_functions }, 13546a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor { "GL_ARB_sync", GL_ARB_sync_functions }, 13556a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor { "GL_ARB_vertex_program", GL_ARB_vertex_program_functions }, 13566a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor { "GL_APPLE_vertex_array_object", GL_APPLE_vertex_array_object_functions }, 13576a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor { "GL_ATI_fragment_shader", GL_ATI_fragment_shader_functions }, 13586a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor { "GL_EXT_depth_bounds_test", GL_EXT_depth_bounds_test_functions }, 13596a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor { "GL_EXT_framebuffer_object", GL_EXT_framebuffer_object_functions }, 13606a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor { "GL_EXT_framebuffer_blit", GL_EXT_framebuffer_blit_functions }, 13616a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor { "GL_EXT_gpu_program_parameters", GL_EXT_gpu_program_parameters_functions }, 13626a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor { "GL_EXT_paletted_texture", GL_EXT_paletted_texture_functions }, 13636a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor { "GL_MESA_resize_buffers", GL_MESA_resize_buffers_functions }, 13646a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor { "GL_NV_depth_clamp", NULL }, 13658538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl { "GL_NV_vertex_program", GL_NV_vertex_program_functions }, 13666a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor { "GL_NV_fragment_program", GL_NV_fragment_program_functions }, 13676a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor { NULL, NULL } 13686a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor}; 13696a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor#endif 13706a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor 1371c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor/* 13726a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor * Create a new X/Mesa visual. 13736a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor * Input: display - X11 display 13746a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor * visinfo - an XVisualInfo pointer 13756a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor * rgb_flag - GL_TRUE = RGB mode, 13766a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor * GL_FALSE = color index mode 13776a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor * alpha_flag - alpha buffer requested? 13788538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl * db_flag - GL_TRUE = double-buffered, 13796a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor * GL_FALSE = single buffered 13806a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor * stereo_flag - stereo visual? 13816a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor * ximage_flag - GL_TRUE = use an XImage for back buffer, 13826a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor * GL_FALSE = use an off-screen pixmap for back buffer 13836a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor * depth_size - requested bits/depth values, or zero 13846a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor * stencil_size - requested bits/stencil values, or zero 13858538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl * accum_red_size - requested bits/red accum values, or zero 13866a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor * accum_green_size - requested bits/green accum values, or zero 13876a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor * accum_blue_size - requested bits/blue accum values, or zero 13886a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor * accum_alpha_size - requested bits/alpha accum values, or zero 1389ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl * num_samples - number of samples/pixel if multisampling, or zero 13906a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor * level - visual level, usually 0 13916a5a23f8e7fb65e028c8092bc1d1a1d9dfe2e9bcDouglas Gregor * visualCaveat - ala the GLX extension, usually GLX_NONE 13920b1fb988012da21d996c43e36867787a7a07b889Chris Lattner * Return; a new XMesaVisual or 0 if error. 13930b1fb988012da21d996c43e36867787a7a07b889Chris Lattner */ 13944fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas GregorPUBLIC 13954fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas GregorXMesaVisual XMesaCreateVisual( XMesaDisplay *display, 13964fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor XMesaVisualInfo visinfo, 13970b1fb988012da21d996c43e36867787a7a07b889Chris Lattner GLboolean rgb_flag, 13983397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl GLboolean alpha_flag, 1399a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl GLboolean db_flag, 140001b81c4d074bba9c18372d521405dfe32fc4f552Argyrios Kyrtzidis GLboolean stereo_flag, 1401c8e5d51f51e46c6f7717761537c6609ef9daf57cArgyrios Kyrtzidis GLboolean ximage_flag, 1402c8e5d51f51e46c6f7717761537c6609ef9daf57cArgyrios Kyrtzidis GLint depth_size, 14031eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump GLint stencil_size, 14042cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor GLint accum_red_size, 1405c8e5d51f51e46c6f7717761537c6609ef9daf57cArgyrios Kyrtzidis GLint accum_green_size, 1406681d7237e1014bf64dd5ead6bf74ae55cdd19e61Sebastian Redl GLint accum_blue_size, 1407c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor GLint accum_alpha_size, 1408681d7237e1014bf64dd5ead6bf74ae55cdd19e61Sebastian Redl GLint num_samples, 1409681d7237e1014bf64dd5ead6bf74ae55cdd19e61Sebastian Redl GLint level, 1410681d7237e1014bf64dd5ead6bf74ae55cdd19e61Sebastian Redl GLint visualCaveat ) 14112cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor{ 14122cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor char *gamma; 14132cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor XMesaVisual v; 14141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump GLint red_bits, green_bits, blue_bits, alpha_bits; 14152cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 14163397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl#ifdef IN_DRI_DRIVER 14170953e767ff7817f97b3ab20896b229891eeff45bJohn McCall /* driInitExtensions() should be called once per screen to setup extension 1418a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor * indices. There is no need to call it when the context is created since 1419a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor * XMesa enables mesa sw extensions on its own. 1420a4923eb7c4b04d360cb2747641a5e92818edf804Douglas Gregor */ 14210953e767ff7817f97b3ab20896b229891eeff45bJohn McCall driInitExtensions( NULL, card_extensions, GL_FALSE ); 14228538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl#endif 14230953e767ff7817f97b3ab20896b229891eeff45bJohn McCall 14240953e767ff7817f97b3ab20896b229891eeff45bJohn McCall#ifndef XFree86Server 14250953e767ff7817f97b3ab20896b229891eeff45bJohn McCall /* For debugging only */ 14260953e767ff7817f97b3ab20896b229891eeff45bJohn McCall if (_mesa_getenv("MESA_XSYNC")) { 14272cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor /* This makes debugging X easier. 1428b7166334d897e1e4e6a5b428fe2d0ec752ef187fMike Stump * In your debugger, set a breakpoint on _XError to stop when an 14292cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor * X protocol error is generated. 14302cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor */ 14310953e767ff7817f97b3ab20896b229891eeff45bJohn McCall XSynchronize( display, 1 ); 14322cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor } 14332cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#endif 14342cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 1435c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor v = (XMesaVisual) CALLOC_STRUCT(xmesa_visual); 14360b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor if (!v) { 14370b7489194f9f89fac39d57211c1e7953ae50251fDouglas Gregor return NULL; 1438c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor } 14392cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 14402cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor v->display = display; 14414fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor 14424fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor /* Save a copy of the XVisualInfo struct because the user may X_mesa_free() 14434fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor * the struct but we may need some of the information contained in it 14444fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor * at a later time. 14452cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor */ 14462cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#ifndef XFree86Server 14472cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor v->visinfo = (XVisualInfo *) MALLOC(sizeof(*visinfo)); 14482cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor if(!v->visinfo) { 14492cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor _mesa_free(v); 1450a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl return NULL; 14512cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor } 145217945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis MEMCPY(v->visinfo, visinfo, sizeof(*visinfo)); 14532cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor#endif 14542cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 1455c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor /* check for MESA_GAMMA environment variable */ 14562cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor gamma = _mesa_getenv("MESA_GAMMA"); 14578538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl if (gamma) { 14588538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl v->RedGamma = v->GreenGamma = v->BlueGamma = 0.0; 145917945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis sscanf( gamma, "%f %f %f", &v->RedGamma, &v->GreenGamma, &v->BlueGamma ); 146017945a0f64fe03ff6ec0c2146005a87636e3ac12Argyrios Kyrtzidis if (v->RedGamma<=0.0) v->RedGamma = 1.0; 1461681d7237e1014bf64dd5ead6bf74ae55cdd19e61Sebastian Redl if (v->GreenGamma<=0.0) v->GreenGamma = v->RedGamma; 14622cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor if (v->BlueGamma<=0.0) v->BlueGamma = v->RedGamma; 14632512308525ff328aa992da0b5ee14a488d2ea93aDouglas Gregor } 1464681d7237e1014bf64dd5ead6bf74ae55cdd19e61Sebastian Redl else { 14658538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl v->RedGamma = v->GreenGamma = v->BlueGamma = 1.0; 14662cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor } 14672cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 14682cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor v->ximage_flag = ximage_flag; 1469a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl 14701476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl#ifdef XFree86Server 14711476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl /* We could calculate these values by ourselves. nplanes is either the sum 14721476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl * of the red, green, and blue bits or the number index bits. 14731476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl * ColormapEntries is either (1U << index_bits) or 14741476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl * (1U << max(redBits, greenBits, blueBits)). 14758538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl */ 14761476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl assert(visinfo->nplanes > 0); 14771476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl v->nplanes = visinfo->nplanes; 14781476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl v->ColormapEntries = visinfo->ColormapEntries; 14791476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl 14808538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl v->mesa_visual.redMask = visinfo->redMask; 14811476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl v->mesa_visual.greenMask = visinfo->greenMask; 14821476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl v->mesa_visual.blueMask = visinfo->blueMask; 1483ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl v->mesa_visual.visualID = visinfo->vid; 14841476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl v->mesa_visual.screen = 0; /* FIXME: What should be done here? */ 14851476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl#else 14861476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl v->mesa_visual.redMask = visinfo->red_mask; 14871476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl v->mesa_visual.greenMask = visinfo->green_mask; 14888538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl v->mesa_visual.blueMask = visinfo->blue_mask; 14891476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl v->mesa_visual.visualID = visinfo->visualid; 14901476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl v->mesa_visual.screen = visinfo->screen; 14911476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl#endif 14921476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl 14938538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl#if defined(XFree86Server) || !(defined(__cplusplus) || defined(c_plusplus)) 14941476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl v->mesa_visual.visualType = xmesa_convert_from_x_visual_type(visinfo->class); 14951476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl#else 1496ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl v->mesa_visual.visualType = xmesa_convert_from_x_visual_type(visinfo->c_class); 14971476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl#endif 14981476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl 14991476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl v->mesa_visual.visualRating = visualCaveat; 15004fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor 15014fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor if (alpha_flag) 15024fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor v->mesa_visual.alphaBits = 8; 15034fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor 15043251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor (void) initialize_visual_and_buffer( v, NULL, rgb_flag, 0, 0 ); 1505f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor 15063397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl { 1507a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl const int xclass = v->mesa_visual.visualType; 1508f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor if (xclass == GLX_TRUE_COLOR || xclass == GLX_DIRECT_COLOR) { 1509f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor red_bits = _mesa_bitcount(GET_REDMASK(v)); 1510f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor green_bits = _mesa_bitcount(GET_GREENMASK(v)); 1511f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor blue_bits = _mesa_bitcount(GET_BLUEMASK(v)); 15121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 15135d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl else { 15148538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl /* this is an approximation */ 15155d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl int depth; 15165d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl depth = GET_VISUAL_DEPTH(v); 1517f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor red_bits = depth / 3; 1518f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor depth -= red_bits; 15193397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl green_bits = depth / 2; 15201eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump depth -= green_bits; 1521f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor blue_bits = depth; 15220eca89e9890db4d8336ce762a5b359a1d58ca02bArgyrios Kyrtzidis alpha_bits = 0; 1523f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor assert( red_bits + green_bits + blue_bits == GET_VISUAL_DEPTH(v) ); 15241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 15251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump alpha_bits = v->mesa_visual.alphaBits; 1526f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor } 1527f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor 1528f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor _mesa_initialize_visual( &v->mesa_visual, 1529f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor rgb_flag, db_flag, stereo_flag, 15305d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl red_bits, green_bits, 15315d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl blue_bits, alpha_bits, 1532f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor v->mesa_visual.indexBits, 1533f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor depth_size, 1534f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor stencil_size, 15355d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl accum_red_size, accum_green_size, 1536f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor accum_blue_size, accum_alpha_size, 1537f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor 0 ); 1538f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor 1539f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor /* XXX minor hack */ 1540f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor v->mesa_visual.level = level; 1541f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor return v; 15421eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump} 154383941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor 15441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 154583941df2745d69c05acee3174c7a265c206f70d9Douglas GregorPUBLIC 154683941df2745d69c05acee3174c7a265c206f70d9Douglas Gregorvoid XMesaDestroyVisual( XMesaVisual v ) 1547f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor{ 1548f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor#ifndef XFree86Server 1549f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor _mesa_free(v->visinfo); 1550f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor#endif 1551f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor _mesa_free(v); 15521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump} 1553f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor 1554f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor 15551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 1556f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor/** 1557a67e58c8fa03c2f1aa7609bf5a436d1adba75eefDouglas Gregor * Create a new XMesaContext. 1558a67e58c8fa03c2f1aa7609bf5a436d1adba75eefDouglas Gregor * \param v the XMesaVisual 15595d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl * \param share_list another XMesaContext with which to share display 1560f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor * lists or NULL if no sharing is wanted. 15615d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl * \return an XMesaContext or NULL if error. 1562f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor */ 1563f0aaf7a59729a4ae0146e3464ee987745be95829Douglas GregorPUBLIC 1564f0aaf7a59729a4ae0146e3464ee987745be95829Douglas GregorXMesaContext XMesaCreateContext( XMesaVisual v, XMesaContext share_list ) 1565f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor{ 1566f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor static GLboolean firstTime = GL_TRUE; 15675d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl XMesaContext c; 1568f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor GLcontext *mesaCtx; 1569f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor struct dd_function_table functions; 1570f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor TNLcontext *tnl; 1571f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor 1572f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor if (firstTime) { 1573f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor _glthread_INIT_MUTEX(_xmesa_lock); 15745d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl firstTime = GL_FALSE; 1575f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor } 1576f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor 1577f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor /* Note: the XMesaContext contains a Mesa GLcontext struct (inheritance) */ 15785d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl c = (XMesaContext) CALLOC_STRUCT(xmesa_context); 1579f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor if (!c) 1580f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor return NULL; 1581f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor 1582a67e58c8fa03c2f1aa7609bf5a436d1adba75eefDouglas Gregor mesaCtx = &(c->mesa); 1583a67e58c8fa03c2f1aa7609bf5a436d1adba75eefDouglas Gregor 1584f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor /* initialize with default driver functions, then plug in XMesa funcs */ 1585f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor _mesa_init_driver_functions(&functions); 1586f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor xmesa_init_driver_functions(v, &functions); 1587f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor if (!_mesa_initialize_context(mesaCtx, &v->mesa_visual, 1588059612dd3429cef2d61f11950f3d93a40182bf69Sebastian Redl share_list ? &(share_list->mesa) : (GLcontext *) NULL, 1589f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor &functions, (void *) c)) { 1590f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor _mesa_free(c); 1591059612dd3429cef2d61f11950f3d93a40182bf69Sebastian Redl return NULL; 1592059612dd3429cef2d61f11950f3d93a40182bf69Sebastian Redl } 1593a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl 1594f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor /* Enable this to exercise fixed function -> shader translation 1595f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor * with software rendering. 1596059612dd3429cef2d61f11950f3d93a40182bf69Sebastian Redl */ 15975d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl if (0) { 1598059612dd3429cef2d61f11950f3d93a40182bf69Sebastian Redl mesaCtx->VertexProgram._MaintainTnlProgram = GL_TRUE; 1599e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl mesaCtx->FragmentProgram._MaintainTexEnvProgram = GL_TRUE; 1600059612dd3429cef2d61f11950f3d93a40182bf69Sebastian Redl } 1601f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor 16023397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl _mesa_enable_sw_extensions(mesaCtx); 16035d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis _mesa_enable_1_3_extensions(mesaCtx); 16041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump _mesa_enable_1_4_extensions(mesaCtx); 1605059612dd3429cef2d61f11950f3d93a40182bf69Sebastian Redl _mesa_enable_1_5_extensions(mesaCtx); 1606059612dd3429cef2d61f11950f3d93a40182bf69Sebastian Redl _mesa_enable_2_0_extensions(mesaCtx); 1607e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl _mesa_enable_2_1_extensions(mesaCtx); 16088538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl#if ENABLE_EXT_texure_compression_s3tc 16095d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl if (mesaCtx->Mesa_DXTn) { 16105d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl _mesa_enable_extension(mesaCtx, "GL_EXT_texture_compression_s3tc"); 16115d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl _mesa_enable_extension(mesaCtx, "GL_S3_s3tc"); 1612059612dd3429cef2d61f11950f3d93a40182bf69Sebastian Redl } 16133397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl _mesa_enable_extension(mesaCtx, "GL_3DFX_texture_compression_FXT1"); 16145d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl#endif 16155d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl#if ENABLE_EXT_timer_query 16165d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl _mesa_enable_extension(mesaCtx, "GL_EXT_timer_query"); 16175d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl#endif 16185d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl 16195d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl#ifdef XFree86Server 16205d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl /* If we're running in the X server, do bounds checking to prevent 16215d05007b7a7883159154e3f65f338a2542d53913Sebastian Redl * segfaults and server crashes! 16223397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl */ 1623e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl mesaCtx->Const.CheckArrayBounds = GL_TRUE; 1624e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl#endif 1625e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl 1626e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl /* finish up xmesa context initializations */ 1627e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl c->swapbytes = CHECK_BYTE_ORDER(v) ? GL_FALSE : GL_TRUE; 1628e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl c->xm_visual = v; 1629e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl c->xm_buffer = NULL; /* set later by XMesaMakeCurrent */ 1630e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl c->display = v->display; 1631e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl c->pixelformat = v->dithered_pf; /* Dithering is enabled by default */ 1632e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl 1633e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl /* Initialize the software rasterizer and helper modules. 1634e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl */ 1635e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl if (!_swrast_CreateContext( mesaCtx ) || 1636e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl !_vbo_CreateContext( mesaCtx ) || 1637e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl !_tnl_CreateContext( mesaCtx ) || 1638e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl !_swsetup_CreateContext( mesaCtx )) { 1639fa78dec572259aca763457b435744f79d822c5d4Sebastian Redl _mesa_free_context_data(&c->mesa); 1640fa78dec572259aca763457b435744f79d822c5d4Sebastian Redl _mesa_free(c); 1641fa78dec572259aca763457b435744f79d822c5d4Sebastian Redl return NULL; 1642e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl } 16435d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis 1644f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor /* tnl setup */ 1645f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor tnl = TNL_CONTEXT(mesaCtx); 1646f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor tnl->Driver.RunPipeline = _tnl_run_pipeline; 16471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump /* swrast setup */ 1648f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor xmesa_register_swrast_functions( mesaCtx ); 1649f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor _swsetup_Wakeup(mesaCtx); 16503397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl 1651f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor _mesa_meta_init(mesaCtx); 1652f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor 1653a67e58c8fa03c2f1aa7609bf5a436d1adba75eefDouglas Gregor return c; 1654f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor} 1655f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor 1656f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor 1657f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor 1658f0aaf7a59729a4ae0146e3464ee987745be95829Douglas GregorPUBLIC 16598538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redlvoid XMesaDestroyContext( XMesaContext c ) 1660f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor{ 166183941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor GLcontext *mesaCtx = &c->mesa; 1662f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor 1663f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor#ifdef FX 1664f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor FXdestroyContext( XMESA_BUFFER(mesaCtx->DrawBuffer) ); 166583941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor#endif 1666f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor 16678538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl _mesa_meta_free( mesaCtx ); 1668f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor 1669e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl _swsetup_DestroyContext( mesaCtx ); 1670ec312a1f0557b1d27f3eb6cf49acbf7e72696422Daniel Dunbar _swrast_DestroyContext( mesaCtx ); 167183941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor _tnl_DestroyContext( mesaCtx ); 167283941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor _vbo_DestroyContext( mesaCtx ); 167383941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor _mesa_free_context_data( mesaCtx ); 16748538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl _mesa_free( c ); 167583941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor} 167683941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor 167783941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor 167883941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor 167983941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor/** 168083941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor * Private function for creating an XMesaBuffer which corresponds to an 16818538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl * X window or pixmap. 168283941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor * \param v the window's XMesaVisual 168383941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor * \param w the window we're wrapping 1684ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl * \return new XMesaBuffer or NULL if error 168583941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor */ 1686f0aaf7a59729a4ae0146e3464ee987745be95829Douglas GregorPUBLIC XMesaBuffer 1687f0aaf7a59729a4ae0146e3464ee987745be95829Douglas GregorXMesaCreateWindowBuffer(XMesaVisual v, XMesaWindow w) 1688f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor{ 16893397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl#ifndef XFree86Server 1690a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl XWindowAttributes attr; 1691320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian#endif 1692320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian XMesaBuffer b; 1693320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian XMesaColormap cmap; 1694725cd9686a0f5bb6c994cb3e43f58b63567c6860Sebastian Redl int depth; 1695320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian 1696725cd9686a0f5bb6c994cb3e43f58b63567c6860Sebastian Redl assert(v); 16973397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl assert(w); 1698a68340fd55e177a5849cb3adbf66aedce1f6e91bSebastian Redl 1699a68340fd55e177a5849cb3adbf66aedce1f6e91bSebastian Redl /* Check that window depth matches visual depth */ 1700320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian#ifdef XFree86Server 1701320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian depth = ((XMesaDrawable)w)->depth; 1702320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian#else 1703320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian XGetWindowAttributes( v->display, w, &attr ); 1704320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian depth = attr.depth; 1705320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian#endif 1706320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian if (GET_VISUAL_DEPTH(v) != depth) { 1707320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian _mesa_warning(NULL, "XMesaCreateWindowBuffer: depth mismatch between visual (%d) and window (%d)!\n", 17088538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl GET_VISUAL_DEPTH(v), depth); 1709320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian return NULL; 1710320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian } 17114fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor 17124fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor /* Find colormap */ 17134fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor#ifdef XFree86Server 17144fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor cmap = (ColormapPtr)LookupIDByType(wColormap(w), RT_COLORMAP); 1715f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor#else 17163397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl if (attr.colormap) { 1717a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl cmap = attr.colormap; 171837e2684abfe38207fdb90620da062bb18c23f29aDouglas Gregor } 17193251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor else { 1720a92193ebd9840e5ce4de1b09e49f1b024c0f5c2fDouglas Gregor _mesa_warning(NULL, "Window %u has no colormap!\n", (unsigned int) w); 1721a92193ebd9840e5ce4de1b09e49f1b024c0f5c2fDouglas Gregor /* this is weird, a window w/out a colormap!? */ 1722a92193ebd9840e5ce4de1b09e49f1b024c0f5c2fDouglas Gregor /* OK, let's just allocate a new one and hope for the best */ 1723a92193ebd9840e5ce4de1b09e49f1b024c0f5c2fDouglas Gregor cmap = XCreateColormap(v->display, w, attr.visual, AllocNone); 1724a92193ebd9840e5ce4de1b09e49f1b024c0f5c2fDouglas Gregor } 1725a92193ebd9840e5ce4de1b09e49f1b024c0f5c2fDouglas Gregor#endif 1726a92193ebd9840e5ce4de1b09e49f1b024c0f5c2fDouglas Gregor 1727a92193ebd9840e5ce4de1b09e49f1b024c0f5c2fDouglas Gregor b = create_xmesa_buffer((XMesaDrawable) w, WINDOW, v, cmap); 1728a92193ebd9840e5ce4de1b09e49f1b024c0f5c2fDouglas Gregor if (!b) 1729a92193ebd9840e5ce4de1b09e49f1b024c0f5c2fDouglas Gregor return NULL; 1730a92193ebd9840e5ce4de1b09e49f1b024c0f5c2fDouglas Gregor 17313251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor if (!initialize_visual_and_buffer( v, b, v->mesa_visual.rgbMode, 17323251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor (XMesaDrawable) w, cmap )) { 17333251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor xmesa_free_buffer(b); 17341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return NULL; 17358538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl } 17363251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor 17371eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return b; 17383397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl} 173937e2684abfe38207fdb90620da062bb18c23f29aDouglas Gregor 17403251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor 17413251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor 17422596e429a61602312bdd149786045b8a90cd2d10Daniel Dunbar/** 17433251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor * Create a new XMesaBuffer from an X pixmap. 17441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump * 17451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump * \param v the XMesaVisual 17461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump * \param p the pixmap 17478538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl * \param cmap the colormap, may be 0 if using a \c GLX_TRUE_COLOR or 1748e013d685c6689ac7ae103ee88acf573422d1ed6aDaniel Dunbar * \c GLX_DIRECT_COLOR visual for the pixmap 1749a92193ebd9840e5ce4de1b09e49f1b024c0f5c2fDouglas Gregor * \returns new XMesaBuffer or NULL if error 1750a92193ebd9840e5ce4de1b09e49f1b024c0f5c2fDouglas Gregor */ 17515998da5c29dae3f654cb65738ff237203e2222c8Douglas GregorPUBLIC XMesaBuffer 17521eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpXMesaCreatePixmapBuffer(XMesaVisual v, XMesaPixmap p, XMesaColormap cmap) 1753a92193ebd9840e5ce4de1b09e49f1b024c0f5c2fDouglas Gregor{ 17545998da5c29dae3f654cb65738ff237203e2222c8Douglas Gregor XMesaBuffer b; 1755a92193ebd9840e5ce4de1b09e49f1b024c0f5c2fDouglas Gregor 1756a92193ebd9840e5ce4de1b09e49f1b024c0f5c2fDouglas Gregor assert(v); 1757a92193ebd9840e5ce4de1b09e49f1b024c0f5c2fDouglas Gregor 17588538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl b = create_xmesa_buffer((XMesaDrawable) p, PIXMAP, v, cmap); 1759a92193ebd9840e5ce4de1b09e49f1b024c0f5c2fDouglas Gregor if (!b) 1760668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor return NULL; 176102fc75169afe785c114e795ec4d24edfb4073c42Douglas Gregor 176202fc75169afe785c114e795ec4d24edfb4073c42Douglas Gregor if (!initialize_visual_and_buffer(v, b, v->mesa_visual.rgbMode, 176302fc75169afe785c114e795ec4d24edfb4073c42Douglas Gregor (XMesaDrawable) p, cmap)) { 1764d6595a40fe12e3d5ffe5ce48987b379d547439a4Douglas Gregor xmesa_free_buffer(b); 17653251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor return NULL; 17663251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor } 17671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 17681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return b; 17693251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor} 17703251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor 17713251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor 17723251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor/** 1773e013d685c6689ac7ae103ee88acf573422d1ed6aDaniel Dunbar * For GLX_EXT_texture_from_pixmap 17743251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor */ 17751eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpXMesaBuffer 17761eb4433ac451dc16f4133a88af2d002ac26c58efMike StumpXMesaCreatePixmapTextureBuffer(XMesaVisual v, XMesaPixmap p, 17778538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl XMesaColormap cmap, 1778a92193ebd9840e5ce4de1b09e49f1b024c0f5c2fDouglas Gregor int format, int target, int mipmap) 1779a92193ebd9840e5ce4de1b09e49f1b024c0f5c2fDouglas Gregor{ 1780a92193ebd9840e5ce4de1b09e49f1b024c0f5c2fDouglas Gregor GET_CURRENT_CONTEXT(ctx); 1781a92193ebd9840e5ce4de1b09e49f1b024c0f5c2fDouglas Gregor XMesaBuffer b; 17825998da5c29dae3f654cb65738ff237203e2222c8Douglas Gregor GLuint width, height; 1783a92193ebd9840e5ce4de1b09e49f1b024c0f5c2fDouglas Gregor 17843251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor assert(v); 17851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 17861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump b = create_xmesa_buffer((XMesaDrawable) p, PIXMAP, v, cmap); 178737e2684abfe38207fdb90620da062bb18c23f29aDouglas Gregor if (!b) 17885998da5c29dae3f654cb65738ff237203e2222c8Douglas Gregor return NULL; 1789b0b84385f0cb0ea4036579f5f384f1c19b917c7eDaniel Dunbar 1790b0b84385f0cb0ea4036579f5f384f1c19b917c7eDaniel Dunbar /* get pixmap size, update framebuffer/renderbuffer dims */ 1791b0b84385f0cb0ea4036579f5f384f1c19b917c7eDaniel Dunbar xmesa_get_window_size(v->display, b, &width, &height); 1792646395bbcaa849c94bc2a3246c71d809ca719f01Argyrios Kyrtzidis _mesa_resize_framebuffer(NULL, &(b->mesa_buffer), width, height); 1793b0b84385f0cb0ea4036579f5f384f1c19b917c7eDaniel Dunbar 17945998da5c29dae3f654cb65738ff237203e2222c8Douglas Gregor if (target == 0) { 17953251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor /* examine dims */ 179637e2684abfe38207fdb90620da062bb18c23f29aDouglas Gregor if (ctx->Extensions.ARB_texture_non_power_of_two) { 17975998da5c29dae3f654cb65738ff237203e2222c8Douglas Gregor target = GLX_TEXTURE_2D_EXT; 179837e2684abfe38207fdb90620da062bb18c23f29aDouglas Gregor } 1799668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor else if ( _mesa_bitcount(width) == 1 1800668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor && _mesa_bitcount(height) == 1) { 1801668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor /* power of two size */ 1802668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor if (height == 1) { 1803668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor target = GLX_TEXTURE_1D_EXT; 1804668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor } 1805f2f0f03d08c6143137a79a8edffc7d41823bc3c7Sebastian Redl else { 18061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump target = GLX_TEXTURE_2D_EXT; 1807668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor } 1808668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor } 1809668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor else if (ctx->Extensions.NV_texture_rectangle) { 18103251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor target = GLX_TEXTURE_RECTANGLE_EXT; 1811d8c5abb096a5f6babb3709180fe304be5462bcc1Sebastian Redl } 18123251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor else { 18133251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor /* non power of two textures not supported */ 18143251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor XMesaDestroyBuffer(b); 18153251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor return 0; 18163397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl } 1817afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor } 1818afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor 1819afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor b->TextureTarget = target; 1820afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor b->TextureFormat = format; 1821a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl b->TextureMipmap = mipmap; 1822afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor 1823afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor if (!initialize_visual_and_buffer(v, b, v->mesa_visual.rgbMode, 1824afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor (XMesaDrawable) p, cmap)) { 1825afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor xmesa_free_buffer(b); 1826afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor return NULL; 18273397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl } 18285d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis 18291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return b; 183092b059ea944adaa3e00bb53d63a09868a4752547Douglas Gregor} 183192b059ea944adaa3e00bb53d63a09868a4752547Douglas Gregor 183292b059ea944adaa3e00bb53d63a09868a4752547Douglas Gregor 18333397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl 183492b059ea944adaa3e00bb53d63a09868a4752547Douglas GregorXMesaBuffer 183592b059ea944adaa3e00bb53d63a09868a4752547Douglas GregorXMesaCreatePBuffer(XMesaVisual v, XMesaColormap cmap, 183692b059ea944adaa3e00bb53d63a09868a4752547Douglas Gregor unsigned int width, unsigned int height) 183792b059ea944adaa3e00bb53d63a09868a4752547Douglas Gregor{ 183892b059ea944adaa3e00bb53d63a09868a4752547Douglas Gregor#ifndef XFree86Server 183992b059ea944adaa3e00bb53d63a09868a4752547Douglas Gregor XMesaWindow root; 1840f2f0f03d08c6143137a79a8edffc7d41823bc3c7Sebastian Redl XMesaDrawable drawable; /* X Pixmap Drawable */ 1841f2f0f03d08c6143137a79a8edffc7d41823bc3c7Sebastian Redl XMesaBuffer b; 1842f2f0f03d08c6143137a79a8edffc7d41823bc3c7Sebastian Redl 18438538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl /* allocate pixmap for front buffer */ 1844afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor root = RootWindow( v->display, v->visinfo->screen ); 1845afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor drawable = XCreatePixmap(v->display, root, width, height, 1846afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor v->visinfo->depth); 18473c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl if (!drawable) 18485d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis return NULL; 18493251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor 1850afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor b = create_xmesa_buffer(drawable, PBUFFER, v, cmap); 18513251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor if (!b) 18521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump return NULL; 1853668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor 18543251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor if (!initialize_visual_and_buffer(v, b, v->mesa_visual.rgbMode, 18553397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl drawable, cmap)) { 18563251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor xmesa_free_buffer(b); 1857f0aaf7a59729a4ae0146e3464ee987745be95829Douglas Gregor return NULL; 1858a67e58c8fa03c2f1aa7609bf5a436d1adba75eefDouglas Gregor } 1859668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor 1860afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor return b; 1861afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor#else 1862afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor return 0; 1863afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor#endif 18648538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl} 1865668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas Gregor 18663251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor 1867c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor 1868afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor/* 1869afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor * Deallocate an XMesaBuffer structure and all related info. 1870afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor */ 18718538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian RedlPUBLIC void 1872668c1a4fdcc56bdd050256b1688e116fe84b72dbDouglas GregorXMesaDestroyBuffer(XMesaBuffer b) 1873ec312a1f0557b1d27f3eb6cf49acbf7e72696422Daniel Dunbar{ 1874afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor xmesa_free_buffer(b); 1875afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor} 1876afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor 18772b3a5a83ea30bde7fa8f9d8e9a0cb12623759bfbDouglas Gregor 18788538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl/** 18792b3a5a83ea30bde7fa8f9d8e9a0cb12623759bfbDouglas Gregor * Query the current window size and update the corresponding GLframebuffer 18802b3a5a83ea30bde7fa8f9d8e9a0cb12623759bfbDouglas Gregor * and all attached renderbuffers. 18812b3a5a83ea30bde7fa8f9d8e9a0cb12623759bfbDouglas Gregor * Called when: 18822b3a5a83ea30bde7fa8f9d8e9a0cb12623759bfbDouglas Gregor * 1. the first time a buffer is bound to a context. 18832b3a5a83ea30bde7fa8f9d8e9a0cb12623759bfbDouglas Gregor * 2. from glViewport to poll for window size changes 18848538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl * 3. from the XMesaResizeBuffers() API function. 18852b3a5a83ea30bde7fa8f9d8e9a0cb12623759bfbDouglas Gregor * Note: it's possible (and legal) for xmctx to be NULL. That can happen 18862b3a5a83ea30bde7fa8f9d8e9a0cb12623759bfbDouglas Gregor * when resizing a buffer when no rendering context is bound. 1887ade5000c8763f4bec41f452d7efa3a9b2a6d4712Sebastian Redl */ 18882b3a5a83ea30bde7fa8f9d8e9a0cb12623759bfbDouglas Gregorvoid 1889afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregorxmesa_check_and_update_buffer_size(XMesaContext xmctx, XMesaBuffer drawBuffer) 1890afaf308b779cd8e8fc8c42601b9f383423c15c2dDouglas Gregor{ 18914fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor GLuint width, height; 18925d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis xmesa_get_window_size(drawBuffer->display, drawBuffer, &width, &height); 18935d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis if (drawBuffer->mesa_buffer.Width != width || 18945d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis drawBuffer->mesa_buffer.Height != height) { 18955d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis GLcontext *ctx = xmctx ? &xmctx->mesa : NULL; 18965d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis _mesa_resize_framebuffer(ctx, &(drawBuffer->mesa_buffer), width, height); 18975d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis } 18985d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis drawBuffer->mesa_buffer.Initialized = GL_TRUE; /* XXX TEMPORARY? */ 18995d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis} 19005d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis 19015d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis 19025d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis/* 19035d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis * Bind buffer b to context c and make c the current rendering context. 19045d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis */ 19055d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios KyrtzidisGLboolean XMesaMakeCurrent( XMesaContext c, XMesaBuffer b ) 19065d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis{ 19075d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis return XMesaMakeCurrent2( c, b, b ); 19085d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis} 19095d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis 19105d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis 19115d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis/* 19125d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis * Bind buffer b to context c and make c the current rendering context. 19135d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis */ 19145d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios KyrtzidisPUBLIC 19155d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios KyrtzidisGLboolean XMesaMakeCurrent2( XMesaContext c, XMesaBuffer drawBuffer, 19165d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis XMesaBuffer readBuffer ) 19175d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis{ 19185d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis if (c) { 19195d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis if (!drawBuffer || !readBuffer) 19205d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis return GL_FALSE; /* must specify buffers! */ 19215d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis 19225d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis if (&(c->mesa) == _mesa_get_current_context() 19235d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis && c->mesa.DrawBuffer == &drawBuffer->mesa_buffer 19245d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis && c->mesa.ReadBuffer == &readBuffer->mesa_buffer 19255d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis && XMESA_BUFFER(c->mesa.DrawBuffer)->wasCurrent) { 19265d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis /* same context and buffer, do nothing */ 19275d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis return GL_TRUE; 19285d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis } 19295d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis 19305d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis c->xm_buffer = drawBuffer; 19315d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis 19325d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis#ifdef FX 19335d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis if (FXmakeCurrent( drawBuffer )) 19345d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis return GL_TRUE; 19355d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis#endif 19365d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis 19375d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis /* Call this periodically to detect when the user has begun using 19385d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis * GL rendering from multiple threads. 19395d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis */ 19405d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis _glapi_check_multithread(); 19415d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis 19425d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis xmesa_check_and_update_buffer_size(c, drawBuffer); 19435d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis if (readBuffer != drawBuffer) 19445d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis xmesa_check_and_update_buffer_size(c, readBuffer); 19455d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis 19465d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis _mesa_make_current(&(c->mesa), 19475d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis &drawBuffer->mesa_buffer, 19485d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis &readBuffer->mesa_buffer); 19495d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis 19505d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis if (c->xm_visual->mesa_visual.rgbMode) { 19515d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis /* 19525d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis * Must recompute and set these pixel values because colormap 19535d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis * can be different for different windows. 19545d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis */ 19555d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis c->clearpixel = xmesa_color_to_pixel( &c->mesa, 19565d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis c->clearcolor[0], 19575d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis c->clearcolor[1], 19585d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis c->clearcolor[2], 19595d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis c->clearcolor[3], 19605d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis c->xm_visual->undithered_pf); 19615d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis XMesaSetForeground(c->display, drawBuffer->cleargc, c->clearpixel); 19625d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis } 19635d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis 19645d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis /* Solution to Stephane Rehel's problem with glXReleaseBuffersMESA(): */ 19655d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis drawBuffer->wasCurrent = GL_TRUE; 19665d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis } 19675d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis else { 19685d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis /* Detach */ 19695d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis _mesa_make_current( NULL, NULL, NULL ); 19705d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis } 19715d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis return GL_TRUE; 19725d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis} 19735d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis 19745d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis 19755d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis/* 19765d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis * Unbind the context c from its buffer. 19775d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis */ 19785d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios KyrtzidisGLboolean XMesaUnbindContext( XMesaContext c ) 19795d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis{ 19805d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis /* A no-op for XFree86 integration purposes */ 19815d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis return GL_TRUE; 19825d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis} 19835d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis 19845d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis 19855d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios KyrtzidisXMesaContext XMesaGetCurrentContext( void ) 19865d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis{ 19875d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis GET_CURRENT_CONTEXT(ctx); 19885d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis if (ctx) { 19895d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis XMesaContext xmesa = XMESA_CONTEXT(ctx); 19905d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis return xmesa; 19915d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis } 19925d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis else { 19935d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis return 0; 19945d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis } 19955d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis} 19965d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis 19975d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis 19985d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios KyrtzidisXMesaBuffer XMesaGetCurrentBuffer( void ) 19995d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis{ 20005d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis GET_CURRENT_CONTEXT(ctx); 20015d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis if (ctx) { 20025d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis XMesaBuffer xmbuf = XMESA_BUFFER(ctx->DrawBuffer); 20035d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis return xmbuf; 20045d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis } 20055d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis else { 20065d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis return 0; 20075d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis } 20085d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis} 20095d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis 20105d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis 20115d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis/* New in Mesa 3.1 */ 2012074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios KyrtzidisXMesaBuffer XMesaGetCurrentReadBuffer( void ) 2013074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis{ 2014074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis GET_CURRENT_CONTEXT(ctx); 2015074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis if (ctx) { 2016074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis return XMESA_BUFFER(ctx->ReadBuffer); 2017074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis } 2018074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis else { 2019074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis return 0; 2020074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis } 2021074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis} 2022074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis 2023074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis 2024074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis#ifdef XFree86Server 2025074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios KyrtzidisPUBLIC 2026074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios KyrtzidisGLboolean XMesaForceCurrent(XMesaContext c) 2027074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis{ 2028074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis if (c) { 2029074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis _glapi_set_dispatch(c->mesa.CurrentDispatch); 2030074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis 2031074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis if (&(c->mesa) != _mesa_get_current_context()) { 2032074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis _mesa_make_current(&c->mesa, c->mesa.DrawBuffer, c->mesa.ReadBuffer); 2033074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis } 2034074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis } 2035074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis else { 2036074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis _mesa_make_current(NULL, NULL, NULL); 2037074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis } 2038074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis return GL_TRUE; 2039074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis} 2040074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis 2041074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis 2042074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios KyrtzidisPUBLIC 2043074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios KyrtzidisGLboolean XMesaLoseCurrent(XMesaContext c) 2044074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis{ 2045074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis (void) c; 2046074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis _mesa_make_current(NULL, NULL, NULL); 2047074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis return GL_TRUE; 2048074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis} 2049074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis 2050074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis 2051074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios KyrtzidisPUBLIC 2052074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios KyrtzidisGLboolean XMesaCopyContext( XMesaContext xm_src, XMesaContext xm_dst, GLuint mask ) 2053074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis{ 2054074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis _mesa_copy_context(&xm_src->mesa, &xm_dst->mesa, mask); 2055074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis return GL_TRUE; 2056074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis} 2057074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis#endif /* XFree86Server */ 2058074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis 2059074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis 2060074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis#ifndef FX 2061074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios KyrtzidisGLboolean XMesaSetFXmode( GLint mode ) 2062074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis{ 2063074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis (void) mode; 2064074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis return GL_FALSE; 2065074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis} 2066074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis#endif 2067074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis 2068074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis 2069074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis 2070074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis/* 2071074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis * Copy the back buffer to the front buffer. If there's no back buffer 2072074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis * this is a no-op. 2073074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis */ 2074074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios KyrtzidisPUBLIC 2075074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidisvoid XMesaSwapBuffers( XMesaBuffer b ) 2076074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis{ 2077074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis GET_CURRENT_CONTEXT(ctx); 2078074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis 2079074dcc8ef8c5df7a155c85648e8eae786bee6cabArgyrios Kyrtzidis if (!b->backxrb) { 20805d26768e2661faa7ce0b55ffff4be8b3969fbbf5Argyrios Kyrtzidis /* single buffered */ 20814fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor return; 20824fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor } 20834fed3f47f6b9e31d603c5c2d1f6d8ec2e1241e57Douglas Gregor 208468a2eb0cc76267ba0615992fb5e0977853c397b2Douglas Gregor /* If we're swapping the buffer associated with the current context 2085a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl * we have to flush any pending rendering commands first. 208668a2eb0cc76267ba0615992fb5e0977853c397b2Douglas Gregor */ 2087cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt if (ctx && ctx->DrawBuffer == &(b->mesa_buffer)) 2088cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt _mesa_notifySwapBuffers(ctx); 2089cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt 2090cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt if (b->db_mode) { 2091cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt#ifdef FX 209268a2eb0cc76267ba0615992fb5e0977853c397b2Douglas Gregor if (FXswapBuffers(b)) 2093cf807c4dfdb23e8fa3f400e0b24ef5b79db7a530Sean Hunt return; 20945b160927672440076aa53c31d84149f70fd8d40eFariborz Jahanian#endif 209568a2eb0cc76267ba0615992fb5e0977853c397b2Douglas Gregor if (b->backxrb->ximage) { 209668a2eb0cc76267ba0615992fb5e0977853c397b2Douglas Gregor /* Copy Ximage (back buf) from client memory to server window */ 20978538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl#if defined(USE_XSHM) && !defined(XFree86Server) 209868a2eb0cc76267ba0615992fb5e0977853c397b2Douglas Gregor if (b->shm) { 209968a2eb0cc76267ba0615992fb5e0977853c397b2Douglas Gregor /*_glthread_LOCK_MUTEX(_xmesa_lock);*/ 2100a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl XShmPutImage( b->xm_visual->display, b->frontxrb->drawable, 210168a2eb0cc76267ba0615992fb5e0977853c397b2Douglas Gregor b->swapgc, 210268a2eb0cc76267ba0615992fb5e0977853c397b2Douglas Gregor b->backxrb->ximage, 0, 0, 210368a2eb0cc76267ba0615992fb5e0977853c397b2Douglas Gregor 0, 0, b->mesa_buffer.Width, b->mesa_buffer.Height, 210468a2eb0cc76267ba0615992fb5e0977853c397b2Douglas Gregor False ); 21053251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor /*_glthread_UNLOCK_MUTEX(_xmesa_lock);*/ 21063251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor } 2107a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl else 21088538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl#endif 21093397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl { 2110f2f0f03d08c6143137a79a8edffc7d41823bc3c7Sebastian Redl /*_glthread_LOCK_MUTEX(_xmesa_lock);*/ 2111f2f0f03d08c6143137a79a8edffc7d41823bc3c7Sebastian Redl XMesaPutImage( b->xm_visual->display, b->frontxrb->drawable, 2112f2f0f03d08c6143137a79a8edffc7d41823bc3c7Sebastian Redl b->swapgc, 21133251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor b->backxrb->ximage, 0, 0, 21143251ceb90b3fec68e86d6dcfa58836e20a7205c3Douglas Gregor 0, 0, b->mesa_buffer.Width, b->mesa_buffer.Height ); 211583941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor /*_glthread_UNLOCK_MUTEX(_xmesa_lock);*/ 211683941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor } 2117a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl } 211883941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor else if (b->backxrb->pixmap) { 211983941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor /* Copy pixmap (back buf) to window (front buf) on server */ 2120e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl /*_glthread_LOCK_MUTEX(_xmesa_lock);*/ 2121e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl XMesaCopyArea( b->xm_visual->display, 2122e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl b->backxrb->pixmap, /* source drawable */ 2123e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl b->frontxrb->drawable, /* dest. drawable */ 2124e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl b->swapgc, 212583941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor 0, 0, b->mesa_buffer.Width, b->mesa_buffer.Height, 212683941df2745d69c05acee3174c7a265c206f70d9Douglas Gregor 0, 0 /* dest region */ 2127a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl ); 2128e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl /*_glthread_UNLOCK_MUTEX(_xmesa_lock);*/ 21298538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl } 2130e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl 2131e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl if (b->swAlpha) 2132e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl _mesa_copy_soft_alpha_renderbuffers(ctx, &b->mesa_buffer); 2133e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl } 213430c514c225342844700ed4640ec6d90ddf0e12b2Sebastian Redl#if !defined(XFree86Server) 21352cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor XSync( b->xm_visual->display, False ); 2136a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl#endif 213730c514c225342844700ed4640ec6d90ddf0e12b2Sebastian Redl} 21382cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor 2139c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor 2140c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor 2141c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor/* 2142c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor * Copy sub-region of back buffer to front buffer 21431eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump */ 2144b145b1e9de866e79fb386e4a074dc0b41853acf3Chris Lattnervoid XMesaCopySubBuffer( XMesaBuffer b, int x, int y, int width, int height ) 21452cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor{ 21461dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl GET_CURRENT_CONTEXT(ctx); 2147a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl 21481dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl /* If we're swapping the buffer associated with the current context 2149a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl * we have to flush any pending rendering commands first. 21501dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl */ 21511dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl if (ctx && ctx->DrawBuffer == &(b->mesa_buffer)) 2152a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl _mesa_notifySwapBuffers(ctx); 21531dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl 21541dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl if (!b->backxrb) { 21551dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl /* single buffered */ 21561dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl return; 21571dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl } 21581dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl 21592cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor if (b->db_mode) { 21602cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor int yTop = b->mesa_buffer.Height - y - height; 2161f2f0f03d08c6143137a79a8edffc7d41823bc3c7Sebastian Redl#ifdef FX 216261d60ee6aa0a5ded0ddcf48679673b37506a1895Douglas Gregor if (FXswapBuffers(b)) 21632cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor return; 21642deaea37a637dd01221d0cced343702a39d8132cDouglas Gregor#endif 21652deaea37a637dd01221d0cced343702a39d8132cDouglas Gregor if (b->backxrb->ximage) { 21662deaea37a637dd01221d0cced343702a39d8132cDouglas Gregor /* Copy Ximage from host's memory to server's window */ 21672deaea37a637dd01221d0cced343702a39d8132cDouglas Gregor#if defined(USE_XSHM) && !defined(XFree86Server) 21682deaea37a637dd01221d0cced343702a39d8132cDouglas Gregor if (b->shm) { 21692deaea37a637dd01221d0cced343702a39d8132cDouglas Gregor /* XXX assuming width and height aren't too large! */ 21702deaea37a637dd01221d0cced343702a39d8132cDouglas Gregor XShmPutImage( b->xm_visual->display, b->frontxrb->drawable, 21712deaea37a637dd01221d0cced343702a39d8132cDouglas Gregor b->swapgc, 21722deaea37a637dd01221d0cced343702a39d8132cDouglas Gregor b->backxrb->ximage, x, yTop, 21732deaea37a637dd01221d0cced343702a39d8132cDouglas Gregor x, yTop, width, height, False ); 21742deaea37a637dd01221d0cced343702a39d8132cDouglas Gregor /* wait for finished event??? */ 217563d65f873fdfcb04b216ea9c648d1df5992aed1cChris Lattner } 2176e9d12b6c50c1e9b05443db099e21026c5991a93bSebastian Redl else 217763d65f873fdfcb04b216ea9c648d1df5992aed1cChris Lattner#endif 21784c0e86b392c5fb0cb771551fc877edb6979be69cDouglas Gregor { 2179e9d12b6c50c1e9b05443db099e21026c5991a93bSebastian Redl /* XXX assuming width and height aren't too large! */ 2180e9d12b6c50c1e9b05443db099e21026c5991a93bSebastian Redl XMesaPutImage( b->xm_visual->display, b->frontxrb->drawable, 218163d65f873fdfcb04b216ea9c648d1df5992aed1cChris Lattner b->swapgc, 21824c0e86b392c5fb0cb771551fc877edb6979be69cDouglas Gregor b->backxrb->ximage, x, yTop, 218349b96d1a382ae9f31456166f1a734d3f7f30b992Argyrios Kyrtzidis x, yTop, width, height ); 218449b96d1a382ae9f31456166f1a734d3f7f30b992Argyrios Kyrtzidis } 218549b96d1a382ae9f31456166f1a734d3f7f30b992Argyrios Kyrtzidis } 218649b96d1a382ae9f31456166f1a734d3f7f30b992Argyrios Kyrtzidis else { 21874056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl /* Copy pixmap to window on server */ 218872b90571b1783b17c3f2204cec5ca440edc38beeArgyrios Kyrtzidis XMesaCopyArea( b->xm_visual->display, 218972b90571b1783b17c3f2204cec5ca440edc38beeArgyrios Kyrtzidis b->backxrb->pixmap, /* source drawable */ 219072b90571b1783b17c3f2204cec5ca440edc38beeArgyrios Kyrtzidis b->frontxrb->drawable, /* dest. drawable */ 219172b90571b1783b17c3f2204cec5ca440edc38beeArgyrios Kyrtzidis b->swapgc, 219272b90571b1783b17c3f2204cec5ca440edc38beeArgyrios Kyrtzidis x, yTop, width, height, /* source region */ 219372b90571b1783b17c3f2204cec5ca440edc38beeArgyrios Kyrtzidis x, yTop /* dest region */ 219472b90571b1783b17c3f2204cec5ca440edc38beeArgyrios Kyrtzidis ); 219572b90571b1783b17c3f2204cec5ca440edc38beeArgyrios Kyrtzidis } 219672b90571b1783b17c3f2204cec5ca440edc38beeArgyrios Kyrtzidis } 219772b90571b1783b17c3f2204cec5ca440edc38beeArgyrios Kyrtzidis} 219872b90571b1783b17c3f2204cec5ca440edc38beeArgyrios Kyrtzidis 219972b90571b1783b17c3f2204cec5ca440edc38beeArgyrios Kyrtzidis 220072b90571b1783b17c3f2204cec5ca440edc38beeArgyrios Kyrtzidis/* 220111a18f115e8974ef24e8d5bb549ed3289871efa4Kovarththanan Rajaratnam * Return a pointer to the XMesa backbuffer Pixmap or XImage. This function 220214c22f20c077cecd68581952a0c227f8c180be03Douglas Gregor * is a way to get "under the hood" of X/Mesa so one can manipulate the 220314c22f20c077cecd68581952a0c227f8c180be03Douglas Gregor * back buffer directly. 220414c22f20c077cecd68581952a0c227f8c180be03Douglas Gregor * Output: pixmap - pointer to back buffer's Pixmap, or 0 220514c22f20c077cecd68581952a0c227f8c180be03Douglas Gregor * ximage - pointer to back buffer's XImage, or NULL 22063397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl * Return: GL_TRUE = context is double buffered 220763d65f873fdfcb04b216ea9c648d1df5992aed1cChris Lattner * GL_FALSE = context is single buffered 22081eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump */ 220914c22f20c077cecd68581952a0c227f8c180be03Douglas Gregor#ifndef XFree86Server 221014c22f20c077cecd68581952a0c227f8c180be03Douglas GregorGLboolean XMesaGetBackBuffer( XMesaBuffer b, 221114c22f20c077cecd68581952a0c227f8c180be03Douglas Gregor XMesaPixmap *pixmap, 221214c22f20c077cecd68581952a0c227f8c180be03Douglas Gregor XMesaImage **ximage ) 221314c22f20c077cecd68581952a0c227f8c180be03Douglas Gregor{ 2214b81c17092039f39be60e9656a37cffbdf2e2c783Douglas Gregor if (b->db_mode) { 2215b81c17092039f39be60e9656a37cffbdf2e2c783Douglas Gregor if (pixmap) 2216b81c17092039f39be60e9656a37cffbdf2e2c783Douglas Gregor *pixmap = b->backxrb->pixmap; 2217b81c17092039f39be60e9656a37cffbdf2e2c783Douglas Gregor if (ximage) 2218b81c17092039f39be60e9656a37cffbdf2e2c783Douglas Gregor *ximage = b->backxrb->ximage; 2219d455add086f1dfa16ae87dc310e49493bbc2b0a6Argyrios Kyrtzidis return GL_TRUE; 2220d455add086f1dfa16ae87dc310e49493bbc2b0a6Argyrios Kyrtzidis } 2221be4ebcdaa03a84d915b37f96d241b74eece67c92Argyrios Kyrtzidis else { 2222be4ebcdaa03a84d915b37f96d241b74eece67c92Argyrios Kyrtzidis *pixmap = 0; 2223be4ebcdaa03a84d915b37f96d241b74eece67c92Argyrios Kyrtzidis *ximage = NULL; 2224be4ebcdaa03a84d915b37f96d241b74eece67c92Argyrios Kyrtzidis return GL_FALSE; 2225be4ebcdaa03a84d915b37f96d241b74eece67c92Argyrios Kyrtzidis } 2226be4ebcdaa03a84d915b37f96d241b74eece67c92Argyrios Kyrtzidis} 2227be4ebcdaa03a84d915b37f96d241b74eece67c92Argyrios Kyrtzidis#endif /* XFree86Server */ 2228d455add086f1dfa16ae87dc310e49493bbc2b0a6Argyrios Kyrtzidis 2229d455add086f1dfa16ae87dc310e49493bbc2b0a6Argyrios Kyrtzidis 2230d455add086f1dfa16ae87dc310e49493bbc2b0a6Argyrios Kyrtzidis/* 2231d455add086f1dfa16ae87dc310e49493bbc2b0a6Argyrios Kyrtzidis * Return the depth buffer associated with an XMesaBuffer. 2232d455add086f1dfa16ae87dc310e49493bbc2b0a6Argyrios Kyrtzidis * Input: b - the XMesa buffer handle 2233d455add086f1dfa16ae87dc310e49493bbc2b0a6Argyrios Kyrtzidis * Output: width, height - size of buffer in pixels 2234d455add086f1dfa16ae87dc310e49493bbc2b0a6Argyrios Kyrtzidis * bytesPerValue - bytes per depth value (2 or 4) 22350e0363866792b309d70e9c8e92b4c239773af89cArgyrios Kyrtzidis * buffer - pointer to depth buffer values 22360e0363866792b309d70e9c8e92b4c239773af89cArgyrios Kyrtzidis * Return: GL_TRUE or GL_FALSE to indicate success or failure. 22370e0363866792b309d70e9c8e92b4c239773af89cArgyrios Kyrtzidis */ 22380e0363866792b309d70e9c8e92b4c239773af89cArgyrios KyrtzidisGLboolean XMesaGetDepthBuffer( XMesaBuffer b, GLint *width, GLint *height, 22390e0363866792b309d70e9c8e92b4c239773af89cArgyrios Kyrtzidis GLint *bytesPerValue, void **buffer ) 22400e0363866792b309d70e9c8e92b4c239773af89cArgyrios Kyrtzidis{ 22410e0363866792b309d70e9c8e92b4c239773af89cArgyrios Kyrtzidis struct gl_renderbuffer *rb 22420e0363866792b309d70e9c8e92b4c239773af89cArgyrios Kyrtzidis = b->mesa_buffer.Attachment[BUFFER_DEPTH].Renderbuffer; 22430e0363866792b309d70e9c8e92b4c239773af89cArgyrios Kyrtzidis if (!rb || !rb->Data) { 22440e0363866792b309d70e9c8e92b4c239773af89cArgyrios Kyrtzidis *width = 0; 22450e0363866792b309d70e9c8e92b4c239773af89cArgyrios Kyrtzidis *height = 0; 224676c38d385447b7acdff2d7e6b13fa8580e7174a7Argyrios Kyrtzidis *bytesPerValue = 0; 224776c38d385447b7acdff2d7e6b13fa8580e7174a7Argyrios Kyrtzidis *buffer = 0; 224876c38d385447b7acdff2d7e6b13fa8580e7174a7Argyrios Kyrtzidis return GL_FALSE; 224976c38d385447b7acdff2d7e6b13fa8580e7174a7Argyrios Kyrtzidis } 225076c38d385447b7acdff2d7e6b13fa8580e7174a7Argyrios Kyrtzidis else { 225176c38d385447b7acdff2d7e6b13fa8580e7174a7Argyrios Kyrtzidis *width = b->mesa_buffer.Width; 225276c38d385447b7acdff2d7e6b13fa8580e7174a7Argyrios Kyrtzidis *height = b->mesa_buffer.Height; 22533397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl *bytesPerValue = b->mesa_buffer.Visual.depthBits <= 16 2254ad1de006ea080b540e480efc6b86c2e201dbf1ecDouglas Gregor ? sizeof(GLushort) : sizeof(GLuint); 22558538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl *buffer = rb->Data; 225630c514c225342844700ed4640ec6d90ddf0e12b2Sebastian Redl return GL_TRUE; 22571dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl } 2258e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor} 2259dd41ed59cf7aefabd40bf766d8fcc7ebd759c8e5Douglas Gregor 2260e650c8c3bca2f58cad8ffa8aab63126d26e890cdDouglas Gregor 2261c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroffvoid XMesaFlush( XMesaContext c ) 2262c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff{ 22631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (c && c->xm_visual) { 2264c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff#ifdef XFree86Server 2265c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff /* NOT_NEEDED */ 2266c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff#else 2267c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff XSync( c->xm_visual->display, False ); 2268c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff#endif 2269c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff } 2270c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff} 2271c15cb2af27514ecc879daba9aa01389c5203685dSteve Naroff 2272782fa308a765aeac2acb39c4e697c937ec21185bMike Stump 2273782fa308a765aeac2acb39c4e697c937ec21185bMike Stump 2274d1571acc700b652a52c766e36a6c688d9bf6f3a1Douglas Gregorconst char *XMesaGetString( XMesaContext c, int name ) 2275d1571acc700b652a52c766e36a6c688d9bf6f3a1Douglas Gregor{ 2276adaaad3715c9c26cdcfdfe3401a13d7b4423ddcfMike Stump (void) c; 2277083c25eea14bb4cc4ecc3ec763c60e2e609e22bdMike Stump if (name==XMESA_VERSION) { 22782bb5ddaff86ee73d2cea7ec1835978afc88a83f0Fariborz Jahanian return "5.0"; 22792bb5ddaff86ee73d2cea7ec1835978afc88a83f0Fariborz Jahanian } 2280006113841bdae1edb77aef75ba1ffdf2e55a3094Argyrios Kyrtzidis else if (name==XMESA_EXTENSIONS) { 22818538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl return ""; 22821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 2283366809a4e9340b3458b471e2294a75a9f09ea304Douglas Gregor else { 2284366809a4e9340b3458b471e2294a75a9f09ea304Douglas Gregor return NULL; 22858538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl } 228661d60ee6aa0a5ded0ddcf48679673b37506a1895Douglas Gregor} 228761d60ee6aa0a5ded0ddcf48679673b37506a1895Douglas Gregor 228861d60ee6aa0a5ded0ddcf48679673b37506a1895Douglas Gregor 228961d60ee6aa0a5ded0ddcf48679673b37506a1895Douglas Gregor 229061d60ee6aa0a5ded0ddcf48679673b37506a1895Douglas GregorXMesaBuffer XMesaFindBuffer( XMesaDisplay *dpy, XMesaDrawable d ) 229161d60ee6aa0a5ded0ddcf48679673b37506a1895Douglas Gregor{ 229261d60ee6aa0a5ded0ddcf48679673b37506a1895Douglas Gregor XMesaBuffer b; 229361d60ee6aa0a5ded0ddcf48679673b37506a1895Douglas Gregor for (b=XMesaBufferList; b; b=b->Next) { 229461d60ee6aa0a5ded0ddcf48679673b37506a1895Douglas Gregor if (b->frontxrb->drawable == d && b->display == dpy) { 229561d60ee6aa0a5ded0ddcf48679673b37506a1895Douglas Gregor return b; 229611a18f115e8974ef24e8d5bb549ed3289871efa4Kovarththanan Rajaratnam } 2297813a97b3eee957eac3ac1fb111b8892fb9afd0d4Douglas Gregor } 2298059612dd3429cef2d61f11950f3d93a40182bf69Sebastian Redl return NULL; 2299320198303df7c16950d83ae79c3f702b84badcf7Fariborz Jahanian} 230037e2684abfe38207fdb90620da062bb18c23f29aDouglas Gregor 23018f5dc7fe4d42cea78fa92d1638f753cf65b54cb5Douglas Gregor 23021476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl/** 2303ad1de006ea080b540e480efc6b86c2e201dbf1ecDouglas Gregor * Free/destroy all XMesaBuffers associated with given display. 23044c0e86b392c5fb0cb771551fc877edb6979be69cDouglas Gregor */ 2305fdd0172ca1b3c837f8c2b37d69cc2085234e09faDouglas Gregorvoid xmesa_destroy_buffers_on_display(XMesaDisplay *dpy) 23068538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl{ 23074c0e86b392c5fb0cb771551fc877edb6979be69cDouglas Gregor XMesaBuffer b, next; 23084c0e86b392c5fb0cb771551fc877edb6979be69cDouglas Gregor for (b = XMesaBufferList; b; b = next) { 23094c0e86b392c5fb0cb771551fc877edb6979be69cDouglas Gregor next = b->Next; 23108538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl if (b->display == dpy) { 231114c22f20c077cecd68581952a0c227f8c180be03Douglas Gregor xmesa_free_buffer(b); 231249b96d1a382ae9f31456166f1a734d3f7f30b992Argyrios Kyrtzidis } 231349b96d1a382ae9f31456166f1a734d3f7f30b992Argyrios Kyrtzidis } 23148538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl} 231511a18f115e8974ef24e8d5bb549ed3289871efa4Kovarththanan Rajaratnam 231672b90571b1783b17c3f2204cec5ca440edc38beeArgyrios Kyrtzidis 231772b90571b1783b17c3f2204cec5ca440edc38beeArgyrios Kyrtzidis/* 23188538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl * Look for XMesaBuffers whose X window has been destroyed. 231972b90571b1783b17c3f2204cec5ca440edc38beeArgyrios Kyrtzidis * Deallocate any such XMesaBuffers. 232072b90571b1783b17c3f2204cec5ca440edc38beeArgyrios Kyrtzidis */ 232114c22f20c077cecd68581952a0c227f8c180be03Douglas Gregorvoid XMesaGarbageCollect( void ) 232214c22f20c077cecd68581952a0c227f8c180be03Douglas Gregor{ 23238538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl XMesaBuffer b, next; 232414c22f20c077cecd68581952a0c227f8c180be03Douglas Gregor for (b=XMesaBufferList; b; b=next) { 2325b81c17092039f39be60e9656a37cffbdf2e2c783Douglas Gregor next = b->Next; 2326b81c17092039f39be60e9656a37cffbdf2e2c783Douglas Gregor if (b->display && b->frontxrb->drawable && b->type == WINDOW) { 2327b81c17092039f39be60e9656a37cffbdf2e2c783Douglas Gregor#ifdef XFree86Server 23288538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl /* NOT_NEEDED */ 23291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump#else 2330d455add086f1dfa16ae87dc310e49493bbc2b0a6Argyrios Kyrtzidis XSync(b->display, False); 2331d455add086f1dfa16ae87dc310e49493bbc2b0a6Argyrios Kyrtzidis if (!window_exists( b->display, b->frontxrb->drawable )) { 23328538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl /* found a dead window, free the ancillary info */ 2333d455add086f1dfa16ae87dc310e49493bbc2b0a6Argyrios Kyrtzidis XMesaDestroyBuffer( b ); 2334d455add086f1dfa16ae87dc310e49493bbc2b0a6Argyrios Kyrtzidis } 2335d455add086f1dfa16ae87dc310e49493bbc2b0a6Argyrios Kyrtzidis#endif 23368538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl } 2337d455add086f1dfa16ae87dc310e49493bbc2b0a6Argyrios Kyrtzidis } 23380e0363866792b309d70e9c8e92b4c239773af89cArgyrios Kyrtzidis} 23390e0363866792b309d70e9c8e92b4c239773af89cArgyrios Kyrtzidis 23408538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl 23410e0363866792b309d70e9c8e92b4c239773af89cArgyrios Kyrtzidisunsigned long XMesaDitherColor( XMesaContext xmesa, GLint x, GLint y, 23420e0363866792b309d70e9c8e92b4c239773af89cArgyrios Kyrtzidis GLfloat red, GLfloat green, 234376c38d385447b7acdff2d7e6b13fa8580e7174a7Argyrios Kyrtzidis GLfloat blue, GLfloat alpha ) 234476c38d385447b7acdff2d7e6b13fa8580e7174a7Argyrios Kyrtzidis{ 23458538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl GLcontext *ctx = &xmesa->mesa; 234676c38d385447b7acdff2d7e6b13fa8580e7174a7Argyrios Kyrtzidis GLint r = (GLint) (red * 255.0F); 23473e1af84bb0092a1aafb49deaa4ab6664c9a9071bDouglas Gregor GLint g = (GLint) (green * 255.0F); 2348ad1de006ea080b540e480efc6b86c2e201dbf1ecDouglas Gregor GLint b = (GLint) (blue * 255.0F); 23493e1af84bb0092a1aafb49deaa4ab6664c9a9071bDouglas Gregor GLint a = (GLint) (alpha * 255.0F); 235037e2684abfe38207fdb90620da062bb18c23f29aDouglas Gregor 23512512308525ff328aa992da0b5ee14a488d2ea93aDouglas Gregor switch (xmesa->pixelformat) { 23522512308525ff328aa992da0b5ee14a488d2ea93aDouglas Gregor case PF_Index: 23538538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl return 0; 2354c9490c000f515c29f200a1215328d8ab9a0f3818Douglas Gregor case PF_Truecolor: 23552cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor { 23562cf2634ffdb4f7c8d46cef3f8e60a55993f1c57aDouglas Gregor unsigned long p; 2357a4232eb646d89e7d52424bb42eb87d9061f39e63Sebastian Redl PACK_TRUECOLOR( p, r, g, b ); 235830c514c225342844700ed4640ec6d90ddf0e12b2Sebastian Redl return p; 23591dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl } 23601dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl case PF_8A8B8G8R: 2361ffaab3e2bb13991bb3357e80f14bcae3745b2347Sebastian Redl return PACK_8A8B8G8R( r, g, b, a ); 2362ffaab3e2bb13991bb3357e80f14bcae3745b2347Sebastian Redl case PF_8A8R8G8B: 2363ffaab3e2bb13991bb3357e80f14bcae3745b2347Sebastian Redl return PACK_8A8R8G8B( r, g, b, a ); 2364e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl case PF_8R8G8B: 2365ffaab3e2bb13991bb3357e80f14bcae3745b2347Sebastian Redl return PACK_8R8G8B( r, g, b ); 2366ffaab3e2bb13991bb3357e80f14bcae3745b2347Sebastian Redl case PF_5R6G5B: 2367ffaab3e2bb13991bb3357e80f14bcae3745b2347Sebastian Redl return PACK_5R6G5B( r, g, b ); 2368e58aa890e8de55bb3146e6ea9fbbba3a58ce30c6Sebastian Redl case PF_Dither: 2369ffaab3e2bb13991bb3357e80f14bcae3745b2347Sebastian Redl { 23701dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl DITHER_SETUP; 23711dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl return DITHER( x, y, r, g, b ); 23721476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl } 23731dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl case PF_1Bit: 23748538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl /* 382 = (3*255)/2 */ 237530c514c225342844700ed4640ec6d90ddf0e12b2Sebastian Redl return ((r+g+b) > 382) ^ xmesa->xm_visual->bitFlip; 23761476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl case PF_HPCR: 23771476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl return DITHER_HPCR(x, y, r, g, b); 23781476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl case PF_Lookup: 23791476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl { 23801476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl LOOKUP_SETUP; 23811dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl return LOOKUP( r, g, b ); 23821dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl } 23831dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl case PF_Grayscale: 23841dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl return GRAY_RGB( r, g, b ); 23853c7f4134603d04b44f997b43c0a9def270f25386Sebastian Redl case PF_Dither_5R6G5B: 23861dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl /* fall through */ 23878538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl case PF_Dither_True: 2388681d7237e1014bf64dd5ead6bf74ae55cdd19e61Sebastian Redl { 2389681d7237e1014bf64dd5ead6bf74ae55cdd19e61Sebastian Redl unsigned long p; 23901dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl PACK_TRUEDITHER(p, x, y, r, g, b); 2391d692af71226d2fb537d86c670af96114ddd485c3Sebastian Redl return p; 2392d692af71226d2fb537d86c670af96114ddd485c3Sebastian Redl } 23930b17c61e8f143901ce11b4a6e5129ac63aaeee04Sebastian Redl default: 23940b17c61e8f143901ce11b4a6e5129ac63aaeee04Sebastian Redl _mesa_problem(NULL, "Bad pixel format in XMesaDitherColor"); 23951dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl } 2396681d7237e1014bf64dd5ead6bf74ae55cdd19e61Sebastian Redl return 0; 2397d692af71226d2fb537d86c670af96114ddd485c3Sebastian Redl} 23988538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl 2399d692af71226d2fb537d86c670af96114ddd485c3Sebastian Redl 2400d692af71226d2fb537d86c670af96114ddd485c3Sebastian Redl/* 2401d692af71226d2fb537d86c670af96114ddd485c3Sebastian Redl * This is typically called when the window size changes and we need 24028538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl * to reallocate the buffer's back/depth/stencil/accum buffers. 2403d692af71226d2fb537d86c670af96114ddd485c3Sebastian Redl */ 2404d692af71226d2fb537d86c670af96114ddd485c3Sebastian RedlPUBLIC void 24058538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian RedlXMesaResizeBuffers( XMesaBuffer b ) 24061dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl{ 2407083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl GET_CURRENT_CONTEXT(ctx); 2408083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl XMesaContext xmctx = XMESA_CONTEXT(ctx); 2409083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl if (!xmctx) 2410083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl return; 2411083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl xmesa_check_and_update_buffer_size(xmctx, b); 2412083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl} 2413083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl 2414083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl 241549b96d1a382ae9f31456166f1a734d3f7f30b992Argyrios Kyrtzidisstatic GLint 241649b96d1a382ae9f31456166f1a734d3f7f30b992Argyrios Kyrtzidisxbuffer_to_renderbuffer(int buffer) 241749b96d1a382ae9f31456166f1a734d3f7f30b992Argyrios Kyrtzidis{ 241849b96d1a382ae9f31456166f1a734d3f7f30b992Argyrios Kyrtzidis assert(MAX_AUX_BUFFERS <= 4); 241949b96d1a382ae9f31456166f1a734d3f7f30b992Argyrios Kyrtzidis 2420083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl switch (buffer) { 2421083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl case GLX_FRONT_LEFT_EXT: 24224056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl return BUFFER_FRONT_LEFT; 24234056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl case GLX_FRONT_RIGHT_EXT: 24244056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl return BUFFER_FRONT_RIGHT; 24254056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl case GLX_BACK_LEFT_EXT: 24264056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl return BUFFER_BACK_LEFT; 24274056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl case GLX_BACK_RIGHT_EXT: 24284056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl return BUFFER_BACK_RIGHT; 24294056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl case GLX_AUX0_EXT: 24304056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl return BUFFER_AUX0; 24314056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl case GLX_AUX1_EXT: 24324056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl case GLX_AUX2_EXT: 24334056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl case GLX_AUX3_EXT: 24344056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl case GLX_AUX4_EXT: 24354056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl case GLX_AUX5_EXT: 24364056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl case GLX_AUX6_EXT: 2437083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl case GLX_AUX7_EXT: 2438083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl case GLX_AUX8_EXT: 2439083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl case GLX_AUX9_EXT: 2440083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl default: 24413397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl /* BadValue error */ 2442083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl return -1; 2443083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl } 2444083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl} 2445083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl 2446083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl 2447083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian RedlPUBLIC void 2448083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian RedlXMesaBindTexImage(XMesaDisplay *dpy, XMesaBuffer drawable, int buffer, 2449083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl const int *attrib_list) 2450083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl{ 2451083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl#if 0 2452083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl GET_CURRENT_CONTEXT(ctx); 2453083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl const GLuint unit = ctx->Texture.CurrentUnit; 2454083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit]; 2455083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl struct gl_texture_object *texObj; 2456083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl#endif 2457083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl struct gl_renderbuffer *rb; 24584056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl struct xmesa_renderbuffer *xrb; 24594056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl GLint b; 24604056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl XMesaImage *img = NULL; 24614056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl GLboolean freeImg = GL_FALSE; 24624056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl 24634056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl b = xbuffer_to_renderbuffer(buffer); 24644056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl if (b < 0) 24654056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl return; 24664056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl 24674056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl if (drawable->TextureFormat == GLX_TEXTURE_FORMAT_NONE_EXT) 24684056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl return; /* BadMatch error */ 24694056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl 24704056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl rb = drawable->mesa_buffer.Attachment[b].Renderbuffer; 24714056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl if (!rb) { 24724056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl /* invalid buffer */ 24734056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl return; 24744056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl } 24754056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl xrb = xmesa_renderbuffer(rb); 24764056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl 24774056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl#if 0 24784056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl switch (drawable->TextureTarget) { 24794056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl case GLX_TEXTURE_1D_EXT: 24804056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl texObj = texUnit->CurrentTex[TEXTURE_1D_INDEX]; 24814056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl break; 24824056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl case GLX_TEXTURE_2D_EXT: 24834056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl texObj = texUnit->CurrentTex[TEXTURE_2D_INDEX]; 24844056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl break; 24854056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl case GLX_TEXTURE_RECTANGLE_EXT: 24864056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl texObj = texUnit->CurrentTex[TEXTURE_RECT_INDEX]; 24874056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl break; 24884056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl default: 24894056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl return; /* BadMatch error */ 24904056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl } 24914056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl#endif 24924056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl 24934056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl /* 24944056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl * The following is a quick and simple way to implement 24954056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl * BindTexImage. The better way is to write some new FetchTexel() 24964056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl * functions which would extract texels from XImages. We'd still 24974056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl * need to use GetImage when texturing from a Pixmap (front buffer) 24988538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl * but texturing from a back buffer (XImage) would avoid an image 24991dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl * copy. 25001dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl */ 25011dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl 25021dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl /* get XImage */ 25031dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl if (xrb->pixmap) { 25041dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl img = XMesaGetImage(dpy, xrb->pixmap, 0, 0, rb->Width, rb->Height, ~0L, 25051dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl ZPixmap); 25061dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl freeImg = GL_TRUE; 25071dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl } 25081dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl else if (xrb->ximage) { 25091dc13a15e789a174e5e5855efe27036dd7a9d252Sebastian Redl img = xrb->ximage; 2510083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl } 2511a68340fd55e177a5849cb3adbf66aedce1f6e91bSebastian Redl 2512a68340fd55e177a5849cb3adbf66aedce1f6e91bSebastian Redl /* store the XImage as a new texture image */ 2513f2f0f03d08c6143137a79a8edffc7d41823bc3c7Sebastian Redl if (img) { 25141476ed40ef6ef144937821da888c7e4d9ea0acd7Sebastian Redl GLenum format, type, intFormat; 2515083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl if (img->bits_per_pixel == 32) { 2516a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis format = GL_BGRA; 25173397c5570369f19b2d6c52e898f708d75ceede1fSebastian Redl type = GL_UNSIGNED_BYTE; 2518a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis intFormat = GL_RGBA; 2519a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis } 2520a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis else if (img->bits_per_pixel == 24) { 2521a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis format = GL_BGR; 2522a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis type = GL_UNSIGNED_BYTE; 2523a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis intFormat = GL_RGB; 2524a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis } 2525a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis else if (img->bits_per_pixel == 16) { 2526a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis format = GL_BGR; 25278538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl type = GL_UNSIGNED_SHORT_5_6_5; 2528a865005c74019184e04f7fcdd4d61c31c095a4ffArgyrios Kyrtzidis intFormat = GL_RGB; 2529083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl } 2530083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl else { 25318538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl _mesa_problem(NULL, "Unexpected XImage format in XMesaBindTexImage"); 2532083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl return; 2533083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl } 2534083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl if (drawable->TextureFormat == GLX_TEXTURE_FORMAT_RGBA_EXT) { 25358538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl intFormat = GL_RGBA; 2536083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl } 253749b96d1a382ae9f31456166f1a734d3f7f30b992Argyrios Kyrtzidis else if (drawable->TextureFormat == GLX_TEXTURE_FORMAT_RGB_EXT) { 253849b96d1a382ae9f31456166f1a734d3f7f30b992Argyrios Kyrtzidis intFormat = GL_RGB; 25398538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl } 2540083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl 25414056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl _mesa_TexImage2D(GL_TEXTURE_2D, 0, intFormat, rb->Width, rb->Height, 0, 25424056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl format, type, img->data); 25438538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl 25444056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl if (freeImg) { 25454056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl XMesaDestroyImage(img); 2546083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl } 2547083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl } 25488538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl} 2549083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl 2550083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl 2551083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl 2552083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian RedlPUBLIC void 25538538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian RedlXMesaReleaseTexImage(XMesaDisplay *dpy, XMesaBuffer drawable, int buffer) 2554083abdf67f157e9d2ab5a8c9d5e71240479d3c99Sebastian Redl{ 25554056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl const GLint b = xbuffer_to_renderbuffer(buffer); 25564056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl if (b < 0) 25578538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl return; 25584056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl 25594056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl /* no-op for now */ 25604056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl} 25618538e8d43a3a9bd439c987c0de37bcbf035dd391Sebastian Redl 25624056680e3c154ef84874410eba55323f9b07aad6Sebastian Redl