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