egl_glx: Drop the use of [SG]ET_CONFIG_ATTRIB.
[mesa.git] / src / egl / main / eglconfig.h
1 #ifndef EGLCONFIG_INCLUDED
2 #define EGLCONFIG_INCLUDED
3
4
5 #include <assert.h>
6 #include "egltypedefs.h"
7
8
9 /* update _eglValidationTable and _eglOffsetOfConfig before updating this
10 * struct */
11 struct _egl_config
12 {
13 _EGLDisplay *Display;
14
15 /* core */
16 EGLint BufferSize;
17 EGLint AlphaSize;
18 EGLint BlueSize;
19 EGLint GreenSize;
20 EGLint RedSize;
21 EGLint DepthSize;
22 EGLint StencilSize;
23 EGLint ConfigCaveat;
24 EGLint ConfigID;
25 EGLint Level;
26 EGLint MaxPbufferHeight;
27 EGLint MaxPbufferPixels;
28 EGLint MaxPbufferWidth;
29 EGLint NativeRenderable;
30 EGLint NativeVisualID;
31 EGLint NativeVisualType;
32 EGLint Samples;
33 EGLint SampleBuffers;
34 EGLint SurfaceType;
35 EGLint TransparentType;
36 EGLint TransparentBlueValue;
37 EGLint TransparentGreenValue;
38 EGLint TransparentRedValue;
39 EGLint BindToTextureRGB;
40 EGLint BindToTextureRGBA;
41 EGLint MinSwapInterval;
42 EGLint MaxSwapInterval;
43 EGLint LuminanceSize;
44 EGLint AlphaMaskSize;
45 EGLint ColorBufferType;
46 EGLint RenderableType;
47 EGLint MatchNativePixmap;
48 EGLint Conformant;
49
50 /* extensions */
51 EGLint YInvertedNOK;
52 };
53
54
55 /**
56 * Map an EGL attribute enum to the offset of the member in _EGLConfig.
57 */
58 static INLINE EGLint
59 _eglOffsetOfConfig(EGLint attr)
60 {
61 switch (attr) {
62 #define ATTRIB_MAP(attr, memb) case attr: return offsetof(_EGLConfig, memb)
63 /* core */
64 ATTRIB_MAP(EGL_BUFFER_SIZE, BufferSize);
65 ATTRIB_MAP(EGL_ALPHA_SIZE, AlphaSize);
66 ATTRIB_MAP(EGL_BLUE_SIZE, BlueSize);
67 ATTRIB_MAP(EGL_GREEN_SIZE, GreenSize);
68 ATTRIB_MAP(EGL_RED_SIZE, RedSize);
69 ATTRIB_MAP(EGL_DEPTH_SIZE, DepthSize);
70 ATTRIB_MAP(EGL_STENCIL_SIZE, StencilSize);
71 ATTRIB_MAP(EGL_CONFIG_CAVEAT, ConfigCaveat);
72 ATTRIB_MAP(EGL_CONFIG_ID, ConfigID);
73 ATTRIB_MAP(EGL_LEVEL, Level);
74 ATTRIB_MAP(EGL_MAX_PBUFFER_HEIGHT, MaxPbufferHeight);
75 ATTRIB_MAP(EGL_MAX_PBUFFER_PIXELS, MaxPbufferPixels);
76 ATTRIB_MAP(EGL_MAX_PBUFFER_WIDTH, MaxPbufferWidth);
77 ATTRIB_MAP(EGL_NATIVE_RENDERABLE, NativeRenderable);
78 ATTRIB_MAP(EGL_NATIVE_VISUAL_ID, NativeVisualID);
79 ATTRIB_MAP(EGL_NATIVE_VISUAL_TYPE, NativeVisualType);
80 ATTRIB_MAP(EGL_SAMPLES, Samples);
81 ATTRIB_MAP(EGL_SAMPLE_BUFFERS, SampleBuffers);
82 ATTRIB_MAP(EGL_SURFACE_TYPE, SurfaceType);
83 ATTRIB_MAP(EGL_TRANSPARENT_TYPE, TransparentType);
84 ATTRIB_MAP(EGL_TRANSPARENT_BLUE_VALUE, TransparentBlueValue);
85 ATTRIB_MAP(EGL_TRANSPARENT_GREEN_VALUE, TransparentGreenValue);
86 ATTRIB_MAP(EGL_TRANSPARENT_RED_VALUE, TransparentRedValue);
87 ATTRIB_MAP(EGL_BIND_TO_TEXTURE_RGB, BindToTextureRGB);
88 ATTRIB_MAP(EGL_BIND_TO_TEXTURE_RGBA, BindToTextureRGBA);
89 ATTRIB_MAP(EGL_MIN_SWAP_INTERVAL, MinSwapInterval);
90 ATTRIB_MAP(EGL_MAX_SWAP_INTERVAL, MaxSwapInterval);
91 ATTRIB_MAP(EGL_LUMINANCE_SIZE, LuminanceSize);
92 ATTRIB_MAP(EGL_ALPHA_MASK_SIZE, AlphaMaskSize);
93 ATTRIB_MAP(EGL_COLOR_BUFFER_TYPE, ColorBufferType);
94 ATTRIB_MAP(EGL_RENDERABLE_TYPE, RenderableType);
95 ATTRIB_MAP(EGL_MATCH_NATIVE_PIXMAP, MatchNativePixmap);
96 ATTRIB_MAP(EGL_CONFORMANT, Conformant);
97 /* extensions */
98 ATTRIB_MAP(EGL_Y_INVERTED_NOK, YInvertedNOK);
99 #undef ATTRIB_MAP
100 default:
101 return -1;
102 }
103 }
104
105
106 /**
107 * Update a config for a given key.
108 *
109 * Note that a valid key is not necessarily a valid attribute. There are gaps
110 * in the attribute enums. The separation is to catch application errors.
111 * Drivers should never set a key that is an invalid attribute.
112 */
113 static INLINE void
114 _eglSetConfigKey(_EGLConfig *conf, EGLint key, EGLint val)
115 {
116 EGLint offset = _eglOffsetOfConfig(key);
117 assert(offset >= 0);
118 *((EGLint *) ((char *) conf + offset)) = val;
119 }
120
121
122 /**
123 * Return the value for a given key.
124 */
125 static INLINE EGLint
126 _eglGetConfigKey(const _EGLConfig *conf, EGLint key)
127 {
128 EGLint offset = _eglOffsetOfConfig(key);
129 assert(offset >= 0);
130 return *((EGLint *) ((char *) conf + offset));
131 }
132
133
134 PUBLIC void
135 _eglInitConfig(_EGLConfig *config, _EGLDisplay *dpy, EGLint id);
136
137
138 PUBLIC EGLConfig
139 _eglAddConfig(_EGLDisplay *dpy, _EGLConfig *conf);
140
141
142 extern EGLBoolean
143 _eglCheckConfigHandle(EGLConfig config, _EGLDisplay *dpy);
144
145
146 /**
147 * Lookup a handle to find the linked config.
148 * Return NULL if the handle has no corresponding linked config.
149 */
150 static INLINE _EGLConfig *
151 _eglLookupConfig(EGLConfig config, _EGLDisplay *dpy)
152 {
153 _EGLConfig *conf = (_EGLConfig *) config;
154 if (!dpy || !_eglCheckConfigHandle(config, dpy))
155 conf = NULL;
156 return conf;
157 }
158
159
160 /**
161 * Return the handle of a linked config, or NULL.
162 */
163 static INLINE EGLConfig
164 _eglGetConfigHandle(_EGLConfig *conf)
165 {
166 return (EGLConfig) ((conf && conf->Display) ? conf : NULL);
167 }
168
169
170 PUBLIC EGLBoolean
171 _eglValidateConfig(const _EGLConfig *conf, EGLBoolean for_matching);
172
173
174 PUBLIC EGLBoolean
175 _eglMatchConfig(const _EGLConfig *conf, const _EGLConfig *criteria);
176
177
178 PUBLIC EGLBoolean
179 _eglParseConfigAttribList(_EGLConfig *conf, const EGLint *attrib_list);
180
181
182 PUBLIC EGLint
183 _eglCompareConfigs(const _EGLConfig *conf1, const _EGLConfig *conf2,
184 const _EGLConfig *criteria, EGLBoolean compare_id);
185
186
187 PUBLIC void
188 _eglSortConfigs(const _EGLConfig **configs, EGLint count,
189 EGLint (*compare)(const _EGLConfig *, const _EGLConfig *,
190 void *),
191 void *priv_data);
192
193
194 extern EGLBoolean
195 _eglChooseConfig(_EGLDriver *drv, _EGLDisplay *dpy, const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config);
196
197
198 extern EGLBoolean
199 _eglGetConfigAttrib(_EGLDriver *drv, _EGLDisplay *dpy, _EGLConfig *conf, EGLint attribute, EGLint *value);
200
201
202 extern EGLBoolean
203 _eglGetConfigs(_EGLDriver *drv, _EGLDisplay *dpy, EGLConfig *configs, EGLint config_size, EGLint *num_config);
204
205
206 #endif /* EGLCONFIG_INCLUDED */