2 * Copyright © 2008 Red Hat, Inc
4 * Permission to use, copy, modify, distribute, and sell this software
5 * and its documentation for any purpose is hereby granted without
6 * fee, provided that the above copyright notice appear in all copies
7 * and that both that copyright notice and this permission notice
8 * appear in supporting documentation, and that the name of the
9 * copyright holders not be used in advertising or publicity
10 * pertaining to distribution of the software without specific,
11 * written prior permission. The copyright holders make no
12 * representations about the suitability of this software for any
13 * purpose. It is provided "as is" without express or implied
16 * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
17 * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
18 * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY
19 * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
20 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
21 * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
22 * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
26 #ifdef HAVE_DIX_CONFIG_H
27 #include <dix-config.h>
34 #include <GL/glxtokens.h>
35 #include <GL/internal/dri_interface.h>
37 #include "glxserver.h"
38 #include "glxcontext.h"
39 #include "glxscreens.h"
40 #include "glxdricommon.h"
50 if (gettimeofday(&tv, NULL) == 0) {
51 ust[0] = (tv.tv_sec * 1000000) + tv.tv_usec;
58 const __DRIsystemTimeExtension systemTimeExtension = {
59 { __DRI_SYSTEM_TIME, __DRI_SYSTEM_TIME_VERSION },
64 #define __ATTRIB(attrib, field) \
65 { attrib, offsetof(__GLXconfig, field) }
67 static const struct { unsigned int attrib, offset; } attribMap[] = {
68 __ATTRIB(__DRI_ATTRIB_BUFFER_SIZE, rgbBits),
69 __ATTRIB(__DRI_ATTRIB_LEVEL, level),
70 __ATTRIB(__DRI_ATTRIB_RED_SIZE, redBits),
71 __ATTRIB(__DRI_ATTRIB_GREEN_SIZE, greenBits),
72 __ATTRIB(__DRI_ATTRIB_BLUE_SIZE, blueBits),
73 __ATTRIB(__DRI_ATTRIB_ALPHA_SIZE, alphaBits),
74 __ATTRIB(__DRI_ATTRIB_DEPTH_SIZE, depthBits),
75 __ATTRIB(__DRI_ATTRIB_STENCIL_SIZE, stencilBits),
76 __ATTRIB(__DRI_ATTRIB_ACCUM_RED_SIZE, accumRedBits),
77 __ATTRIB(__DRI_ATTRIB_ACCUM_GREEN_SIZE, accumGreenBits),
78 __ATTRIB(__DRI_ATTRIB_ACCUM_BLUE_SIZE, accumBlueBits),
79 __ATTRIB(__DRI_ATTRIB_ACCUM_ALPHA_SIZE, accumAlphaBits),
80 __ATTRIB(__DRI_ATTRIB_SAMPLE_BUFFERS, sampleBuffers),
81 __ATTRIB(__DRI_ATTRIB_SAMPLES, samples),
82 __ATTRIB(__DRI_ATTRIB_DOUBLE_BUFFER, doubleBufferMode),
83 __ATTRIB(__DRI_ATTRIB_STEREO, stereoMode),
84 __ATTRIB(__DRI_ATTRIB_AUX_BUFFERS, numAuxBuffers),
85 __ATTRIB(__DRI_ATTRIB_TRANSPARENT_TYPE, transparentPixel),
86 __ATTRIB(__DRI_ATTRIB_TRANSPARENT_INDEX_VALUE, transparentPixel),
87 __ATTRIB(__DRI_ATTRIB_TRANSPARENT_RED_VALUE, transparentRed),
88 __ATTRIB(__DRI_ATTRIB_TRANSPARENT_GREEN_VALUE, transparentGreen),
89 __ATTRIB(__DRI_ATTRIB_TRANSPARENT_BLUE_VALUE, transparentBlue),
90 __ATTRIB(__DRI_ATTRIB_TRANSPARENT_ALPHA_VALUE, transparentAlpha),
91 __ATTRIB(__DRI_ATTRIB_RED_MASK, redMask),
92 __ATTRIB(__DRI_ATTRIB_GREEN_MASK, greenMask),
93 __ATTRIB(__DRI_ATTRIB_BLUE_MASK, blueMask),
94 __ATTRIB(__DRI_ATTRIB_ALPHA_MASK, alphaMask),
95 __ATTRIB(__DRI_ATTRIB_MAX_PBUFFER_WIDTH, maxPbufferWidth),
96 __ATTRIB(__DRI_ATTRIB_MAX_PBUFFER_HEIGHT, maxPbufferHeight),
97 __ATTRIB(__DRI_ATTRIB_MAX_PBUFFER_PIXELS, maxPbufferPixels),
98 __ATTRIB(__DRI_ATTRIB_OPTIMAL_PBUFFER_WIDTH, optimalPbufferWidth),
99 __ATTRIB(__DRI_ATTRIB_OPTIMAL_PBUFFER_HEIGHT, optimalPbufferHeight),
100 __ATTRIB(__DRI_ATTRIB_SWAP_METHOD, swapMethod),
101 __ATTRIB(__DRI_ATTRIB_BIND_TO_TEXTURE_RGB, bindToTextureRgb),
102 __ATTRIB(__DRI_ATTRIB_BIND_TO_TEXTURE_RGBA, bindToTextureRgba),
103 __ATTRIB(__DRI_ATTRIB_BIND_TO_MIPMAP_TEXTURE, bindToMipmapTexture),
104 __ATTRIB(__DRI_ATTRIB_YINVERTED, yInverted),
107 #define ARRAY_SIZE(a) (sizeof (a) / sizeof ((a)[0]))
110 setScalar(__GLXconfig *config, unsigned int attrib, unsigned int value)
114 for (i = 0; i < ARRAY_SIZE(attribMap); i++)
115 if (attribMap[i].attrib == attrib) {
116 *(unsigned int *) ((char *) config + attribMap[i].offset) = value;
122 createModeFromConfig(const __DRIcoreExtension *core,
123 const __DRIconfig *driConfig,
124 unsigned int visualType, unsigned int drawableType)
126 __GLXDRIconfig *config;
127 unsigned int attrib, value;
130 config = malloc(sizeof *config);
132 config->driConfig = driConfig;
135 while (core->indexConfigAttrib(driConfig, i++, &attrib, &value)) {
137 case __DRI_ATTRIB_RENDER_TYPE:
138 config->config.renderType = 0;
139 if (value & __DRI_ATTRIB_RGBA_BIT)
140 config->config.renderType |= GLX_RGBA_BIT;
141 if (value & __DRI_ATTRIB_COLOR_INDEX_BIT)
142 config->config.renderType |= GLX_COLOR_INDEX_BIT;
144 case __DRI_ATTRIB_CONFIG_CAVEAT:
145 if (value & __DRI_ATTRIB_NON_CONFORMANT_CONFIG)
146 config->config.visualRating = GLX_NON_CONFORMANT_CONFIG;
147 else if (value & __DRI_ATTRIB_SLOW_BIT)
148 config->config.visualRating = GLX_SLOW_CONFIG;
150 config->config.visualRating = GLX_NONE;
152 case __DRI_ATTRIB_BIND_TO_TEXTURE_TARGETS:
153 config->config.bindToTextureTargets = 0;
154 if (value & __DRI_ATTRIB_TEXTURE_1D_BIT)
155 config->config.bindToTextureTargets |= GLX_TEXTURE_1D_BIT_EXT;
156 if (value & __DRI_ATTRIB_TEXTURE_2D_BIT)
157 config->config.bindToTextureTargets |= GLX_TEXTURE_2D_BIT_EXT;
158 if (value & __DRI_ATTRIB_TEXTURE_RECTANGLE_BIT)
159 config->config.bindToTextureTargets |= GLX_TEXTURE_RECTANGLE_BIT_EXT;
162 setScalar(&config->config, attrib, value);
167 config->config.next = NULL;
168 config->config.xRenderable = GL_TRUE;
169 config->config.visualType = visualType;
170 config->config.drawableType = drawableType;
172 return &config->config;
176 glxConvertConfigs(const __DRIcoreExtension *core,
177 const __DRIconfig **configs, unsigned int drawableType)
179 __GLXconfig head, *tail;
185 for (i = 0; configs[i]; i++) {
186 tail->next = createModeFromConfig(core,
187 configs[i], GLX_TRUE_COLOR,
189 if (tail->next == NULL)
195 for (i = 0; configs[i]; i++) {
196 tail->next = createModeFromConfig(core,
197 configs[i], GLX_DIRECT_COLOR,
199 if (tail->next == NULL)