xm_api.c revision 7eb5a2892d3d89f4b1800311babb40af1ec7d4e5
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Mesa 3-D graphics library 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Version: 7.1 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright (C) 1999-2007 Brian Paul All Rights Reserved. 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Permission is hereby granted, free of charge, to any person obtaining a 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * copy of this software and associated documentation files (the "Software"), 9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) * to deal in the Software without restriction, including without limitation 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the rights to use, copy, modify, merge, publish, distribute, sublicense, 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * and/or sell copies of the Software, and to permit persons to whom the 12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Software is furnished to do so, subject to the following conditions: 13ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch * 148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) * The above copyright notice and this permission notice shall be included 156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) * in all copies or substantial portions of the Software. 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * 17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) */ 24effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 25c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch/** 266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) * \file xm_api.c 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 28c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch * All the XMesa* API functions. 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * NOTES: 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The window coordinate system origin (0,0) is in the lower-left corner 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * of the window. X11's window coordinate origin is in the upper-left 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * corner of the window. Therefore, most drawing functions in this 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * file have to flip Y coordinates. 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Define USE_XSHM in the Makefile with -DUSE_XSHM if you want to compile 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * in support for the MIT Shared Memory extension. If enabled, when you 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * use an Ximage for the back buffer in double buffered mode, the "swap" 41a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * operation will be faster. You must also link with -lXext. 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Byte swapping: If the Mesa host and the X display use a different 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * byte order then there's some trickiness to be aware of when using 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * XImages. The byte ordering used for the XImage is that of the X 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * display, not the Mesa host. 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The color-to-pixel encoding for True/DirectColor must be done 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * according to the display's visual red_mask, green_mask, and blue_mask. 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * If XPutPixel is used to put a pixel into an XImage then XPutPixel will 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * do byte swapping if needed. If one wants to directly "poke" the pixel 51a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * into the XImage's buffer then the pixel must be byte swapped first. In 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Mesa, when byte swapping is needed we use the PF_TRUECOLOR pixel format 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * and use XPutPixel everywhere except in the implementation of 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * glClear(GL_COLOR_BUFFER_BIT). We want this function to be fast so 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * instead of using XPutPixel we "poke" our values after byte-swapping 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the clear pixel value if needed. 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef __CYGWIN__ 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef WIN32 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef __WIN32__ 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "glxheader.h" 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "xmesaP.h" 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "main/context.h" 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "main/extensions.h" 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "main/framebuffer.h" 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "main/imports.h" 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "main/macros.h" 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "main/renderbuffer.h" 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "main/teximage.h" 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "glapi/glthread.h" 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "swrast/swrast.h" 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "swrast_setup/swrast_setup.h" 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "vbo/vbo.h" 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "tnl/tnl.h" 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "tnl/t_context.h" 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "tnl/t_pipeline.h" 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "drivers/common/driverfuncs.h" 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Global X driver lock 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)_glthread_Mutex _xmesa_lock; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Lookup tables for HPCR pixel format: 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static short hpcr_rgbTbl[3][256] = { 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 30, 30, 31, 31, 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32, 32, 33, 33, 34, 34, 35, 35, 36, 36, 37, 37, 38, 38, 39, 39, 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}, 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles){ 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24, 24, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 30, 30, 31, 31, 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32, 32, 33, 33, 34, 34, 35, 35, 36, 36, 37, 37, 38, 38, 39, 39, 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}, 130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles){ 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32, 32, 33, 33, 34, 34, 35, 35, 36, 36, 37, 37, 38, 38, 39, 39, 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40, 40, 41, 41, 42, 42, 43, 43, 44, 44, 45, 45, 46, 46, 47, 47, 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48, 48, 49, 49, 50, 50, 51, 51, 52, 52, 53, 53, 54, 54, 55, 55, 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 56, 56, 57, 57, 58, 58, 59, 59, 60, 60, 61, 61, 62, 62, 63, 63, 13546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 64, 64, 65, 65, 66, 66, 67, 67, 68, 68, 69, 69, 70, 70, 71, 71, 136868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 72, 72, 73, 73, 74, 74, 75, 75, 76, 76, 77, 77, 78, 78, 79, 79, 13746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 80, 80, 81, 81, 82, 82, 83, 83, 84, 84, 85, 85, 86, 86, 87, 87, 13846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 13946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 14046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 141868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 142868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 14646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**********************************************************************/ 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/***** X Utility Functions *****/ 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**********************************************************************/ 15546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Return the host's byte order as LSBFirst or MSBFirst ala X. 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef XFree86Server 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int host_byte_order( void ) 16246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles){ 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i = 1; 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char *cptr = (char *) &i; 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (*cptr==1) ? LSBFirst : MSBFirst; 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 17146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) * Check if the X Shared Memory extension is available. 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Return: 0 = not available 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 1 = shared XImage support available 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 2 = shared Pixmap support available also 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int check_for_xshm( XMesaDisplay *display ) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 17846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#if defined(USE_XSHM) && !defined(XFree86Server) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int major, minor, ignore; 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bool pixmaps; 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (XQueryExtension( display, "MIT-SHM", &ignore, &ignore, &ignore )) { 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (XShmQueryVersion( display, &major, &minor, &pixmaps )==True) { 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (pixmaps==True) ? 2 : 1; 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else { 18746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return 0; 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else { 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* No XSHM support */ 19546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return 0; 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Apply gamma correction to an intensity value in [0..max]. Return the 20246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) * new intensity value. 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static GLint 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gamma_adjust( GLfloat gamma, GLint value, GLint max ) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (gamma == 1.0) { 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return value; 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) else { 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double x = (double) value / (double) max; 212f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return IROUND_POS((GLfloat) max * _mesa_pow(x, 1.0F/gamma)); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Return the true number of bits per pixel for XImages. 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * For example, if we request a 24-bit deep visual we may actually need/get 221f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * 32bpp XImages. This function returns the appropriate bpp. 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Input: dpy - the X display 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * visinfo - desribes the visual to be used for XImages 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Return: true number of bits per pixel for XImages 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bits_per_pixel( XMesaVisual xmv ) 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef XFree86Server 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int depth = xmv->nplanes; 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(depth > 0); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < screenInfo.numPixmapFormats; i++) { 234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (screenInfo.formats[i].depth == depth) 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return screenInfo.formats[i].bitsPerPixel; 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 237f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return depth; /* should never get here, but this should be safe */ 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XMesaDisplay *dpy = xmv->display; 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XMesaVisualInfo visinfo = xmv->visinfo; 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XMesaImage *img; 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int bitsPerPixel; 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Create a temporary XImage */ 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) img = XCreateImage( dpy, visinfo->visual, visinfo->depth, 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ZPixmap, 0, /*format, offset*/ 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (char*) MALLOC(8), /*data*/ 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1, 1, /*width, height*/ 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32, /*bitmap_pad*/ 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0 /*bytes_per_line*/ 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(img); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* grab the bits/pixel value */ 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bitsPerPixel = img->bits_per_pixel; 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* free the XImage */ 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _mesa_free( img->data ); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) img->data = NULL; 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XMesaDestroyImage( img ); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return bitsPerPixel; 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 2615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 264c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch/* 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Determine if a given X window ID is valid (window exists). 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Do this by calling XGetWindowAttributes() for the window and 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * checking if we catch an X error. 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Input: dpy - the display 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * win - the window to check for existance 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Return: GL_TRUE - window exists 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * GL_FALSE - window doesn't exist 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef XFree86Server 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static GLboolean WindowExistsFlag; 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int window_exists_err_handler( XMesaDisplay* dpy, XErrorEvent* xerr ) 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (void) dpy; 279f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (xerr->error_code == BadWindow) { 280f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) WindowExistsFlag = GL_FALSE; 281f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 282f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return 0; 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 284868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 285868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)static GLboolean window_exists( XMesaDisplay *dpy, Window win ) 286868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles){ 287868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) XWindowAttributes wa; 288868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) int (*old_handler)( XMesaDisplay*, XErrorEvent* ); 289868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) WindowExistsFlag = GL_TRUE; 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old_handler = XSetErrorHandler(window_exists_err_handler); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XGetWindowAttributes( dpy, win, &wa ); /* dummy request */ 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSetErrorHandler(old_handler); 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return WindowExistsFlag; 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static Status 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)get_drawable_size( XMesaDisplay *dpy, Drawable d, GLuint *width, GLuint *height ) 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Window root; 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Status stat; 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int xpos, ypos; 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int w, h, bw, depth; 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) stat = XGetGeometry(dpy, d, &root, &xpos, &ypos, &w, &h, &bw, &depth); 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *width = w; 3057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) *height = h; 3065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return stat; 3075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 308c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Return the size of the window (or pixmap) that corresponds to the 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * given XMesaBuffer. 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * \param width returns width in pixels 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * \param height returns height in pixels 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmesa_get_window_size(XMesaDisplay *dpy, XMesaBuffer b, 3197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) GLuint *width, GLuint *height) 3205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles){ 3215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#ifdef XFree86Server 3225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) *width = MIN2(b->frontxrb->drawable->width, MAX_WIDTH); 3235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) *height = MIN2(b->frontxrb->drawable->height, MAX_HEIGHT); 324c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#else 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Status stat; 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _glthread_LOCK_MUTEX(_xmesa_lock); 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSync(b->xm_visual->display, 0); /* added for Chromium */ 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) stat = get_drawable_size(dpy, b->frontxrb->pixmap, width, height); 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _glthread_UNLOCK_MUTEX(_xmesa_lock); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!stat) { 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* probably querying a window that's recently been destroyed */ 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _mesa_warning(NULL, "XGetGeometry failed!\n"); 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *width = *height = 1; 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 337f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif 338f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 341868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 342868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)/**********************************************************************/ 343868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)/***** Linked list of XMesaBuffers *****/ 344868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)/**********************************************************************/ 345868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 346868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)XMesaBuffer XMesaBufferList = NULL; 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Allocate a new XMesaBuffer object which corresponds to the given drawable. 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Note that XMesaBuffer is derived from GLframebuffer. 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The new XMesaBuffer will not have any size (Width=Height=0). 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * \param d the corresponding X drawable (window or pixmap) 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * \param type either WINDOW, PIXMAP or PBUFFER, describing d 356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * \param vis the buffer's visual 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * \param cmap the window's colormap, if known. 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * \return new XMesaBuffer or NULL if any problem 359f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) */ 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static XMesaBuffer 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)create_xmesa_buffer(XMesaDrawable d, BufferType type, 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XMesaVisual vis, XMesaColormap cmap) 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XMesaBuffer b; 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT(type == WINDOW || type == PIXMAP || type == PBUFFER); 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) b = (XMesaBuffer) CALLOC_STRUCT(xmesa_buffer); 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!b) 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) b->display = vis->display; 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) b->xm_visual = vis; 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) b->type = type; 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) b->cmap = cmap; 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _mesa_initialize_framebuffer(&b->mesa_buffer, &vis->mesa_visual); 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) b->mesa_buffer.Delete = xmesa_delete_framebuffer; 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Front renderbuffer 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) b->frontxrb = xmesa_new_renderbuffer(NULL, 0, &vis->mesa_visual, GL_FALSE); 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!b->frontxrb) { 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _mesa_free(b); 3867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return NULL; 3875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 3885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) b->frontxrb->Parent = b; 3895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) b->frontxrb->drawable = d; 390c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch b->frontxrb->pixmap = (XMesaPixmap) d; 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _mesa_add_renderbuffer(&b->mesa_buffer, BUFFER_FRONT_LEFT, 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &b->frontxrb->Base); 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Back renderbuffer 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 397f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (vis->mesa_visual.doubleBufferMode) { 398f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) b->backxrb = xmesa_new_renderbuffer(NULL, 0, &vis->mesa_visual, GL_TRUE); 399f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!b->backxrb) { 400f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) /* XXX free front xrb too */ 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _mesa_free(b); 402868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return NULL; 403868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 404868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) b->backxrb->Parent = b; 405868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) /* determine back buffer implementation */ 406868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) b->db_mode = vis->ximage_flag ? BACK_XIMAGE : BACK_PIXMAP; 407868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _mesa_add_renderbuffer(&b->mesa_buffer, BUFFER_BACK_LEFT, 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &b->backxrb->Base); 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Software alpha planes 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (vis->mesa_visual.alphaBits > 0 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) && vis->undithered_pf != PF_8A8B8G8R 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) && vis->undithered_pf != PF_8A8R8G8B) { 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Visual has alpha, but pixel format doesn't support it. 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * We'll use an alpha renderbuffer wrapper. 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) b->swAlpha = GL_TRUE; 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) else { 4245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) b->swAlpha = GL_FALSE; 4255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 4265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 427c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch /* 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Other renderbuffer (depth, stencil, etc) 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _mesa_add_soft_renderbuffers(&b->mesa_buffer, 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GL_FALSE, /* color */ 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vis->mesa_visual.haveDepthBuffer, 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) vis->mesa_visual.haveStencilBuffer, 4347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) vis->mesa_visual.haveAccumBuffer, 4355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) b->swAlpha, 4365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) vis->mesa_visual.numAuxBuffers > 0 ); 437c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* GLX_EXT_texture_from_pixmap */ 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) b->TextureTarget = 0; 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) b->TextureFormat = GLX_TEXTURE_FORMAT_NONE_EXT; 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) b->TextureMipmap = 0; 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* insert buffer into linked list */ 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) b->Next = XMesaBufferList; 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XMesaBufferList = b; 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return b; 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 449f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 450f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Find an XMesaBuffer by matching X display and colormap but NOT matching 453868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) * the notThis buffer. 454868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) */ 455868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)XMesaBuffer 456868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)xmesa_find_buffer(XMesaDisplay *dpy, XMesaColormap cmap, XMesaBuffer notThis) 457868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles){ 458868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) XMesaBuffer b; 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (b=XMesaBufferList; b; b=b->Next) { 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (b->display==dpy && b->cmap==cmap && b!=notThis) { 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return b; 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 468c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/** 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Remove buffer from linked list, delete if no longer referenced. 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 471f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)static void 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmesa_free_buffer(XMesaBuffer buffer) 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XMesaBuffer prev = NULL, b; 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (b = XMesaBufferList; b; b = b->Next) { 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (b == buffer) { 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct gl_framebuffer *fb = &buffer->mesa_buffer; 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* unlink buffer from list */ 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (prev) 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prev->Next = buffer->Next; 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XMesaBufferList = buffer->Next; 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* mark as delete pending */ 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) fb->DeletePending = GL_TRUE; 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Since the X window for the XMesaBuffer is going away, we don't 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * want to dereference this pointer in the future. 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) b->frontxrb->drawable = 0; 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Unreference. If count = zero we'll really delete the buffer */ 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _mesa_reference_framebuffer(&fb, NULL); 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 4995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) /* continue search */ 5005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) prev = b; 5015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 502c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch /* buffer not found in XMesaBufferList */ 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _mesa_problem(NULL,"xmesa_free_buffer() - buffer not found\n"); 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copy X color table stuff from one XMesaBuffer to another. 509f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) */ 510f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)static void 511f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)copy_colortable_info(XMesaBuffer dst, const XMesaBuffer src) 512f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles){ 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MEMCPY(dst->color_table, src->color_table, sizeof(src->color_table)); 514868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) MEMCPY(dst->pixel_to_r, src->pixel_to_r, sizeof(src->pixel_to_r)); 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MEMCPY(dst->pixel_to_g, src->pixel_to_g, sizeof(src->pixel_to_g)); 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MEMCPY(dst->pixel_to_b, src->pixel_to_b, sizeof(src->pixel_to_b)); 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dst->num_alloced = src->num_alloced; 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MEMCPY(dst->alloced_colors, src->alloced_colors, 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sizeof(src->alloced_colors)); 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 5245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)/**********************************************************************/ 5255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)/***** Misc Private Functions *****/ 526c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch/**********************************************************************/ 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * A replacement for XAllocColor. This function should never 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * fail to allocate a color. When XAllocColor fails, we return 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the nearest matching color. If we have to allocate many colors 5337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) * this function isn't too efficient; the XQueryColors() could be 5345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) * done just once. 5355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) * Written by Michael Pichler, Brian Paul, Mark Kilgard 536c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch * Input: dpy - X display 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * cmap - X colormap 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * cmapSize - size of colormap 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * In/Out: color - the XColor struct 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Output: exact - 1=exact color match, 0=closest match 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * alloced - 1=XAlloc worked, 0=XAlloc failed 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)noFaultXAllocColor( int client, 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XMesaDisplay *dpy, 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XMesaColormap cmap, 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int cmapSize, 548f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) XMesaColor *color, 549f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int *exact, int *alloced ) 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef XFree86Server 552868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) Pixel *ppixIn; 553868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) xrgb *ctable; 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* we'll try to cache ctable for better remote display performance */ 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static Display *prevDisplay = NULL; 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static XMesaColormap prevCmap = 0; 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static int prevCmapSize = 0; 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static XMesaColor *ctable = NULL; 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XMesaColor subColor; 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i, bestmatch; 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double mindist; /* 3*2^16^2 exceeds long int precision. */ 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (void) client; 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5678bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) /* First try just using XAllocColor. */ 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef XFree86Server 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (AllocColor(cmap, 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &color->red, &color->green, &color->blue, 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &color->pixel, 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client) == Success) 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (XAllocColor(dpy, cmap, color)) 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *exact = 1; 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *alloced = 1; 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Alloc failed, search for closest match */ 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Retrieve color table entries. */ 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* XXX alloca candidate. */ 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef XFree86Server 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ppixIn = (Pixel *) MALLOC(cmapSize * sizeof(Pixel)); 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ctable = (xrgb *) MALLOC(cmapSize * sizeof(xrgb)); 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < cmapSize; i++) { 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ppixIn[i] = i; 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QueryColors(cmap, cmapSize, ppixIn, ctable); 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 5947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (prevDisplay != dpy || prevCmap != cmap 5957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch || prevCmapSize != cmapSize || !ctable) { 5968bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) /* free previously cached color table */ 597f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (ctable) 598f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) _mesa_free(ctable); 599558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch /* Get the color table from X */ 600f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ctable = (XMesaColor *) MALLOC(cmapSize * sizeof(XMesaColor)); 601558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch assert(ctable); 602f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) for (i = 0; i < cmapSize; i++) { 603f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ctable[i].pixel = i; 604f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 605f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) XQueryColors(dpy, cmap, ctable, cmapSize); 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prevDisplay = dpy; 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prevCmap = cmap; 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prevCmapSize = cmapSize; 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Find best match. */ 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bestmatch = -1; 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mindist = 0.0; 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < cmapSize; i++) { 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double dr = 0.30 * ((double) color->red - (double) ctable[i].red); 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double dg = 0.59 * ((double) color->green - (double) ctable[i].green); 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double db = 0.11 * ((double) color->blue - (double) ctable[i].blue); 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double dist = dr * dr + dg * dg + db * db; 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (bestmatch < 0 || dist < mindist) { 62146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) bestmatch = i; 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mindist = dist; 62346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 6247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 626f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) /* Return result. */ 627f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) subColor.red = ctable[bestmatch].red; 628f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) subColor.green = ctable[bestmatch].green; 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) subColor.blue = ctable[bestmatch].blue; 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Try to allocate the closest match color. This should only 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * fail if the cell is read/write. Otherwise, we're incrementing 632c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * the cell's reference count. 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef XFree86Server 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (AllocColor(cmap, 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &subColor.red, &subColor.green, &subColor.blue, 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &subColor.pixel, 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client) == Success) { 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (XAllocColor(dpy, cmap, &subColor)) { 6416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#endif 642a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) *alloced = 1; 643116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 644c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) else { 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* do this to work around a problem reported by Frank Ortega */ 646a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) subColor.pixel = (unsigned long) bestmatch; 6471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci subColor.red = ctable[bestmatch].red; 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) subColor.green = ctable[bestmatch].green; 6495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) subColor.blue = ctable[bestmatch].blue; 650eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch subColor.flags = DoRed | DoGreen | DoBlue; 65158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) *alloced = 0; 652a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 6535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#ifdef XFree86Server 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _mesa_free(ppixIn); 6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) _mesa_free(ctable); 656f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#else 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* don't free table, save it for next time */ 65858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif 659bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch 6605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) *color = subColor; 6615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) *exact = 0; 662a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)/** 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Do setup for PF_GRAYSCALE pixel format. 6689ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch * Note that buffer may be NULL. 669ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch */ 670558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochstatic GLboolean 671f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)setup_grayscale(int client, XMesaVisual v, 672558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch XMesaBuffer buffer, XMesaColormap cmap) 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (GET_VISUAL_DEPTH(v)<4 || GET_VISUAL_DEPTH(v)>16) { 675a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return GL_FALSE; 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 677a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (buffer) { 679cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) XMesaBuffer prevBuffer; 680cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 681cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!cmap) { 682cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return GL_FALSE; 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prevBuffer = xmesa_find_buffer(v->display, cmap, buffer); 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (prevBuffer && 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (buffer->xm_visual->mesa_visual.rgbMode == 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prevBuffer->xm_visual->mesa_visual.rgbMode)) { 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Copy colormap stuff from previous XMesaBuffer which uses same 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * X colormap. Do this to avoid time spent in noFaultXAllocColor. 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy_colortable_info(buffer, prevBuffer); 6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else { 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Allocate 256 shades of gray */ 6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int gray; 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int colorsfailed = 0; 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (gray=0;gray<256;gray++) { 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLint r = gamma_adjust( v->RedGamma, gray, 255 ); 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLint g = gamma_adjust( v->GreenGamma, gray, 255 ); 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLint b = gamma_adjust( v->BlueGamma, gray, 255 ); 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int exact, alloced; 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XMesaColor xcol; 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xcol.red = (r << 8) | r; 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xcol.green = (g << 8) | g; 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xcol.blue = (b << 8) | b; 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) noFaultXAllocColor( client, v->display, 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmap, GET_COLORMAP_SIZE(v), 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &xcol, &exact, &alloced ); 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!exact) { 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) colorsfailed++; 712c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 713c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (alloced) { 714c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) assert(buffer->num_alloced<256); 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buffer->alloced_colors[buffer->num_alloced] = xcol.pixel; 716010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) buffer->num_alloced++; 7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 71958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) /*OLD 7204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) assert(gray < 576); 721a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) buffer->color_table[gray*3+0] = xcol.pixel; 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buffer->color_table[gray*3+1] = xcol.pixel; 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buffer->color_table[gray*3+2] = xcol.pixel; 724c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) assert(xcol.pixel < 65536); 7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) buffer->pixel_to_r[xcol.pixel] = gray * 30 / 100; 7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) buffer->pixel_to_g[xcol.pixel] = gray * 59 / 100; 7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) buffer->pixel_to_b[xcol.pixel] = gray * 11 / 100; 7285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) */ 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buffer->color_table[gray] = xcol.pixel; 730c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) assert(xcol.pixel < 65536); 7317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) buffer->pixel_to_r[xcol.pixel] = gray; 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) buffer->pixel_to_g[xcol.pixel] = gray; 7331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci buffer->pixel_to_b[xcol.pixel] = gray; 734a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 735f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 7365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (colorsfailed && _mesa_getenv("MESA_DEBUG")) { 73790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) _mesa_warning(NULL, 738a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) "Note: %d out of 256 needed colors do not match exactly.\n", 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) colorsfailed ); 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 74358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 7447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) v->dithered_pf = PF_Grayscale; 7454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) v->undithered_pf = PF_Grayscale; 746d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return GL_TRUE; 7475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 750cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 752d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) * Setup RGB rendering for a window with a PseudoColor, StaticColor, 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * or 8-bit TrueColor visual visual. We try to allocate a palette of 225 75458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) * colors (5 red, 9 green, 5 blue) and dither to approximate a 24-bit RGB 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * color. While this function was originally designed just for 8-bit 7561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) * visuals, it has also proven to work from 4-bit up to 16-bit visuals. 75768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) * Dithering code contributed by Bob Mercier. 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static GLboolean 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)setup_dithered_color(int client, XMesaVisual v, 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XMesaBuffer buffer, XMesaColormap cmap) 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GET_VISUAL_DEPTH(v)<4 || GET_VISUAL_DEPTH(v)>16) { 764010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return GL_FALSE; 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 766f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 7677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (buffer) { 7685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu XMesaBuffer prevBuffer; 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!cmap) { 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GL_FALSE; 7721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 7731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 7741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci prevBuffer = xmesa_find_buffer(v->display, cmap, buffer); 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (prevBuffer && 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (buffer->xm_visual->mesa_visual.rgbMode == 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prevBuffer->xm_visual->mesa_visual.rgbMode)) { 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Copy colormap stuff from previous, matching XMesaBuffer. 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Do this to avoid time spent in noFaultXAllocColor. 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) copy_colortable_info(buffer, prevBuffer); 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else { 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Allocate X colors and initialize color_table[], red_table[], etc */ 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int r, g, b, i; 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int colorsfailed = 0; 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (r = 0; r < DITH_R; r++) { 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (g = 0; g < DITH_G; g++) { 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (b = 0; b < DITH_B; b++) { 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XMesaColor xcol; 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int exact, alloced; 79258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) xcol.red =gamma_adjust(v->RedGamma, r*65535/(DITH_R-1),65535); 79358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) xcol.green=gamma_adjust(v->GreenGamma, g*65535/(DITH_G-1),65535); 79458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) xcol.blue =gamma_adjust(v->BlueGamma, b*65535/(DITH_B-1),65535); 79558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) noFaultXAllocColor( client, v->display, 79658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) cmap, GET_COLORMAP_SIZE(v), 797f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) &xcol, &exact, &alloced ); 798f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!exact) { 79958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) colorsfailed++; 8008bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 8011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (alloced) { 8025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu assert(buffer->num_alloced<256); 80358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) buffer->alloced_colors[buffer->num_alloced] = xcol.pixel; 80458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) buffer->num_alloced++; 80558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 80658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) i = DITH_MIX( r, g, b ); 80758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) assert(i < 576); 80858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) buffer->color_table[i] = xcol.pixel; 80958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) assert(xcol.pixel < 65536); 81058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) buffer->pixel_to_r[xcol.pixel] = r * 255 / (DITH_R-1); 81158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) buffer->pixel_to_g[xcol.pixel] = g * 255 / (DITH_G-1); 8121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci buffer->pixel_to_b[xcol.pixel] = b * 255 / (DITH_B-1); 8131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 8141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 8151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 8161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 8171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (colorsfailed && _mesa_getenv("MESA_DEBUG")) { 8181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci _mesa_warning(NULL, 8191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "Note: %d out of %d needed colors do not match exactly.\n", 8201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci colorsfailed, DITH_R * DITH_G * DITH_B ); 8211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 8221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 8231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 8241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 8251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci v->dithered_pf = PF_Dither; 8261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci v->undithered_pf = PF_Lookup; 8271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return GL_TRUE; 8281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 8291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 8301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 8311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci/** 8321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * Setup for Hewlett Packard Color Recovery 8-bit TrueColor mode. 8331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * HPCR simulates 24-bit color fidelity with an 8-bit frame buffer. 8341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * Special dithering tables have to be initialized. 8351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci */ 8361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic void 8371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccisetup_8bit_hpcr(XMesaVisual v) 8381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 8391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* HP Color Recovery contributed by: Alex De Bruyn (ad@lms.be) 8401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * To work properly, the atom _HP_RGB_SMOOTH_MAP_LIST must be defined 8411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * on the root window AND the colormap obtainable by XGetRGBColormaps 8421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * for that atom must be set on the window. (see also tkInitWindow) 8431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * If that colormap is not set, the output will look stripy. 84458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) */ 84558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 84658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) /* Setup color tables with gamma correction */ 84758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) int i; 84858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) double g; 84958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 850f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) g = 1.0 / v->RedGamma; 851f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) for (i=0; i<256; i++) { 85258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GLint red = IROUND_POS(255.0 * _mesa_pow( hpcr_rgbTbl[0][i]/255.0, g )); 8538bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) v->hpcr_rgbTbl[0][i] = CLAMP( red, 16, 239 ); 8541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 85558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 85658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) g = 1.0 / v->GreenGamma; 85758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) for (i=0; i<256; i++) { 85858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) GLint green = IROUND_POS(255.0 * _mesa_pow( hpcr_rgbTbl[1][i]/255.0, g )); 8590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch v->hpcr_rgbTbl[1][i] = CLAMP( green, 16, 239 ); 8600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 8611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 8620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch g = 1.0 / v->BlueGamma; 8630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch for (i=0; i<256; i++) { 864f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GLint blue = IROUND_POS(255.0 * _mesa_pow( hpcr_rgbTbl[2][i]/255.0, g )); 865f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) v->hpcr_rgbTbl[2][i] = CLAMP( blue, 32, 223 ); 866f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 8670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch v->undithered_pf = PF_HPCR; /* can't really disable dithering for now */ 8680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch v->dithered_pf = PF_HPCR; 869f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 8700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch /* which method should I use to clear */ 8710529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch /* GL_FALSE: keep the ordinary method */ 8721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* GL_TRUE : clear with dither pattern */ 8730529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch v->hpcr_clear_flag = _mesa_getenv("MESA_HPCR_CLEAR") ? GL_TRUE : GL_FALSE; 874f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 8750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (v->hpcr_clear_flag) { 8760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch v->hpcr_clear_pixmap = XMesaCreatePixmap(v->display, 8771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DefaultRootWindow(v->display), 8780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 16, 2, 8); 879f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#ifndef XFree86Server 8800529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch v->hpcr_clear_ximage = XGetImage(v->display, v->hpcr_clear_pixmap, 8810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 0, 0, 16, 2, AllPlanes, ZPixmap); 8820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#endif 8830529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 8840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 8850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 8860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 8870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch/** 8881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * Setup RGB rendering for a window with a True/DirectColor visual. 8890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch */ 890f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)static void 8910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochsetup_truecolor(XMesaVisual v, XMesaBuffer buffer, XMesaColormap cmap) 8920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch{ 8931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci unsigned long rmask, gmask, bmask; 8940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch (void) buffer; 8950529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch (void) cmap; 896f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 897f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) /* Compute red multiplier (mask) and bit shift */ 898f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) v->rshift = 0; 899f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) rmask = GET_REDMASK(v); 900f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) while ((rmask & 1)==0) { 901f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) v->rshift++; 9021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci rmask = rmask >> 1; 9031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 9041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 9051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* Compute green multiplier (mask) and bit shift */ 9061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci v->gshift = 0; 9071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci gmask = GET_GREENMASK(v); 9081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci while ((gmask & 1)==0) { 9091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci v->gshift++; 9101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci gmask = gmask >> 1; 9111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 9121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 9131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* Compute blue multiplier (mask) and bit shift */ 9141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci v->bshift = 0; 9151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bmask = GET_BLUEMASK(v); 9161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci while ((bmask & 1)==0) { 917f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) v->bshift++; 918f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bmask = bmask >> 1; 919f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 920f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 9211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* 922f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) * Compute component-to-pixel lookup tables and dithering kernel 923116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch */ 924116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch { 925116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch static GLubyte kernel[16] = { 926116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 0*16, 8*16, 2*16, 10*16, 927116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 12*16, 4*16, 14*16, 6*16, 928116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 3*16, 11*16, 1*16, 9*16, 929116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 15*16, 7*16, 13*16, 5*16, 9301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci }; 931116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GLint rBits = _mesa_bitcount(rmask); 932116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GLint gBits = _mesa_bitcount(gmask); 933116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GLint bBits = _mesa_bitcount(bmask); 934116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GLint maxBits; 9351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GLuint i; 936116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 937f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) /* convert pixel components in [0,_mask] to RGB values in [0,255] */ 938f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) for (i=0; i<=rmask; i++) 939f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) v->PixelToR[i] = (unsigned char) ((i * 255) / rmask); 940f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) for (i=0; i<=gmask; i++) 941f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) v->PixelToG[i] = (unsigned char) ((i * 255) / gmask); 9420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch for (i=0; i<=bmask; i++) 9430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch v->PixelToB[i] = (unsigned char) ((i * 255) / bmask); 944f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 9450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch /* convert RGB values from [0,255] to pixel components */ 9460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 9471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (i=0;i<256;i++) { 9480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch GLint r = gamma_adjust(v->RedGamma, i, 255); 9490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch GLint g = gamma_adjust(v->GreenGamma, i, 255); 9500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch GLint b = gamma_adjust(v->BlueGamma, i, 255); 951f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) v->RtoPixel[i] = (r >> (8-rBits)) << v->rshift; 9521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci v->GtoPixel[i] = (g >> (8-gBits)) << v->gshift; 953f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) v->BtoPixel[i] = (b >> (8-bBits)) << v->bshift; 954f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 955f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) /* overflow protection */ 956f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) for (i=256;i<512;i++) { 957f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) v->RtoPixel[i] = v->RtoPixel[255]; 958f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) v->GtoPixel[i] = v->GtoPixel[255]; 959f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) v->BtoPixel[i] = v->BtoPixel[255]; 960f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 961f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 962f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) /* setup dithering kernel */ 9631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci maxBits = rBits; 964f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (gBits > maxBits) maxBits = gBits; 965f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (bBits > maxBits) maxBits = bBits; 966f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) for (i=0;i<16;i++) { 9670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch v->Kernel[i] = kernel[i] >> maxBits; 9680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 969116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 970116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch v->undithered_pf = PF_Truecolor; 971116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch v->dithered_pf = (GET_VISUAL_DEPTH(v)<24) ? PF_Dither_True : PF_Truecolor; 972116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 973116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 974116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch /* 975116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch * Now check for TrueColor visuals which we can optimize. 976116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch */ 977116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if ( GET_REDMASK(v) ==0x0000ff 978116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch && GET_GREENMASK(v)==0x00ff00 979116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch && GET_BLUEMASK(v) ==0xff0000 9801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci && CHECK_BYTE_ORDER(v) 981116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch && v->BitsPerPixel==32 982116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch && v->RedGamma==1.0 && v->GreenGamma==1.0 && v->BlueGamma==1.0) { 983116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch /* common 32 bpp config used on SGI, Sun */ 984116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch v->undithered_pf = v->dithered_pf = PF_8A8B8G8R; /* ABGR */ 985116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 986116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch else if (GET_REDMASK(v) == 0xff0000 987116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch && GET_GREENMASK(v)== 0x00ff00 988116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch && GET_BLUEMASK(v) == 0x0000ff 989116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch && CHECK_BYTE_ORDER(v) 990116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch && v->RedGamma == 1.0 && v->GreenGamma == 1.0 && v->BlueGamma == 1.0){ 991116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (v->BitsPerPixel==32) { 992116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch /* if 32 bpp, and visual indicates 8 bpp alpha channel */ 993116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (GET_VISUAL_DEPTH(v) == 32 && v->mesa_visual.alphaBits == 8) 994116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch v->undithered_pf = v->dithered_pf = PF_8A8R8G8B; /* ARGB */ 995116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch else 996116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch v->undithered_pf = v->dithered_pf = PF_8R8G8B; /* xRGB */ 9971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 998116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch else if (v->BitsPerPixel == 24) { 999116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch v->undithered_pf = v->dithered_pf = PF_8R8G8B24; /* RGB */ 1000116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 1001116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 1002116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch else if (GET_REDMASK(v) ==0xf800 1003116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch && GET_GREENMASK(v)==0x07e0 1004116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch && GET_BLUEMASK(v) ==0x001f 1005116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch && CHECK_BYTE_ORDER(v) 1006116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch && v->BitsPerPixel==16 1007116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch && v->RedGamma==1.0 && v->GreenGamma==1.0 && v->BlueGamma==1.0) { 1008116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch /* 5-6-5 RGB */ 1009116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch v->undithered_pf = PF_5R6G5B; 1010116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch v->dithered_pf = PF_Dither_5R6G5B; 1011116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 10121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci else if (GET_REDMASK(v) ==0xe0 1013116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch && GET_GREENMASK(v)==0x1c 1014116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch && GET_BLUEMASK(v) ==0x03 1015116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch && CHECK_FOR_HPCR(v)) { 1016116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch /* 8-bit HP color recovery */ 1017116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch setup_8bit_hpcr( v ); 1018116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 1019116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 1020116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1021116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1022116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1023116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch/** 1024116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch * Setup RGB rendering for a window with a monochrome visual. 1025116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch */ 1026116680a4aac90f2aa7413d9095a592090648e557Ben Murdochstatic void 1027116680a4aac90f2aa7413d9095a592090648e557Ben Murdochsetup_monochrome( XMesaVisual v, XMesaBuffer b ) 10281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci{ 1029116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch (void) b; 1030116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch v->dithered_pf = v->undithered_pf = PF_1Bit; 1031116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch /* if black=1 then we must flip pixel values */ 1032116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch v->bitFlip = (GET_BLACK_PIXEL(v) != 0); 1033116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 1034116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1035116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1036116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1037116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch/** 1038116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch * When a context is bound for the first time, we can finally finish 1039116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch * initializing the context's visual and buffer information. 1040116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch * \param v the XMesaVisual to initialize 1041116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch * \param b the XMesaBuffer to initialize (may be NULL) 1042116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch * \param rgb_flag TRUE = RGBA mode, FALSE = color index mode 1043116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch * \param window the window/pixmap we're rendering into 1044116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch * \param cmap the colormap associated with the window/pixmap 1045116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch * \return GL_TRUE=success, GL_FALSE=failure 1046116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch */ 10471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic GLboolean 1048116680a4aac90f2aa7413d9095a592090648e557Ben Murdochinitialize_visual_and_buffer(XMesaVisual v, XMesaBuffer b, 1049116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GLboolean rgb_flag, XMesaDrawable window, 1050116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch XMesaColormap cmap) 1051116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch{ 1052116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int client = 0; 1053116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1054116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#ifdef XFree86Server 1055116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch client = (window) ? CLIENT_ID(window->id) : 0; 1056116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif 1057116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1058116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ASSERT(!b || b->xm_visual == v); 1059116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1060116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch /* Save true bits/pixel */ 1061116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch v->BitsPerPixel = bits_per_pixel(v); 1062116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch assert(v->BitsPerPixel > 0); 1063116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1064116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (rgb_flag == GL_FALSE) { 1065116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch /* COLOR-INDEXED WINDOW: 1066116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch * Even if the visual is TrueColor or DirectColor we treat it as 1067116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch * being color indexed. This is weird but might be useful to someone. 1068116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch */ 1069116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch v->dithered_pf = v->undithered_pf = PF_Index; 1070116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch v->mesa_visual.indexBits = GET_VISUAL_DEPTH(v); 1071116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 1072116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch else { 1073116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch /* RGB WINDOW: 1074116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch * We support RGB rendering into almost any kind of visual. 1075116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch */ 1076116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const int xclass = v->mesa_visual.visualType; 1077116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (xclass == GLX_TRUE_COLOR || xclass == GLX_DIRECT_COLOR) { 1078116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch setup_truecolor( v, b, cmap ); 1079116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 1080116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch else if (xclass == GLX_STATIC_GRAY && GET_VISUAL_DEPTH(v) == 1) { 1081116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch setup_monochrome( v, b ); 1082116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 1083116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch else if (xclass == GLX_GRAY_SCALE || xclass == GLX_STATIC_GRAY) { 1084116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!setup_grayscale( client, v, b, cmap )) { 1085116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return GL_FALSE; 1086116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 1087116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 1088116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch else if ((xclass == GLX_PSEUDO_COLOR || xclass == GLX_STATIC_COLOR) 1089116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch && GET_VISUAL_DEPTH(v)>=4 && GET_VISUAL_DEPTH(v)<=16) { 1090116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!setup_dithered_color( client, v, b, cmap )) { 1091116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return GL_FALSE; 1092116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 109358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 109458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) else { 109558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) _mesa_warning(NULL, "XMesa: RGB mode rendering not supported in given visual.\n"); 1096f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return GL_FALSE; 1097f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 1098f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) v->mesa_visual.indexBits = 0; 109958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 110058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (_mesa_getenv("MESA_NO_DITHER")) { 110158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) v->dithered_pf = v->undithered_pf; 1102f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 1103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 1104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 110558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 110658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) /* 110758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) * If MESA_INFO env var is set print out some debugging info 110858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) * which can help Brian figure out what's going on when a user 1109f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * reports bugs. 1110f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) */ 1111f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (_mesa_getenv("MESA_INFO")) { 1112f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) _mesa_printf("X/Mesa visual = %p\n", (void *) v); 1113f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) _mesa_printf("X/Mesa dithered pf = %u\n", v->dithered_pf); 111458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) _mesa_printf("X/Mesa undithered pf = %u\n", v->undithered_pf); 11158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) _mesa_printf("X/Mesa level = %d\n", v->mesa_visual.level); 11161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci _mesa_printf("X/Mesa depth = %d\n", GET_VISUAL_DEPTH(v)); 11171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci _mesa_printf("X/Mesa bits per pixel = %d\n", v->BitsPerPixel); 11188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 11191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 11201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (b && window) { 11218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) char *data; 11221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 11231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* Do window-specific initializations */ 11248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 11251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* these should have been set in create_xmesa_buffer */ 11261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT(b->frontxrb->drawable == window); 11278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) ASSERT(b->frontxrb->pixmap == (XMesaPixmap) window); 11281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 11291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* Setup for single/double buffering */ 11305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (v->mesa_visual.doubleBufferMode) { 11311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci /* Double buffered */ 11321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci b->shm = check_for_xshm( v->display ); 11338bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 113458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 113558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) /* X11 graphics contexts */ 1136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#ifdef XFree86Server 11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) b->gc = CreateScratchGC(v->display, window->depth); 11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) b->gc = XCreateGC( v->display, window, 0, NULL ); 1140a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif 114146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) XMesaSetFunction( v->display, b->gc, GXcopy ); 11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1143cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) /* cleargc - for glClear() */ 11445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#ifdef XFree86Server 1145cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) b->cleargc = CreateScratchGC(v->display, window->depth); 1146cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#else 11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) b->cleargc = XCreateGC( v->display, window, 0, NULL ); 11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) XMesaSetFunction( v->display, b->cleargc, GXcopy ); 11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Don't generate Graphics Expose/NoExpose events in swapbuffers(). 11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Patch contributed by Michael Pichler May 15, 1995. 1154a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 115546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#ifdef XFree86Server 1156868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) b->swapgc = CreateScratchGC(v->display, window->depth); 11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CARD32 v[1]; 11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v[0] = FALSE; 11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dixChangeGC(NullClient, b->swapgc, GCGraphicsExposures, v, NULL); 11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1162cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#else 1163116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch { 1164cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) XGCValues gcvalues; 1165cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) gcvalues.graphics_exposures = False; 11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) b->swapgc = XCreateGC(v->display, window, 11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GCGraphicsExposures, &gcvalues); 11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XMesaSetFunction( v->display, b->swapgc, GXcopy ); 11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Set fill style and tile pixmap once for all for HPCR stuff 11738bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) * (instead of doing it each time in clear_color_HPCR_pixmap()) 117446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) * Initialize whole stuff 117546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) * Patch contributed by Jacques Leroy March 8, 1998. 1176a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) */ 11778bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (v->hpcr_clear_flag && b->backxrb && b->backxrb->pixmap) { 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i; 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < 16; i++) { 11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XMesaPutPixel(v->hpcr_clear_ximage, i, 0, 0); 11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XMesaPutPixel(v->hpcr_clear_ximage, i, 1, 0); 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XMesaPutImage(b->display, (XMesaDrawable) v->hpcr_clear_pixmap, 11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) b->cleargc, v->hpcr_clear_ximage, 0, 0, 0, 0, 16, 2); 11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XMesaSetFillStyle( v->display, b->cleargc, FillTiled); 11868bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) XMesaSetTile( v->display, b->cleargc, v->hpcr_clear_pixmap ); 11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Initialize the row buffer XImage for use in write_color_span() */ 11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data = (char*) MALLOC(MAX_WIDTH*4); 11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef XFree86Server 11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) b->rowimage = XMesaCreateImage(GET_VISUAL_DEPTH(v), MAX_WIDTH, 1, data); 11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) b->rowimage = XCreateImage( v->display, 11958bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) v->visinfo->visual, 11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v->visinfo->depth, 11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ZPixmap, 0, /*format, offset*/ 11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data, /*data*/ 11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MAX_WIDTH, 1, /*width, height*/ 12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32, /*bitmap_pad*/ 12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0 /*bytes_per_line*/ ); 1202f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif 1203f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!b->rowimage) 1204f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return GL_FALSE; 1205f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 1206f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 1207f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return GL_TRUE; 1208f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 1209f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 1210f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 1211f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 1212f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)/* 1213f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) * Convert an RGBA color to a pixel value. 1214f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) */ 12151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciunsigned long 1216f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)xmesa_color_to_pixel(GLcontext *ctx, 1217f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GLubyte r, GLubyte g, GLubyte b, GLubyte a, 1218f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GLuint pixelFormat) 1219f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles){ 1220f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) XMesaContext xmesa = XMESA_CONTEXT(ctx); 1221f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) switch (pixelFormat) { 1222f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case PF_Index: 1223f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return 0; 1224f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case PF_Truecolor: 1225f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) { 1226f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) unsigned long p; 1227f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) PACK_TRUECOLOR( p, r, g, b ); 1228f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return p; 1229f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 1230f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case PF_8A8B8G8R: 1231f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return PACK_8A8B8G8R( r, g, b, a ); 1232f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case PF_8A8R8G8B: 1233f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return PACK_8A8R8G8B( r, g, b, a ); 12341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case PF_8R8G8B: 1235f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) /* fall through */ 1236f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case PF_8R8G8B24: 1237f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return PACK_8R8G8B( r, g, b ); 1238f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case PF_5R6G5B: 1239f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return PACK_5R6G5B( r, g, b ); 1240f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case PF_Dither: 1241f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) { 12423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DITHER_SETUP; 12433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return DITHER( 1, 0, r, g, b ); 12443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 12453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) case PF_1Bit: 12463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) /* 382 = (3*255)/2 */ 12473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return ((r+g+b) > 382) ^ xmesa->xm_visual->bitFlip; 12483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) case PF_HPCR: 12493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return DITHER_HPCR(1, 1, r, g, b); 12503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) case PF_Lookup: 12513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) { 12523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) LOOKUP_SETUP; 12533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return LOOKUP( r, g, b ); 12543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 1255c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch case PF_Grayscale: 12568bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return GRAY_RGB( r, g, b ); 125746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) case PF_Dither_True: 125846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) /* fall through */ 1259a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) case PF_Dither_5R6G5B: 12608bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) { 12613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) unsigned long p; 1262cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PACK_TRUEDITHER(p, 1, 0, r, g, b); 1263116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return p; 12643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 12653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) default: 12663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) _mesa_problem(ctx, "Bad pixel format in xmesa_color_to_pixel"); 12673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 12683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return 0; 126946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 12708bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 12713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 1272cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#define NUM_VISUAL_TYPES 6 1273116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 12743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)/** 12753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) * Convert an X visual type to a GLX visual type. 1276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * 12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * \param visualType X visual type (i.e., \c TrueColor, \c StaticGray, etc.) 12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * to be converted. 12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * \return If \c visualType is a valid X visual type, a GLX visual type will 12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * be returned. Otherwise \c GLX_NONE will be returned. 128146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) * 128246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) * \note 1283a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * This code was lifted directly from lib/GL/glx/glcontextmodes.c in the 128446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) * DRI CVS tree. 1285116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch */ 12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static GLint 12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)xmesa_convert_from_x_visual_type( int visualType ) 12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 1289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static const int glx_visual_types[ NUM_VISUAL_TYPES ] = { 1290ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch GLX_STATIC_GRAY, GLX_GRAY_SCALE, 12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLX_STATIC_COLOR, GLX_PSEUDO_COLOR, 12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLX_TRUE_COLOR, GLX_DIRECT_COLOR 12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 129546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return ( (unsigned) visualType < NUM_VISUAL_TYPES ) 129646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ? glx_visual_types[ visualType ] : GLX_NONE; 1297a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 129846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**********************************************************************/ 13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/***** Public Functions *****/ 13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**********************************************************************/ 13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1305ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#ifdef IN_DRI_DRIVER 13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define need_GL_VERSION_1_3 13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define need_GL_VERSION_1_4 13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define need_GL_VERSION_1_5 13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define need_GL_VERSION_2_0 131046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 131146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)/* sw extensions for imaging */ 1312a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#define need_GL_EXT_blend_color 131346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#define need_GL_EXT_blend_minmax 13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define need_GL_EXT_convolution 13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define need_GL_EXT_histogram 13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define need_GL_SGI_color_table 13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* sw extensions not associated with some GL version */ 13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define need_GL_ARB_shader_objects 13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define need_GL_ARB_vertex_program 13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define need_GL_APPLE_vertex_array_object 13225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define need_GL_ATI_fragment_shader 13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define need_GL_EXT_depth_bounds_test 13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define need_GL_EXT_framebuffer_object 13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define need_GL_EXT_framebuffer_blit 13265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define need_GL_EXT_gpu_program_parameters 13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define need_GL_EXT_paletted_texture 13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define need_GL_MESA_resize_buffers 13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define need_GL_NV_vertex_program 13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define need_GL_NV_fragment_program 1331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1332ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "extension_helper.h" 13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "utils.h" 13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const struct dri_extension card_extensions[] = 13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 133746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) { "GL_VERSION_1_3", GL_VERSION_1_3_functions }, 133846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) { "GL_VERSION_1_4", GL_VERSION_1_4_functions }, 1339a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) { "GL_VERSION_1_5", GL_VERSION_1_5_functions }, 134046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) { "GL_VERSION_2_0", GL_VERSION_2_0_functions }, 13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "GL_EXT_blend_color", GL_EXT_blend_color_functions }, 13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "GL_EXT_blend_minmax", GL_EXT_blend_minmax_functions }, 13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "GL_EXT_convolution", GL_EXT_convolution_functions }, 13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "GL_EXT_histogram", GL_EXT_histogram_functions }, 13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "GL_SGI_color_table", GL_SGI_color_table_functions }, 13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { "GL_ARB_shader_objects", GL_ARB_shader_objects_functions }, 13495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { "GL_ARB_vertex_program", GL_ARB_vertex_program_functions }, 13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "GL_APPLE_vertex_array_object", GL_APPLE_vertex_array_object_functions }, 13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "GL_ATI_fragment_shader", GL_ATI_fragment_shader_functions }, 13525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { "GL_EXT_depth_bounds_test", GL_EXT_depth_bounds_test_functions }, 13535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { "GL_EXT_framebuffer_object", GL_EXT_framebuffer_object_functions }, 13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "GL_EXT_framebuffer_blit", GL_EXT_framebuffer_blit_functions }, 13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "GL_EXT_gpu_program_parameters", GL_EXT_gpu_program_parameters_functions }, 1356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { "GL_EXT_paletted_texture", GL_EXT_paletted_texture_functions }, 13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "GL_MESA_resize_buffers", GL_MESA_resize_buffers_functions }, 13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "GL_NV_vertex_program", GL_NV_vertex_program_functions }, 13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { "GL_NV_fragment_program", GL_NV_fragment_program_functions }, 13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { NULL, NULL } 1361a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 136246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#endif 13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* 13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Create a new X/Mesa visual. 13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Input: display - X11 display 136746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) * visinfo - an XVisualInfo pointer 13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * rgb_flag - GL_TRUE = RGB mode, 13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * GL_FALSE = color index mode 13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * alpha_flag - alpha buffer requested? 1371c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch * db_flag - GL_TRUE = double-buffered, 1372c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch * GL_FALSE = single buffered 1373c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch * stereo_flag - stereo visual? 1374c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch * ximage_flag - GL_TRUE = use an XImage for back buffer, 1375c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch * GL_FALSE = use an off-screen pixmap for back buffer 1376c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch * depth_size - requested bits/depth values, or zero 1377c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch * stencil_size - requested bits/stencil values, or zero 1378c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch * accum_red_size - requested bits/red accum values, or zero 1379c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch * accum_green_size - requested bits/green accum values, or zero 1380c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch * accum_blue_size - requested bits/blue accum values, or zero 1381c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch * accum_alpha_size - requested bits/alpha accum values, or zero 138246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) * num_samples - number of samples/pixel if multisampling, or zero 1383c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch * level - visual level, usually 0 1384c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch * visualCaveat - ala the GLX extension, usually GLX_NONE 1385c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch * Return; a new XMesaVisual or 0 if error. 1386c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch */ 1387c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochPUBLIC 1388c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochXMesaVisual XMesaCreateVisual( XMesaDisplay *display, 1389c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch XMesaVisualInfo visinfo, 1390c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch GLboolean rgb_flag, 1391c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch GLboolean alpha_flag, 1392c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch GLboolean db_flag, 1393c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch GLboolean stereo_flag, 1394c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch GLboolean ximage_flag, 1395c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch GLint depth_size, 1396c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch GLint stencil_size, 1397c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch GLint accum_red_size, 1398c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch GLint accum_green_size, 1399c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch GLint accum_blue_size, 1400c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch GLint accum_alpha_size, 1401c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch GLint num_samples, 1402c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch GLint level, 1403c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch GLint visualCaveat ) 1404c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch{ 1405c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch char *gamma; 1406c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch XMesaVisual v; 1407c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch GLint red_bits, green_bits, blue_bits, alpha_bits; 1408c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1409c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#ifdef IN_DRI_DRIVER 1410c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch /* driInitExtensions() should be called once per screen to setup extension 1411c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch * indices. There is no need to call it when the context is created since 1412c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch * XMesa enables mesa sw extensions on its own. 1413c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch */ 1414c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch driInitExtensions( NULL, card_extensions, GL_FALSE ); 1415c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif 1416c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1417c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#ifndef XFree86Server 1418c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch /* For debugging only */ 1419c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if (_mesa_getenv("MESA_XSYNC")) { 14204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) /* This makes debugging X easier. 14214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * In your debugger, set a breakpoint on _XError to stop when an 14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * X protocol error is generated. 14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XSynchronize( display, 1 ); 14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v = (XMesaVisual) CALLOC_STRUCT(xmesa_visual); 14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!v) { 14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v->display = display; 14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Save a copy of the XVisualInfo struct because the user may X_mesa_free() 14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * the struct but we may need some of the information contained in it 14374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * at a later time. 14388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) */ 14398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#ifndef XFree86Server 14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v->visinfo = (XVisualInfo *) MALLOC(sizeof(*visinfo)); 14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if(!v->visinfo) { 14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _mesa_free(v); 14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MEMCPY(v->visinfo, visinfo, sizeof(*visinfo)); 14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* check for MESA_GAMMA environment variable */ 14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gamma = _mesa_getenv("MESA_GAMMA"); 14504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (gamma) { 14518bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) v->RedGamma = v->GreenGamma = v->BlueGamma = 0.0; 14528bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) sscanf( gamma, "%f %f %f", &v->RedGamma, &v->GreenGamma, &v->BlueGamma ); 14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (v->RedGamma<=0.0) v->RedGamma = 1.0; 14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (v->GreenGamma<=0.0) v->GreenGamma = v->RedGamma; 14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (v->BlueGamma<=0.0) v->BlueGamma = v->RedGamma; 14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else { 14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v->RedGamma = v->GreenGamma = v->BlueGamma = 1.0; 14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) v->ximage_flag = ximage_flag; 14628bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 14638bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#ifdef XFree86Server 14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* We could calculate these values by ourselves. nplanes is either the sum 14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * of the red, green, and blue bits or the number index bits. 14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ColormapEntries is either (1U << index_bits) or 14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * (1U << max(redBits, greenBits, blueBits)). 14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(visinfo->nplanes > 0); 14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v->nplanes = visinfo->nplanes; 14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v->ColormapEntries = visinfo->ColormapEntries; 14724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 14738bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) v->mesa_visual.redMask = visinfo->redMask; 14748bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) v->mesa_visual.greenMask = visinfo->greenMask; 14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v->mesa_visual.blueMask = visinfo->blueMask; 14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v->mesa_visual.visualID = visinfo->vid; 14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v->mesa_visual.screen = 0; /* FIXME: What should be done here? */ 14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v->mesa_visual.redMask = visinfo->red_mask; 14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v->mesa_visual.greenMask = visinfo->green_mask; 14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v->mesa_visual.blueMask = visinfo->blue_mask; 14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v->mesa_visual.visualID = visinfo->visualid; 14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v->mesa_visual.screen = visinfo->screen; 14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(XFree86Server) || !(defined(__cplusplus) || defined(c_plusplus)) 14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v->mesa_visual.visualType = xmesa_convert_from_x_visual_type(visinfo->class); 14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 14894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) v->mesa_visual.visualType = xmesa_convert_from_x_visual_type(visinfo->c_class); 14908bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#endif 14918bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v->mesa_visual.visualRating = visualCaveat; 14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (alpha_flag) 14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v->mesa_visual.alphaBits = 8; 14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (void) initialize_visual_and_buffer( v, NULL, rgb_flag, 0, 0 ); 14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int xclass = v->mesa_visual.visualType; 15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (xclass == GLX_TRUE_COLOR || xclass == GLX_DIRECT_COLOR) { 15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) red_bits = _mesa_bitcount(GET_REDMASK(v)); 15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) green_bits = _mesa_bitcount(GET_GREENMASK(v)); 15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) blue_bits = _mesa_bitcount(GET_BLUEMASK(v)); 15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else { 15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* this is an approximation */ 15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int depth; 15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) depth = GET_VISUAL_DEPTH(v); 15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) red_bits = depth / 3; 15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) depth -= red_bits; 15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) green_bits = depth / 2; 15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) depth -= green_bits; 15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) blue_bits = depth; 15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) alpha_bits = 0; 15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert( red_bits + green_bits + blue_bits == GET_VISUAL_DEPTH(v) ); 15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) alpha_bits = v->mesa_visual.alphaBits; 15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 15218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) _mesa_initialize_visual( &v->mesa_visual, 15228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) rgb_flag, db_flag, stereo_flag, 15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) red_bits, green_bits, 15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) blue_bits, alpha_bits, 15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) v->mesa_visual.indexBits, 15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) depth_size, 15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) stencil_size, 15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) accum_red_size, accum_green_size, 15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) accum_blue_size, accum_alpha_size, 15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0 ); 15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* XXX minor hack */ 15334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) v->mesa_visual.level = level; 15348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return v; 15358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PUBLIC 15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void XMesaDestroyVisual( XMesaVisual v ) 15404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles){ 15414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#ifndef XFree86Server 15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _mesa_free(v->visinfo); 15434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif 15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _mesa_free(v); 15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Create a new XMesaContext. 15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * \param v the XMesaVisual 15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * \param share_list another XMesaContext with which to share display 15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * lists or NULL if no sharing is wanted. 15544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * \return an XMesaContext or NULL if error. 1555f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) */ 1556f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)PUBLIC 15574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)XMesaContext XMesaCreateContext( XMesaVisual v, XMesaContext share_list ) 15588bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles){ 15598bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) static GLboolean firstTime = GL_TRUE; 15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XMesaContext c; 15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLcontext *mesaCtx; 15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct dd_function_table functions; 15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TNLcontext *tnl; 15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (firstTime) { 15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _glthread_INIT_MUTEX(_xmesa_lock); 15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) firstTime = GL_FALSE; 15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Note: the XMesaContext contains a Mesa GLcontext struct (inheritance) */ 15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c = (XMesaContext) CALLOC_STRUCT(xmesa_context); 15724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!c) 15738bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return NULL; 15748bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mesaCtx = &(c->mesa); 15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* initialize with default driver functions, then plug in XMesa funcs */ 15784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) _mesa_init_driver_functions(&functions); 15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmesa_init_driver_functions(v, &functions); 15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!_mesa_initialize_context(mesaCtx, &v->mesa_visual, 15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) share_list ? &(share_list->mesa) : (GLcontext *) NULL, 15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &functions, (void *) c)) { 15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _mesa_free(c); 15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _mesa_enable_sw_extensions(mesaCtx); 15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _mesa_enable_1_3_extensions(mesaCtx); 15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _mesa_enable_1_4_extensions(mesaCtx); 15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _mesa_enable_1_5_extensions(mesaCtx); 15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _mesa_enable_2_0_extensions(mesaCtx); 15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _mesa_enable_2_1_extensions(mesaCtx); 15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if ENABLE_EXT_texure_compression_s3tc 15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (mesaCtx->Mesa_DXTn) { 15954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) _mesa_enable_extension(mesaCtx, "GL_EXT_texture_compression_s3tc"); 15968bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) _mesa_enable_extension(mesaCtx, "GL_S3_s3tc"); 15978bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _mesa_enable_extension(mesaCtx, "GL_3DFX_texture_compression_FXT1"); 15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 16004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if ENABLE_EXT_timer_query 16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _mesa_enable_extension(mesaCtx, "GL_EXT_timer_query"); 16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef XFree86Server 16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* If we're running in the X server, do bounds checking to prevent 16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * segfaults and server crashes! 16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mesaCtx->Const.CheckArrayBounds = GL_TRUE; 16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* finish up xmesa context initializations */ 16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c->swapbytes = CHECK_BYTE_ORDER(v) ? GL_FALSE : GL_TRUE; 16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c->xm_visual = v; 16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c->xm_buffer = NULL; /* set later by XMesaMakeCurrent */ 16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) c->display = v->display; 16164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) c->pixelformat = v->dithered_pf; /* Dithering is enabled by default */ 16178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 16188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) /* Initialize the software rasterizer and helper modules. 16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!_swrast_CreateContext( mesaCtx ) || 16214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) !_vbo_CreateContext( mesaCtx ) || 16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !_tnl_CreateContext( mesaCtx ) || 16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !_swsetup_CreateContext( mesaCtx )) { 16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _mesa_free_context_data(&c->mesa); 16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _mesa_free(c); 16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* tnl setup */ 16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tnl = TNL_CONTEXT(mesaCtx); 16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tnl->Driver.RunPipeline = _tnl_run_pipeline; 16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* swrast setup */ 16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmesa_register_swrast_functions( mesaCtx ); 16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _swsetup_Wakeup(mesaCtx); 16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return c; 16378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 16388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)PUBLIC 16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void XMesaDestroyContext( XMesaContext c ) 16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLcontext *mesaCtx = &c->mesa; 16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef FX 16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FXdestroyContext( XMESA_BUFFER(mesaCtx->DrawBuffer) ); 16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _swsetup_DestroyContext( mesaCtx ); 16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _swrast_DestroyContext( mesaCtx ); 16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _tnl_DestroyContext( mesaCtx ); 16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _vbo_DestroyContext( mesaCtx ); 16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _mesa_free_context_data( mesaCtx ); 16554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) _mesa_free( c ); 16568bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 16578bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16608bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)/** 16618bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) * Private function for creating an XMesaBuffer which corresponds to an 16628bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) * X window or pixmap. 1663f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * \param v the window's XMesaVisual 16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * \param w the window we're wrapping 16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * \return new XMesaBuffer or NULL if error 16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PUBLIC XMesaBuffer 16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)XMesaCreateWindowBuffer(XMesaVisual v, XMesaWindow w) 16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef XFree86Server 16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XWindowAttributes attr; 16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XMesaBuffer b; 16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XMesaColormap cmap; 16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int depth; 16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(v); 16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(w); 16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Check that window depth matches visual depth */ 16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef XFree86Server 1682f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) depth = ((XMesaDrawable)w)->depth; 1683f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#else 1684f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) XGetWindowAttributes( v->display, w, &attr ); 1685f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) depth = attr.depth; 16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 16871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (GET_VISUAL_DEPTH(v) != depth) { 16881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci _mesa_warning(NULL, "XMesaCreateWindowBuffer: depth mismatch between visual (%d) and window (%d)!\n", 16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GET_VISUAL_DEPTH(v), depth); 16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* Find colormap */ 1694f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#ifdef XFree86Server 1695f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) cmap = (ColormapPtr)LookupIDByType(wColormap(w), RT_COLORMAP); 16961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#else 16971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (attr.colormap) { 16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cmap = attr.colormap; 16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else { 17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) _mesa_warning(NULL, "Window %u has no colormap!\n", (unsigned int) w); 17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* this is weird, a window w/out a colormap!? */ 1703f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) /* OK, let's just allocate a new one and hope for the best */ 1704f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) cmap = XCreateColormap(v->display, w, attr.visual, AllocNone); 17051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 17061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) b = create_xmesa_buffer((XMesaDrawable) w, WINDOW, v, cmap); 17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!b) 17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1712f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!initialize_visual_and_buffer( v, b, v->mesa_visual.rgbMode, 1713f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) (XMesaDrawable) w, cmap )) { 17141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci xmesa_free_buffer(b); 17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 17168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return b; 17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 1724f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * Create a new XMesaBuffer from an X pixmap. 1725f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * 17261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * \param v the XMesaVisual 17271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci * \param p the pixmap 17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * \param cmap the colormap, may be 0 if using a \c GLX_TRUE_COLOR or 17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * \c GLX_DIRECT_COLOR visual for the pixmap 17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * \returns new XMesaBuffer or NULL if error 17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PUBLIC XMesaBuffer 1733f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)XMesaCreatePixmapBuffer(XMesaVisual v, XMesaPixmap p, XMesaColormap cmap) 1734f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles){ 17351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci XMesaBuffer b; 17361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 17377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch assert(v); 17387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 17398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) b = create_xmesa_buffer((XMesaDrawable) p, PIXMAP, v, cmap); 17401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!b) 17411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return NULL; 17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!initialize_visual_and_buffer(v, b, v->mesa_visual.rgbMode, 1744c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) (XMesaDrawable) p, cmap)) { 17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmesa_free_buffer(b); 17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return b; 17505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 1754f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * For GLX_EXT_texture_from_pixmap 17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)XMesaBuffer 17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)XMesaCreatePixmapTextureBuffer(XMesaVisual v, XMesaPixmap p, 17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XMesaColormap cmap, 17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int format, int target, int mipmap) 17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GET_CURRENT_CONTEXT(ctx); 17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XMesaBuffer b; 17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GLuint width, height; 1764c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(v); 17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) b = create_xmesa_buffer((XMesaDrawable) p, PIXMAP, v, cmap); 17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!b) 17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* get pixmap size, update framebuffer/renderbuffer dims */ 1772f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) xmesa_get_window_size(v->display, b, &width, &height); 1773f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) _mesa_resize_framebuffer(NULL, &(b->mesa_buffer), width, height); 17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (target == 0) { 17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* examine dims */ 17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ctx->Extensions.ARB_texture_non_power_of_two) { 1778f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) target = GLX_TEXTURE_2D_EXT; 1779f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 17805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if ( _mesa_bitcount(width) == 1 17815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) && _mesa_bitcount(height) == 1) { 17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* power of two size */ 17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (height == 1) { 17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target = GLX_TEXTURE_1D_EXT; 17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1786f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) else { 1787f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) target = GLX_TEXTURE_2D_EXT; 17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1790f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) else if (ctx->Extensions.NV_texture_rectangle) { 1791f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) target = GLX_TEXTURE_RECTANGLE_EXT; 17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else { 17945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* non power of two textures not supported */ 1795c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) XMesaDestroyBuffer(b); 17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1799a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) b->TextureTarget = target; 18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) b->TextureFormat = format; 1802f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) b->TextureMipmap = mipmap; 1803f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1804a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (!initialize_visual_and_buffer(v, b, v->mesa_visual.rgbMode, 18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (XMesaDrawable) p, cmap)) { 18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) xmesa_free_buffer(b); 1807c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return NULL; 18082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 18092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 18102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return b; 18112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 18122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 181346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 181446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 1815a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)XMesaBuffer 181646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)XMesaCreatePBuffer(XMesaVisual v, XMesaColormap cmap, 18172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unsigned int width, unsigned int height) 18182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 18192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef XFree86Server 18202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) XMesaWindow root; 1821868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) XMesaDrawable drawable; /* X Pixmap Drawable */ 1822868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) XMesaBuffer b; 1823868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1824868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) /* allocate pixmap for front buffer */ 1825868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) root = RootWindow( v->display, v->visinfo->screen ); 1826868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) drawable = XCreatePixmap(v->display, root, width, height, 1827868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) v->visinfo->depth); 1828868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!drawable) 1829868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return NULL; 1830868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1831868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) b = create_xmesa_buffer(drawable, PBUFFER, v, cmap); 1832868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!b) 1833868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return NULL; 1834f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1835f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!initialize_visual_and_buffer(v, b, v->mesa_visual.rgbMode, 18361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci drawable, cmap)) { 18371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci xmesa_free_buffer(b); 1838868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return NULL; 1839868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 18408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 18413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return b; 18423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#else 18433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return 0; 184446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#endif 18453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 18463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 18473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 18483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 184946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)/* 18503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) * Deallocate an XMesaBuffer structure and all related info. 18518bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) */ 18528bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)PUBLIC void 18538bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)XMesaDestroyBuffer(XMesaBuffer b) 18548bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles){ 18553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) xmesa_free_buffer(b); 18568bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 18575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1858 1859/** 1860 * Query the current window size and update the corresponding GLframebuffer 1861 * and all attached renderbuffers. 1862 * Called when: 1863 * 1. the first time a buffer is bound to a context. 1864 * 2. from glViewport to poll for window size changes 1865 * 3. from the XMesaResizeBuffers() API function. 1866 * Note: it's possible (and legal) for xmctx to be NULL. That can happen 1867 * when resizing a buffer when no rendering context is bound. 1868 */ 1869void 1870xmesa_check_and_update_buffer_size(XMesaContext xmctx, XMesaBuffer drawBuffer) 1871{ 1872 GLuint width, height; 1873 xmesa_get_window_size(drawBuffer->display, drawBuffer, &width, &height); 1874 if (drawBuffer->mesa_buffer.Width != width || 1875 drawBuffer->mesa_buffer.Height != height) { 1876 GLcontext *ctx = xmctx ? &xmctx->mesa : NULL; 1877 _mesa_resize_framebuffer(ctx, &(drawBuffer->mesa_buffer), width, height); 1878 } 1879 drawBuffer->mesa_buffer.Initialized = GL_TRUE; /* XXX TEMPORARY? */ 1880} 1881 1882 1883/* 1884 * Bind buffer b to context c and make c the current rendering context. 1885 */ 1886GLboolean XMesaMakeCurrent( XMesaContext c, XMesaBuffer b ) 1887{ 1888 return XMesaMakeCurrent2( c, b, b ); 1889} 1890 1891 1892/* 1893 * Bind buffer b to context c and make c the current rendering context. 1894 */ 1895PUBLIC 1896GLboolean XMesaMakeCurrent2( XMesaContext c, XMesaBuffer drawBuffer, 1897 XMesaBuffer readBuffer ) 1898{ 1899 if (c) { 1900 if (!drawBuffer || !readBuffer) 1901 return GL_FALSE; /* must specify buffers! */ 1902 1903 if (&(c->mesa) == _mesa_get_current_context() 1904 && c->mesa.DrawBuffer == &drawBuffer->mesa_buffer 1905 && c->mesa.ReadBuffer == &readBuffer->mesa_buffer 1906 && XMESA_BUFFER(c->mesa.DrawBuffer)->wasCurrent) { 1907 /* same context and buffer, do nothing */ 1908 return GL_TRUE; 1909 } 1910 1911 c->xm_buffer = drawBuffer; 1912 1913#ifdef FX 1914 if (FXmakeCurrent( drawBuffer )) 1915 return GL_TRUE; 1916#endif 1917 1918 /* Call this periodically to detect when the user has begun using 1919 * GL rendering from multiple threads. 1920 */ 1921 _glapi_check_multithread(); 1922 1923 xmesa_check_and_update_buffer_size(c, drawBuffer); 1924 if (readBuffer != drawBuffer) 1925 xmesa_check_and_update_buffer_size(c, readBuffer); 1926 1927 _mesa_make_current(&(c->mesa), 1928 &drawBuffer->mesa_buffer, 1929 &readBuffer->mesa_buffer); 1930 1931 if (c->xm_visual->mesa_visual.rgbMode) { 1932 /* 1933 * Must recompute and set these pixel values because colormap 1934 * can be different for different windows. 1935 */ 1936 c->clearpixel = xmesa_color_to_pixel( &c->mesa, 1937 c->clearcolor[0], 1938 c->clearcolor[1], 1939 c->clearcolor[2], 1940 c->clearcolor[3], 1941 c->xm_visual->undithered_pf); 1942 XMesaSetForeground(c->display, drawBuffer->cleargc, c->clearpixel); 1943 } 1944 1945 /* Solution to Stephane Rehel's problem with glXReleaseBuffersMESA(): */ 1946 drawBuffer->wasCurrent = GL_TRUE; 1947 } 1948 else { 1949 /* Detach */ 1950 _mesa_make_current( NULL, NULL, NULL ); 1951 } 1952 return GL_TRUE; 1953} 1954 1955 1956/* 1957 * Unbind the context c from its buffer. 1958 */ 1959GLboolean XMesaUnbindContext( XMesaContext c ) 1960{ 1961 /* A no-op for XFree86 integration purposes */ 1962 return GL_TRUE; 1963} 1964 1965 1966XMesaContext XMesaGetCurrentContext( void ) 1967{ 1968 GET_CURRENT_CONTEXT(ctx); 1969 if (ctx) { 1970 XMesaContext xmesa = XMESA_CONTEXT(ctx); 1971 return xmesa; 1972 } 1973 else { 1974 return 0; 1975 } 1976} 1977 1978 1979XMesaBuffer XMesaGetCurrentBuffer( void ) 1980{ 1981 GET_CURRENT_CONTEXT(ctx); 1982 if (ctx) { 1983 XMesaBuffer xmbuf = XMESA_BUFFER(ctx->DrawBuffer); 1984 return xmbuf; 1985 } 1986 else { 1987 return 0; 1988 } 1989} 1990 1991 1992/* New in Mesa 3.1 */ 1993XMesaBuffer XMesaGetCurrentReadBuffer( void ) 1994{ 1995 GET_CURRENT_CONTEXT(ctx); 1996 if (ctx) { 1997 return XMESA_BUFFER(ctx->ReadBuffer); 1998 } 1999 else { 2000 return 0; 2001 } 2002} 2003 2004 2005#ifdef XFree86Server 2006PUBLIC 2007GLboolean XMesaForceCurrent(XMesaContext c) 2008{ 2009 if (c) { 2010 _glapi_set_dispatch(c->mesa.CurrentDispatch); 2011 2012 if (&(c->mesa) != _mesa_get_current_context()) { 2013 _mesa_make_current(&c->mesa, c->mesa.DrawBuffer, c->mesa.ReadBuffer); 2014 } 2015 } 2016 else { 2017 _mesa_make_current(NULL, NULL, NULL); 2018 } 2019 return GL_TRUE; 2020} 2021 2022 2023PUBLIC 2024GLboolean XMesaLoseCurrent(XMesaContext c) 2025{ 2026 (void) c; 2027 _mesa_make_current(NULL, NULL, NULL); 2028 return GL_TRUE; 2029} 2030 2031 2032PUBLIC 2033GLboolean XMesaCopyContext( XMesaContext xm_src, XMesaContext xm_dst, GLuint mask ) 2034{ 2035 _mesa_copy_context(&xm_src->mesa, &xm_dst->mesa, mask); 2036 return GL_TRUE; 2037} 2038#endif /* XFree86Server */ 2039 2040 2041#ifndef FX 2042GLboolean XMesaSetFXmode( GLint mode ) 2043{ 2044 (void) mode; 2045 return GL_FALSE; 2046} 2047#endif 2048 2049 2050 2051/* 2052 * Copy the back buffer to the front buffer. If there's no back buffer 2053 * this is a no-op. 2054 */ 2055PUBLIC 2056void XMesaSwapBuffers( XMesaBuffer b ) 2057{ 2058 GET_CURRENT_CONTEXT(ctx); 2059 2060 if (!b->backxrb) { 2061 /* single buffered */ 2062 return; 2063 } 2064 2065 /* If we're swapping the buffer associated with the current context 2066 * we have to flush any pending rendering commands first. 2067 */ 2068 if (ctx && ctx->DrawBuffer == &(b->mesa_buffer)) 2069 _mesa_notifySwapBuffers(ctx); 2070 2071 if (b->db_mode) { 2072#ifdef FX 2073 if (FXswapBuffers(b)) 2074 return; 2075#endif 2076 if (b->backxrb->ximage) { 2077 /* Copy Ximage (back buf) from client memory to server window */ 2078#if defined(USE_XSHM) && !defined(XFree86Server) 2079 if (b->shm) { 2080 /*_glthread_LOCK_MUTEX(_xmesa_lock);*/ 2081 XShmPutImage( b->xm_visual->display, b->frontxrb->drawable, 2082 b->swapgc, 2083 b->backxrb->ximage, 0, 0, 2084 0, 0, b->mesa_buffer.Width, b->mesa_buffer.Height, 2085 False ); 2086 /*_glthread_UNLOCK_MUTEX(_xmesa_lock);*/ 2087 } 2088 else 2089#endif 2090 { 2091 /*_glthread_LOCK_MUTEX(_xmesa_lock);*/ 2092 XMesaPutImage( b->xm_visual->display, b->frontxrb->drawable, 2093 b->swapgc, 2094 b->backxrb->ximage, 0, 0, 2095 0, 0, b->mesa_buffer.Width, b->mesa_buffer.Height ); 2096 /*_glthread_UNLOCK_MUTEX(_xmesa_lock);*/ 2097 } 2098 } 2099 else if (b->backxrb->pixmap) { 2100 /* Copy pixmap (back buf) to window (front buf) on server */ 2101 /*_glthread_LOCK_MUTEX(_xmesa_lock);*/ 2102 XMesaCopyArea( b->xm_visual->display, 2103 b->backxrb->pixmap, /* source drawable */ 2104 b->frontxrb->drawable, /* dest. drawable */ 2105 b->swapgc, 2106 0, 0, b->mesa_buffer.Width, b->mesa_buffer.Height, 2107 0, 0 /* dest region */ 2108 ); 2109 /*_glthread_UNLOCK_MUTEX(_xmesa_lock);*/ 2110 } 2111 2112 if (b->swAlpha) 2113 _mesa_copy_soft_alpha_renderbuffers(ctx, &b->mesa_buffer); 2114 } 2115#if !defined(XFree86Server) 2116 XSync( b->xm_visual->display, False ); 2117#endif 2118} 2119 2120 2121 2122/* 2123 * Copy sub-region of back buffer to front buffer 2124 */ 2125void XMesaCopySubBuffer( XMesaBuffer b, int x, int y, int width, int height ) 2126{ 2127 GET_CURRENT_CONTEXT(ctx); 2128 2129 /* If we're swapping the buffer associated with the current context 2130 * we have to flush any pending rendering commands first. 2131 */ 2132 if (ctx && ctx->DrawBuffer == &(b->mesa_buffer)) 2133 _mesa_notifySwapBuffers(ctx); 2134 2135 if (!b->backxrb) { 2136 /* single buffered */ 2137 return; 2138 } 2139 2140 if (b->db_mode) { 2141 int yTop = b->mesa_buffer.Height - y - height; 2142#ifdef FX 2143 if (FXswapBuffers(b)) 2144 return; 2145#endif 2146 if (b->backxrb->ximage) { 2147 /* Copy Ximage from host's memory to server's window */ 2148#if defined(USE_XSHM) && !defined(XFree86Server) 2149 if (b->shm) { 2150 /* XXX assuming width and height aren't too large! */ 2151 XShmPutImage( b->xm_visual->display, b->frontxrb->drawable, 2152 b->swapgc, 2153 b->backxrb->ximage, x, yTop, 2154 x, yTop, width, height, False ); 2155 /* wait for finished event??? */ 2156 } 2157 else 2158#endif 2159 { 2160 /* XXX assuming width and height aren't too large! */ 2161 XMesaPutImage( b->xm_visual->display, b->frontxrb->drawable, 2162 b->swapgc, 2163 b->backxrb->ximage, x, yTop, 2164 x, yTop, width, height ); 2165 } 2166 } 2167 else { 2168 /* Copy pixmap to window on server */ 2169 XMesaCopyArea( b->xm_visual->display, 2170 b->backxrb->pixmap, /* source drawable */ 2171 b->frontxrb->drawable, /* dest. drawable */ 2172 b->swapgc, 2173 x, yTop, width, height, /* source region */ 2174 x, yTop /* dest region */ 2175 ); 2176 } 2177 } 2178} 2179 2180 2181/* 2182 * Return a pointer to the XMesa backbuffer Pixmap or XImage. This function 2183 * is a way to get "under the hood" of X/Mesa so one can manipulate the 2184 * back buffer directly. 2185 * Output: pixmap - pointer to back buffer's Pixmap, or 0 2186 * ximage - pointer to back buffer's XImage, or NULL 2187 * Return: GL_TRUE = context is double buffered 2188 * GL_FALSE = context is single buffered 2189 */ 2190#ifndef XFree86Server 2191GLboolean XMesaGetBackBuffer( XMesaBuffer b, 2192 XMesaPixmap *pixmap, 2193 XMesaImage **ximage ) 2194{ 2195 if (b->db_mode) { 2196 if (pixmap) 2197 *pixmap = b->backxrb->pixmap; 2198 if (ximage) 2199 *ximage = b->backxrb->ximage; 2200 return GL_TRUE; 2201 } 2202 else { 2203 *pixmap = 0; 2204 *ximage = NULL; 2205 return GL_FALSE; 2206 } 2207} 2208#endif /* XFree86Server */ 2209 2210 2211/* 2212 * Return the depth buffer associated with an XMesaBuffer. 2213 * Input: b - the XMesa buffer handle 2214 * Output: width, height - size of buffer in pixels 2215 * bytesPerValue - bytes per depth value (2 or 4) 2216 * buffer - pointer to depth buffer values 2217 * Return: GL_TRUE or GL_FALSE to indicate success or failure. 2218 */ 2219GLboolean XMesaGetDepthBuffer( XMesaBuffer b, GLint *width, GLint *height, 2220 GLint *bytesPerValue, void **buffer ) 2221{ 2222 struct gl_renderbuffer *rb 2223 = b->mesa_buffer.Attachment[BUFFER_DEPTH].Renderbuffer; 2224 if (!rb || !rb->Data) { 2225 *width = 0; 2226 *height = 0; 2227 *bytesPerValue = 0; 2228 *buffer = 0; 2229 return GL_FALSE; 2230 } 2231 else { 2232 *width = b->mesa_buffer.Width; 2233 *height = b->mesa_buffer.Height; 2234 *bytesPerValue = b->mesa_buffer.Visual.depthBits <= 16 2235 ? sizeof(GLushort) : sizeof(GLuint); 2236 *buffer = rb->Data; 2237 return GL_TRUE; 2238 } 2239} 2240 2241 2242void XMesaFlush( XMesaContext c ) 2243{ 2244 if (c && c->xm_visual) { 2245#ifdef XFree86Server 2246 /* NOT_NEEDED */ 2247#else 2248 XSync( c->xm_visual->display, False ); 2249#endif 2250 } 2251} 2252 2253 2254 2255const char *XMesaGetString( XMesaContext c, int name ) 2256{ 2257 (void) c; 2258 if (name==XMESA_VERSION) { 2259 return "5.0"; 2260 } 2261 else if (name==XMESA_EXTENSIONS) { 2262 return ""; 2263 } 2264 else { 2265 return NULL; 2266 } 2267} 2268 2269 2270 2271XMesaBuffer XMesaFindBuffer( XMesaDisplay *dpy, XMesaDrawable d ) 2272{ 2273 XMesaBuffer b; 2274 for (b=XMesaBufferList; b; b=b->Next) { 2275 if (b->frontxrb->drawable == d && b->display == dpy) { 2276 return b; 2277 } 2278 } 2279 return NULL; 2280} 2281 2282 2283/** 2284 * Free/destroy all XMesaBuffers associated with given display. 2285 */ 2286void xmesa_destroy_buffers_on_display(XMesaDisplay *dpy) 2287{ 2288 XMesaBuffer b, next; 2289 for (b = XMesaBufferList; b; b = next) { 2290 next = b->Next; 2291 if (b->display == dpy) { 2292 xmesa_free_buffer(b); 2293 } 2294 } 2295} 2296 2297 2298/* 2299 * Look for XMesaBuffers whose X window has been destroyed. 2300 * Deallocate any such XMesaBuffers. 2301 */ 2302void XMesaGarbageCollect( void ) 2303{ 2304 XMesaBuffer b, next; 2305 for (b=XMesaBufferList; b; b=next) { 2306 next = b->Next; 2307 if (b->display && b->frontxrb->drawable && b->type == WINDOW) { 2308#ifdef XFree86Server 2309 /* NOT_NEEDED */ 2310#else 2311 XSync(b->display, False); 2312 if (!window_exists( b->display, b->frontxrb->drawable )) { 2313 /* found a dead window, free the ancillary info */ 2314 XMesaDestroyBuffer( b ); 2315 } 2316#endif 2317 } 2318 } 2319} 2320 2321 2322unsigned long XMesaDitherColor( XMesaContext xmesa, GLint x, GLint y, 2323 GLfloat red, GLfloat green, 2324 GLfloat blue, GLfloat alpha ) 2325{ 2326 GLcontext *ctx = &xmesa->mesa; 2327 GLint r = (GLint) (red * 255.0F); 2328 GLint g = (GLint) (green * 255.0F); 2329 GLint b = (GLint) (blue * 255.0F); 2330 GLint a = (GLint) (alpha * 255.0F); 2331 2332 switch (xmesa->pixelformat) { 2333 case PF_Index: 2334 return 0; 2335 case PF_Truecolor: 2336 { 2337 unsigned long p; 2338 PACK_TRUECOLOR( p, r, g, b ); 2339 return p; 2340 } 2341 case PF_8A8B8G8R: 2342 return PACK_8A8B8G8R( r, g, b, a ); 2343 case PF_8A8R8G8B: 2344 return PACK_8A8R8G8B( r, g, b, a ); 2345 case PF_8R8G8B: 2346 return PACK_8R8G8B( r, g, b ); 2347 case PF_5R6G5B: 2348 return PACK_5R6G5B( r, g, b ); 2349 case PF_Dither: 2350 { 2351 DITHER_SETUP; 2352 return DITHER( x, y, r, g, b ); 2353 } 2354 case PF_1Bit: 2355 /* 382 = (3*255)/2 */ 2356 return ((r+g+b) > 382) ^ xmesa->xm_visual->bitFlip; 2357 case PF_HPCR: 2358 return DITHER_HPCR(x, y, r, g, b); 2359 case PF_Lookup: 2360 { 2361 LOOKUP_SETUP; 2362 return LOOKUP( r, g, b ); 2363 } 2364 case PF_Grayscale: 2365 return GRAY_RGB( r, g, b ); 2366 case PF_Dither_5R6G5B: 2367 /* fall through */ 2368 case PF_Dither_True: 2369 { 2370 unsigned long p; 2371 PACK_TRUEDITHER(p, x, y, r, g, b); 2372 return p; 2373 } 2374 default: 2375 _mesa_problem(NULL, "Bad pixel format in XMesaDitherColor"); 2376 } 2377 return 0; 2378} 2379 2380 2381/* 2382 * This is typically called when the window size changes and we need 2383 * to reallocate the buffer's back/depth/stencil/accum buffers. 2384 */ 2385PUBLIC void 2386XMesaResizeBuffers( XMesaBuffer b ) 2387{ 2388 GET_CURRENT_CONTEXT(ctx); 2389 XMesaContext xmctx = XMESA_CONTEXT(ctx); 2390 if (!xmctx) 2391 return; 2392 xmesa_check_and_update_buffer_size(xmctx, b); 2393} 2394 2395 2396static GLint 2397xbuffer_to_renderbuffer(int buffer) 2398{ 2399 assert(MAX_AUX_BUFFERS <= 4); 2400 2401 switch (buffer) { 2402 case GLX_FRONT_LEFT_EXT: 2403 return BUFFER_FRONT_LEFT; 2404 case GLX_FRONT_RIGHT_EXT: 2405 return BUFFER_FRONT_RIGHT; 2406 case GLX_BACK_LEFT_EXT: 2407 return BUFFER_BACK_LEFT; 2408 case GLX_BACK_RIGHT_EXT: 2409 return BUFFER_BACK_RIGHT; 2410 case GLX_AUX0_EXT: 2411 return BUFFER_AUX0; 2412 case GLX_AUX1_EXT: 2413 return BUFFER_AUX1; 2414 case GLX_AUX2_EXT: 2415 return BUFFER_AUX2; 2416 case GLX_AUX3_EXT: 2417 return BUFFER_AUX3; 2418 case GLX_AUX4_EXT: 2419 case GLX_AUX5_EXT: 2420 case GLX_AUX6_EXT: 2421 case GLX_AUX7_EXT: 2422 case GLX_AUX8_EXT: 2423 case GLX_AUX9_EXT: 2424 default: 2425 /* BadValue error */ 2426 return -1; 2427 } 2428} 2429 2430 2431PUBLIC void 2432XMesaBindTexImage(XMesaDisplay *dpy, XMesaBuffer drawable, int buffer, 2433 const int *attrib_list) 2434{ 2435#if 0 2436 GET_CURRENT_CONTEXT(ctx); 2437 const GLuint unit = ctx->Texture.CurrentUnit; 2438 struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit]; 2439 struct gl_texture_object *texObj; 2440#endif 2441 struct gl_renderbuffer *rb; 2442 struct xmesa_renderbuffer *xrb; 2443 GLint b; 2444 XMesaImage *img = NULL; 2445 GLboolean freeImg = GL_FALSE; 2446 2447 b = xbuffer_to_renderbuffer(buffer); 2448 if (b < 0) 2449 return; 2450 2451 if (drawable->TextureFormat == GLX_TEXTURE_FORMAT_NONE_EXT) 2452 return; /* BadMatch error */ 2453 2454 rb = drawable->mesa_buffer.Attachment[b].Renderbuffer; 2455 if (!rb) { 2456 /* invalid buffer */ 2457 return; 2458 } 2459 xrb = xmesa_renderbuffer(rb); 2460 2461#if 0 2462 switch (drawable->TextureTarget) { 2463 case GLX_TEXTURE_1D_EXT: 2464 texObj = texUnit->Current1D; 2465 break; 2466 case GLX_TEXTURE_2D_EXT: 2467 texObj = texUnit->Current2D; 2468 break; 2469 case GLX_TEXTURE_RECTANGLE_EXT: 2470 texObj = texUnit->CurrentRect; 2471 break; 2472 default: 2473 return; /* BadMatch error */ 2474 } 2475#endif 2476 2477 /* 2478 * The following is a quick and simple way to implement 2479 * BindTexImage. The better way is to write some new FetchTexel() 2480 * functions which would extract texels from XImages. We'd still 2481 * need to use GetImage when texturing from a Pixmap (front buffer) 2482 * but texturing from a back buffer (XImage) would avoid an image 2483 * copy. 2484 */ 2485 2486 /* get XImage */ 2487 if (xrb->pixmap) { 2488 img = XMesaGetImage(dpy, xrb->pixmap, 0, 0, rb->Width, rb->Height, ~0L, 2489 ZPixmap); 2490 freeImg = GL_TRUE; 2491 } 2492 else if (xrb->ximage) { 2493 img = xrb->ximage; 2494 } 2495 2496 /* store the XImage as a new texture image */ 2497 if (img) { 2498 GLenum format, type, intFormat; 2499 if (img->bits_per_pixel == 32) { 2500 format = GL_BGRA; 2501 type = GL_UNSIGNED_BYTE; 2502 intFormat = GL_RGBA; 2503 } 2504 else if (img->bits_per_pixel == 24) { 2505 format = GL_BGR; 2506 type = GL_UNSIGNED_BYTE; 2507 intFormat = GL_RGB; 2508 } 2509 else if (img->bits_per_pixel == 16) { 2510 format = GL_BGR; 2511 type = GL_UNSIGNED_SHORT_5_6_5; 2512 intFormat = GL_RGB; 2513 } 2514 else { 2515 _mesa_problem(NULL, "Unexpected XImage format in XMesaBindTexImage"); 2516 return; 2517 } 2518 if (drawable->TextureFormat == GLX_TEXTURE_FORMAT_RGBA_EXT) { 2519 intFormat = GL_RGBA; 2520 } 2521 else if (drawable->TextureFormat == GLX_TEXTURE_FORMAT_RGB_EXT) { 2522 intFormat = GL_RGB; 2523 } 2524 2525 _mesa_TexImage2D(GL_TEXTURE_2D, 0, intFormat, rb->Width, rb->Height, 0, 2526 format, type, img->data); 2527 2528 if (freeImg) { 2529 XMesaDestroyImage(img); 2530 } 2531 } 2532} 2533 2534 2535 2536PUBLIC void 2537XMesaReleaseTexImage(XMesaDisplay *dpy, XMesaBuffer drawable, int buffer) 2538{ 2539 const GLint b = xbuffer_to_renderbuffer(buffer); 2540 if (b < 0) 2541 return; 2542 2543 /* no-op for now */ 2544} 2545 2546