eglconfig.h revision cdc920a0
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
17struct _egl_config
18{
19   _EGLDisplay *Display;
20   EGLint Storage[_EGL_CONFIG_STORAGE_SIZE];
21};
22
23
24/**
25 * Macros for source level compatibility.
26 */
27#define SET_CONFIG_ATTRIB(CONF, ATTR, VAL) _eglSetConfigKey(CONF, ATTR, VAL)
28#define GET_CONFIG_ATTRIB(CONF, ATTR) _eglGetConfigKey(CONF, ATTR)
29
30
31/**
32 * Given a key, return an index into the storage of the config.
33 * Return -1 if the key is invalid.
34 */
35static INLINE EGLint
36_eglIndexConfig(const _EGLConfig *conf, EGLint key)
37{
38   (void) conf;
39   if (key >= _EGL_CONFIG_FIRST_ATTRIB &&
40       key < _EGL_CONFIG_FIRST_ATTRIB + _EGL_CONFIG_NUM_ATTRIBS)
41      return key - _EGL_CONFIG_FIRST_ATTRIB;
42   else
43      return -1;
44}
45
46
47/**
48 * Reset all keys in the config to a given value.
49 */
50static INLINE void
51_eglResetConfigKeys(_EGLConfig *conf, EGLint val)
52{
53   EGLint i;
54   for (i = 0; i < _EGL_CONFIG_NUM_ATTRIBS; i++)
55      conf->Storage[i] = val;
56}
57
58
59/**
60 * Update a config for a given key.
61 *
62 * Note that a valid key is not necessarily a valid attribute.  There are gaps
63 * in the attribute enums.  The separation is to catch application errors.
64 * Drivers should never set a key that is an invalid attribute.
65 */
66static INLINE void
67_eglSetConfigKey(_EGLConfig *conf, EGLint key, EGLint val)
68{
69   EGLint idx = _eglIndexConfig(conf, key);
70   assert(idx >= 0);
71   conf->Storage[idx] = val;
72}
73
74
75/**
76 * Return the value for a given key.
77 */
78static INLINE EGLint
79_eglGetConfigKey(const _EGLConfig *conf, EGLint key)
80{
81   EGLint idx = _eglIndexConfig(conf, key);
82   assert(idx >= 0);
83   return conf->Storage[idx];
84}
85
86
87PUBLIC void
88_eglInitConfig(_EGLConfig *config, _EGLDisplay *dpy, EGLint id);
89
90
91PUBLIC EGLConfig
92_eglAddConfig(_EGLDisplay *dpy, _EGLConfig *conf);
93
94
95extern EGLBoolean
96_eglCheckConfigHandle(EGLConfig config, _EGLDisplay *dpy);
97
98
99/**
100 * Lookup a handle to find the linked config.
101 * Return NULL if the handle has no corresponding linked config.
102 */
103static INLINE _EGLConfig *
104_eglLookupConfig(EGLConfig config, _EGLDisplay *dpy)
105{
106   _EGLConfig *conf = (_EGLConfig *) config;
107   if (!_eglCheckConfigHandle(config, dpy))
108      conf = NULL;
109   return conf;
110}
111
112
113/**
114 * Return the handle of a linked config, or NULL.
115 */
116static INLINE EGLConfig
117_eglGetConfigHandle(_EGLConfig *conf)
118{
119   return (EGLConfig) ((conf && conf->Display) ? conf : NULL);
120}
121
122
123PUBLIC EGLBoolean
124_eglValidateConfig(const _EGLConfig *conf, EGLBoolean for_matching);
125
126
127PUBLIC EGLBoolean
128_eglMatchConfig(const _EGLConfig *conf, const _EGLConfig *criteria);
129
130
131PUBLIC EGLBoolean
132_eglParseConfigAttribList(_EGLConfig *conf, const EGLint *attrib_list);
133
134
135PUBLIC EGLint
136_eglCompareConfigs(const _EGLConfig *conf1, const _EGLConfig *conf2,
137                   const _EGLConfig *criteria, EGLBoolean compare_id);
138
139
140PUBLIC void
141_eglSortConfigs(const _EGLConfig **configs, EGLint count,
142                EGLint (*compare)(const _EGLConfig *, const _EGLConfig *,
143                                  void *),
144                void *priv_data);
145
146
147extern EGLBoolean
148_eglChooseConfig(_EGLDriver *drv, _EGLDisplay *dpy, const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config);
149
150
151extern EGLBoolean
152_eglGetConfigAttrib(_EGLDriver *drv, _EGLDisplay *dpy, _EGLConfig *conf, EGLint attribute, EGLint *value);
153
154
155extern EGLBoolean
156_eglGetConfigs(_EGLDriver *drv, _EGLDisplay *dpy, EGLConfig *configs, EGLint config_size, EGLint *num_config);
157
158
159#endif /* EGLCONFIG_INCLUDED */
160