1680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/*
2680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * (C) Copyright IBM Corporation 2003
3680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * All Rights Reserved.
4680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell *
5680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * Permission is hereby granted, free of charge, to any person obtaining a
6680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * copy of this software and associated documentation files (the "Software"),
7680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * to deal in the Software without restriction, including without limitation
8680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * on the rights to use, copy, modify, merge, publish, distribute, sub
9680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * license, and/or sell copies of the Software, and to permit persons to whom
10680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * the Software is furnished to do so, subject to the following conditions:
11680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell *
12680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * The above copyright notice and this permission notice (including the next
13680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * paragraph) shall be included in all copies or substantial portions of the
14680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * Software.
15680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell *
16680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.  IN NO EVENT SHALL
19680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * VA LINUX SYSTEM, IBM AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
20680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
21680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
22680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * USE OR OTHER DEALINGS IN THE SOFTWARE.
23680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell */
24680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
25680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/**
2665d98e25770487456eb3d7eb8ec3ec8272f170b1Kristian Høgsberg * \file glxconfig.c
276ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg * Utility routines for working with \c struct glx_config structures.  At
28680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * some point most or all of these functions will be moved to the Mesa
29680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * code base.
30680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell *
31680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * \author Ian Romanick <idr@us.ibm.com>
32680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell */
33680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
34aa1c79eaea96283e3ac7bae513b8d7535b875ce9George Sapountzis#include <GL/glx.h>
35aa1c79eaea96283e3ac7bae513b8d7535b875ce9George Sapountzis#include "GL/glxint.h"
3632f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg#include <stdlib.h>
3732f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg#include <string.h>
38680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
3965d98e25770487456eb3d7eb8ec3ec8272f170b1Kristian Høgsberg#include "glxconfig.h"
40680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
41680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell#define NUM_VISUAL_TYPES   6
42680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
43680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/**
446ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg * Get data from a GLX config
45680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell *
46680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * \param mode         GL context mode whose data is to be returned.
47680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * \param attribute    Attribute of \c mode that is to be returned.
48680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * \param value_return Location to store the data member of \c mode.
49bb45fec07460748f7762e709eeed8b7111c5a3c8Ian Romanick * \return  If \c attribute is a valid attribute of \c mode, zero is
50680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell *          returned.  Otherwise \c GLX_BAD_ATTRIBUTE is returned.
51680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell */
526ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg_X_HIDDEN int
536ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsbergglx_config_get(struct glx_config * mode, int attribute, int *value_return)
54680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell{
5507c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf   switch (attribute) {
5607c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf   case GLX_USE_GL:
5707c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      *value_return = GL_TRUE;
5807c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      return 0;
5907c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf   case GLX_BUFFER_SIZE:
6007c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      *value_return = mode->rgbBits;
6107c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      return 0;
6207c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf   case GLX_RGBA:
6307c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      *value_return = mode->rgbMode;
6407c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      return 0;
6507c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf   case GLX_RED_SIZE:
6607c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      *value_return = mode->redBits;
6707c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      return 0;
6807c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf   case GLX_GREEN_SIZE:
6907c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      *value_return = mode->greenBits;
7007c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      return 0;
7107c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf   case GLX_BLUE_SIZE:
7207c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      *value_return = mode->blueBits;
7307c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      return 0;
7407c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf   case GLX_ALPHA_SIZE:
7507c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      *value_return = mode->alphaBits;
7607c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      return 0;
7707c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf   case GLX_DOUBLEBUFFER:
7807c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      *value_return = mode->doubleBufferMode;
7907c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      return 0;
8007c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf   case GLX_STEREO:
8107c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      *value_return = mode->stereoMode;
8207c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      return 0;
8307c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf   case GLX_AUX_BUFFERS:
8407c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      *value_return = mode->numAuxBuffers;
8507c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      return 0;
8607c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf   case GLX_DEPTH_SIZE:
8707c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      *value_return = mode->depthBits;
8807c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      return 0;
8907c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf   case GLX_STENCIL_SIZE:
9007c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      *value_return = mode->stencilBits;
9107c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      return 0;
9207c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf   case GLX_ACCUM_RED_SIZE:
9307c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      *value_return = mode->accumRedBits;
9407c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      return 0;
9507c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf   case GLX_ACCUM_GREEN_SIZE:
9607c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      *value_return = mode->accumGreenBits;
9707c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      return 0;
9807c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf   case GLX_ACCUM_BLUE_SIZE:
9907c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      *value_return = mode->accumBlueBits;
10007c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      return 0;
10107c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf   case GLX_ACCUM_ALPHA_SIZE:
10207c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      *value_return = mode->accumAlphaBits;
10307c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      return 0;
10407c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf   case GLX_LEVEL:
10507c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      *value_return = mode->level;
10607c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      return 0;
107ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifndef GLX_USE_APPLEGL               /* This isn't supported by CGL. */
10807c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf   case GLX_TRANSPARENT_TYPE_EXT:
10907c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      *value_return = mode->transparentPixel;
11007c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      return 0;
111ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif
11207c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf   case GLX_TRANSPARENT_RED_VALUE:
11307c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      *value_return = mode->transparentRed;
11407c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      return 0;
11507c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf   case GLX_TRANSPARENT_GREEN_VALUE:
11607c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      *value_return = mode->transparentGreen;
11707c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      return 0;
11807c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf   case GLX_TRANSPARENT_BLUE_VALUE:
11907c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      *value_return = mode->transparentBlue;
12007c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      return 0;
12107c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf   case GLX_TRANSPARENT_ALPHA_VALUE:
12207c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      *value_return = mode->transparentAlpha;
12307c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      return 0;
12407c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf   case GLX_TRANSPARENT_INDEX_VALUE:
12507c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      *value_return = mode->transparentIndex;
12607c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      return 0;
12707c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf   case GLX_X_VISUAL_TYPE:
12807c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      *value_return = mode->visualType;
12907c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      return 0;
13007c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf   case GLX_CONFIG_CAVEAT:
13107c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      *value_return = mode->visualRating;
13207c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      return 0;
13307c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf   case GLX_VISUAL_ID:
13407c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      *value_return = mode->visualID;
13507c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      return 0;
13607c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf   case GLX_DRAWABLE_TYPE:
13707c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      *value_return = mode->drawableType;
13807c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      return 0;
13907c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf   case GLX_RENDER_TYPE:
14007c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      *value_return = mode->renderType;
14107c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      return 0;
14207c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf   case GLX_X_RENDERABLE:
14307c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      *value_return = mode->xRenderable;
14407c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      return 0;
14507c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf   case GLX_FBCONFIG_ID:
14607c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      *value_return = mode->fbconfigID;
14707c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      return 0;
14807c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf   case GLX_MAX_PBUFFER_WIDTH:
14907c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      *value_return = mode->maxPbufferWidth;
15007c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      return 0;
15107c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf   case GLX_MAX_PBUFFER_HEIGHT:
15207c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      *value_return = mode->maxPbufferHeight;
15307c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      return 0;
15407c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf   case GLX_MAX_PBUFFER_PIXELS:
15507c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      *value_return = mode->maxPbufferPixels;
15607c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      return 0;
157ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#ifndef GLX_USE_APPLEGL               /* These aren't supported by CGL. */
15807c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf   case GLX_OPTIMAL_PBUFFER_WIDTH_SGIX:
15907c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      *value_return = mode->optimalPbufferWidth;
16007c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      return 0;
16107c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf   case GLX_OPTIMAL_PBUFFER_HEIGHT_SGIX:
16207c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      *value_return = mode->optimalPbufferHeight;
16307c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      return 0;
16407c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf   case GLX_SWAP_METHOD_OML:
16507c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      *value_return = mode->swapMethod;
16607c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      return 0;
167ad503c41557606d15b0420c824369456f6d20a8fJeremy Huddleston#endif
16807c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf   case GLX_SAMPLE_BUFFERS_SGIS:
16907c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      *value_return = mode->sampleBuffers;
17007c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      return 0;
17107c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf   case GLX_SAMPLES_SGIS:
17207c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      *value_return = mode->samples;
17307c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      return 0;
17407c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf   case GLX_BIND_TO_TEXTURE_RGB_EXT:
17507c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      *value_return = mode->bindToTextureRgb;
17607c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      return 0;
17707c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf   case GLX_BIND_TO_TEXTURE_RGBA_EXT:
17807c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      *value_return = mode->bindToTextureRgba;
17907c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      return 0;
18007c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf   case GLX_BIND_TO_MIPMAP_TEXTURE_EXT:
18107c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      *value_return = mode->bindToMipmapTexture == GL_TRUE ? GL_TRUE :
18207c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf         GL_FALSE;
18307c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      return 0;
18407c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf   case GLX_BIND_TO_TEXTURE_TARGETS_EXT:
18507c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      *value_return = mode->bindToTextureTargets;
18607c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      return 0;
18707c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf   case GLX_Y_INVERTED_EXT:
18807c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      *value_return = mode->yInverted;
18907c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      return 0;
190680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
191b09b3e5c8f4f5d71b986bf359b56e7b60424538dDave Airlie   case GLX_FRAMEBUFFER_SRGB_CAPABLE_EXT:
1926538b5824e298eaebede2d9686c7607c44ab446aDave Airlie      *value_return = mode->sRGBCapable;
193b09b3e5c8f4f5d71b986bf359b56e7b60424538dDave Airlie      return 0;
194b09b3e5c8f4f5d71b986bf359b56e7b60424538dDave Airlie
195680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell      /* Applications are NOT allowed to query GLX_VISUAL_SELECT_GROUP_SGIX.
196680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell       * It is ONLY for communication between the GLX client and the GLX
197680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell       * server.
198680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell       */
19907c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf   case GLX_VISUAL_SELECT_GROUP_SGIX:
20007c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf   default:
20107c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      return GLX_BAD_ATTRIBUTE;
20207c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf   }
203680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell}
204680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
205680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
206680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/**
2076ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg * Allocate a linked list of \c struct glx_config structures.  The fields of
208680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * each structure will be initialized to "reasonable" default values.  In
209680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * most cases this is the default value defined by table 3.4 of the GLX
210680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * 1.3 specification.  This means that most values are either initialized to
211680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * zero or \c GLX_DONT_CARE (which is -1).  As support for additional
212680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * extensions is added, the new values will be initialized to appropriate
213680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * values from the extension specification.
214680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell *
215680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * \param count         Number of structures to allocate.
216680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * \param minimum_size  Minimum size of a structure to allocate.  This allows
217680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell *                      for differences in the version of the
2186ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg *                      \c struct glx_config stucture used in libGL and in a
219680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell *                      DRI-based driver.
220680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * \returns A pointer to the first element in a linked list of \c count
221680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell *          stuctures on success, or \c NULL on failure.
222680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell */
2236ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg_X_HIDDEN struct glx_config *
2246ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsbergglx_config_create_list(unsigned count)
225680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell{
2266ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   const size_t size = sizeof(struct glx_config);
2276ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   struct glx_config *base = NULL;
2286ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   struct glx_config **next;
22907c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf   unsigned i;
23007c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf
23107c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf   next = &base;
23207c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf   for (i = 0; i < count; i++) {
2336ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg      *next = (struct glx_config *) malloc(size);
23407c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      if (*next == NULL) {
2356ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg	 glx_config_destroy_list(base);
2366ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg	 base = NULL;
2376ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg	 break;
238680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell      }
23907c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf
24026f8fad1456fdc2b352cea9d3b4c32cb5f6ae947Kenneth Graunke      (void) memset(*next, 0, size);
241680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell      (*next)->visualID = GLX_DONT_CARE;
242680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell      (*next)->visualType = GLX_DONT_CARE;
243680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell      (*next)->visualRating = GLX_NONE;
244680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell      (*next)->transparentPixel = GLX_NONE;
245680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell      (*next)->transparentRed = GLX_DONT_CARE;
246680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell      (*next)->transparentGreen = GLX_DONT_CARE;
247680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell      (*next)->transparentBlue = GLX_DONT_CARE;
248680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell      (*next)->transparentAlpha = GLX_DONT_CARE;
249680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell      (*next)->transparentIndex = GLX_DONT_CARE;
250680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell      (*next)->xRenderable = GLX_DONT_CARE;
251680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell      (*next)->fbconfigID = GLX_DONT_CARE;
252680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell      (*next)->swapMethod = GLX_SWAP_UNDEFINED_OML;
253ba23f699f03e45a7519cb41cc853deba686ff8d9David Reveman      (*next)->bindToTextureRgb = GLX_DONT_CARE;
254ba23f699f03e45a7519cb41cc853deba686ff8d9David Reveman      (*next)->bindToTextureRgba = GLX_DONT_CARE;
255ba23f699f03e45a7519cb41cc853deba686ff8d9David Reveman      (*next)->bindToMipmapTexture = GLX_DONT_CARE;
2562771862adcbc163c0a3f3eaaf4b58c658e72f680Jie Luo      (*next)->bindToTextureTargets = GLX_DONT_CARE;
257ba23f699f03e45a7519cb41cc853deba686ff8d9David Reveman      (*next)->yInverted = GLX_DONT_CARE;
2586538b5824e298eaebede2d9686c7607c44ab446aDave Airlie      (*next)->sRGBCapable = GLX_DONT_CARE;
259680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
26007c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf      next = &((*next)->next);
261680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell   }
262680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
263680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell   return base;
264680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell}
265680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
2666ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg_X_HIDDEN void
2676ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsbergglx_config_destroy_list(struct glx_config *configs)
268680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell{
2696ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   while (configs != NULL) {
2706ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg      struct glx_config *const next = configs->next;
271680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
2726ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg      free(configs);
2736ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg      configs = next;
274680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell   }
275680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell}
276680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
277680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
278680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell/**
279680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * Find a context mode matching a Visual ID.
280680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell *
281680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * \param modes  List list of context-mode structures to be searched.
282680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * \param vid    Visual ID to be found.
283680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell * \returns A pointer to a context-mode in \c modes if \c vid was found in
284680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell *          the list, or \c NULL if it was not.
285680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell */
286680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
2876ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg_X_HIDDEN struct glx_config *
2886ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsbergglx_config_find_visual(struct glx_config *configs, int vid)
289680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell{
2906ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   struct glx_config *c;
291680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
2926ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   for (c = configs; c != NULL; c = c->next)
2936ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg      if (c->visualID == vid)
2946ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg	 return c;
295680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
29607c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf   return NULL;
297680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell}
298680ec7f85158eae58fd5ab56da8c66a645883cb0Keith Whitwell
2996ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg_X_HIDDEN struct glx_config *
3006ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsbergglx_config_find_fbconfig(struct glx_config *configs, int fbid)
301001de0ac4e9ccd5c440dca4a2994deca668a2d9fKristian Høgsberg{
3026ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   struct glx_config *c;
303001de0ac4e9ccd5c440dca4a2994deca668a2d9fKristian Høgsberg
3046ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg   for (c = configs; c != NULL; c = c->next)
3056ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg      if (c->fbconfigID == fbid)
3066ddf66e9230ee862ac341c4767cf6b3b2dd2552bKristian Høgsberg	 return c;
307001de0ac4e9ccd5c440dca4a2994deca668a2d9fKristian Høgsberg
30807c9bd246d7569e7841ba5b7838d441c8de205a9RALOVICH, Kristóf   return NULL;
309001de0ac4e9ccd5c440dca4a2994deca668a2d9fKristian Høgsberg}
310