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