egl: Rework configuration management.
[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 EGLConfig Handle; /* the public/opaque handle which names this config */
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 extern void
95 _eglInitConfig(_EGLConfig *config, EGLint id);
96
97
98 extern EGLConfig
99 _eglGetConfigHandle(_EGLConfig *config);
100
101
102 extern _EGLConfig *
103 _eglLookupConfig(EGLConfig config, _EGLDisplay *dpy);
104
105
106 extern _EGLConfig *
107 _eglAddConfig(_EGLDisplay *display, _EGLConfig *config);
108
109
110 extern EGLBoolean
111 _eglValidateConfig(const _EGLConfig *conf, EGLBoolean for_matching);
112
113
114 extern EGLBoolean
115 _eglMatchConfig(const _EGLConfig *conf, const _EGLConfig *criteria);
116
117
118 extern EGLBoolean
119 _eglParseConfigAttribList(_EGLConfig *conf, const EGLint *attrib_list);
120
121
122 extern EGLint
123 _eglCompareConfigs(const _EGLConfig *conf1, const _EGLConfig *conf2,
124 const _EGLConfig *criteria, EGLBoolean compare_id);
125
126
127 extern void
128 _eglSortConfigs(const _EGLConfig **configs, EGLint count,
129 EGLint (*compare)(const _EGLConfig *, const _EGLConfig *,
130 void *),
131 void *priv_data);
132
133
134 extern EGLBoolean
135 _eglChooseConfig(_EGLDriver *drv, _EGLDisplay *dpy, const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config);
136
137
138 extern EGLBoolean
139 _eglGetConfigAttrib(_EGLDriver *drv, _EGLDisplay *dpy, _EGLConfig *conf, EGLint attribute, EGLint *value);
140
141
142 extern EGLBoolean
143 _eglGetConfigs(_EGLDriver *drv, _EGLDisplay *dpy, EGLConfig *configs, EGLint config_size, EGLint *num_config);
144
145
146 #endif /* EGLCONFIG_INCLUDED */