Merge branch 'mesa_7_7_branch'
[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 #define _EGL_CONFIG_FIRST_ATTRIB EGL_BUFFER_SIZE
10 #define _EGL_CONFIG_LAST_ATTRIB EGL_CONFORMANT
11 #define _EGL_CONFIG_NUM_ATTRIBS \
12 (_EGL_CONFIG_LAST_ATTRIB - _EGL_CONFIG_FIRST_ATTRIB + 1)
13
14 #define _EGL_CONFIG_STORAGE_SIZE _EGL_CONFIG_NUM_ATTRIBS
15
16
17 struct _egl_config
18 {
19 _EGLDisplay *Display;
20 EGLint Storage[_EGL_CONFIG_STORAGE_SIZE];
21 };
22
23
24 #define SET_CONFIG_ATTRIB(CONF, ATTR, VAL) _eglSetConfigKey(CONF, ATTR, VAL)
25 #define GET_CONFIG_ATTRIB(CONF, ATTR) _eglGetConfigKey(CONF, ATTR)
26
27
28 /**
29 * Given a key, return an index into the storage of the config.
30 * Return -1 if the key is invalid.
31 */
32 static INLINE EGLint
33 _eglIndexConfig(const _EGLConfig *conf, EGLint key)
34 {
35 (void) conf;
36 if (key >= _EGL_CONFIG_FIRST_ATTRIB &&
37 key < _EGL_CONFIG_FIRST_ATTRIB + _EGL_CONFIG_NUM_ATTRIBS)
38 return key - _EGL_CONFIG_FIRST_ATTRIB;
39 else
40 return -1;
41 }
42
43
44 /**
45 * Reset all keys in the config to a given value.
46 */
47 static INLINE void
48 _eglResetConfigKeys(_EGLConfig *conf, EGLint val)
49 {
50 EGLint i;
51 for (i = 0; i < _EGL_CONFIG_NUM_ATTRIBS; i++)
52 conf->Storage[i] = val;
53 }
54
55
56 /**
57 * Update a config for a given key.
58 */
59 static INLINE void
60 _eglSetConfigKey(_EGLConfig *conf, EGLint key, EGLint val)
61 {
62 EGLint idx = _eglIndexConfig(conf, key);
63 assert(idx >= 0);
64 conf->Storage[idx] = val;
65 }
66
67
68 /**
69 * Return the value for a given key.
70 */
71 static INLINE EGLint
72 _eglGetConfigKey(const _EGLConfig *conf, EGLint key)
73 {
74 EGLint idx = _eglIndexConfig(conf, key);
75 assert(idx >= 0);
76 return conf->Storage[idx];
77 }
78
79
80 /**
81 * Set a given attribute.
82 *
83 * Because _eglGetConfigAttrib is already used as a fallback driver
84 * function, this function is not considered to have a good name.
85 * SET_CONFIG_ATTRIB is preferred over this function.
86 */
87 static INLINE void
88 _eglSetConfigAttrib(_EGLConfig *conf, EGLint attr, EGLint val)
89 {
90 SET_CONFIG_ATTRIB(conf, attr, val);
91 }
92
93
94 PUBLIC void
95 _eglInitConfig(_EGLConfig *config, EGLint id);
96
97
98 PUBLIC EGLConfig
99 _eglAddConfig(_EGLDisplay *dpy, _EGLConfig *conf);
100
101
102 #ifndef _EGL_SKIP_HANDLE_CHECK
103
104
105 extern EGLBoolean
106 _eglCheckConfigHandle(EGLConfig config, _EGLDisplay *dpy);
107
108
109 #else
110
111
112 static INLINE EGLBoolean
113 _eglCheckConfigHandle(EGLConfig config, _EGLDisplay *dpy)
114 {
115 _EGLConfig *conf = (_EGLConfig *) config;
116 return (dpy && conf && conf->Display == dpy);
117 }
118
119
120 #endif /* _EGL_SKIP_HANDLE_CHECK */
121
122
123 /**
124 * Lookup a handle to find the linked config.
125 * Return NULL if the handle has no corresponding linked config.
126 */
127 static INLINE _EGLConfig *
128 _eglLookupConfig(EGLConfig config, _EGLDisplay *dpy)
129 {
130 _EGLConfig *conf = (_EGLConfig *) config;
131 if (!_eglCheckConfigHandle(config, dpy))
132 conf = NULL;
133 return conf;
134 }
135
136
137 /**
138 * Return the handle of a linked config, or NULL.
139 */
140 static INLINE EGLConfig
141 _eglGetConfigHandle(_EGLConfig *conf)
142 {
143 return (EGLConfig) ((conf && conf->Display) ? conf : NULL);
144 }
145
146
147 PUBLIC EGLBoolean
148 _eglValidateConfig(const _EGLConfig *conf, EGLBoolean for_matching);
149
150
151 PUBLIC EGLBoolean
152 _eglMatchConfig(const _EGLConfig *conf, const _EGLConfig *criteria);
153
154
155 PUBLIC EGLBoolean
156 _eglParseConfigAttribList(_EGLConfig *conf, const EGLint *attrib_list);
157
158
159 PUBLIC EGLint
160 _eglCompareConfigs(const _EGLConfig *conf1, const _EGLConfig *conf2,
161 const _EGLConfig *criteria, EGLBoolean compare_id);
162
163
164 PUBLIC void
165 _eglSortConfigs(const _EGLConfig **configs, EGLint count,
166 EGLint (*compare)(const _EGLConfig *, const _EGLConfig *,
167 void *),
168 void *priv_data);
169
170
171 extern EGLBoolean
172 _eglChooseConfig(_EGLDriver *drv, _EGLDisplay *dpy, const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config);
173
174
175 extern EGLBoolean
176 _eglGetConfigAttrib(_EGLDriver *drv, _EGLDisplay *dpy, _EGLConfig *conf, EGLint attribute, EGLint *value);
177
178
179 extern EGLBoolean
180 _eglGetConfigs(_EGLDriver *drv, _EGLDisplay *dpy, EGLConfig *configs, EGLint config_size, EGLint *num_config);
181
182
183 #endif /* EGLCONFIG_INCLUDED */