eglconfig.h revision 4a49301e
14a49301eSmrg#ifndef EGLCONFIG_INCLUDED 24a49301eSmrg#define EGLCONFIG_INCLUDED 34a49301eSmrg 44a49301eSmrg 54a49301eSmrg#include <assert.h> 64a49301eSmrg#include "egltypedefs.h" 74a49301eSmrg 84a49301eSmrg 94a49301eSmrg#define _EGL_CONFIG_FIRST_ATTRIB EGL_BUFFER_SIZE 104a49301eSmrg#define _EGL_CONFIG_LAST_ATTRIB EGL_CONFORMANT 114a49301eSmrg#define _EGL_CONFIG_NUM_ATTRIBS \ 124a49301eSmrg (_EGL_CONFIG_LAST_ATTRIB - _EGL_CONFIG_FIRST_ATTRIB + 1) 134a49301eSmrg 144a49301eSmrg#define _EGL_CONFIG_STORAGE_SIZE _EGL_CONFIG_NUM_ATTRIBS 154a49301eSmrg 164a49301eSmrg 174a49301eSmrgstruct _egl_config 184a49301eSmrg{ 194a49301eSmrg _EGLDisplay *Display; 204a49301eSmrg EGLint Storage[_EGL_CONFIG_STORAGE_SIZE]; 214a49301eSmrg}; 224a49301eSmrg 234a49301eSmrg 244a49301eSmrg#define SET_CONFIG_ATTRIB(CONF, ATTR, VAL) _eglSetConfigKey(CONF, ATTR, VAL) 254a49301eSmrg#define GET_CONFIG_ATTRIB(CONF, ATTR) _eglGetConfigKey(CONF, ATTR) 264a49301eSmrg 274a49301eSmrg 284a49301eSmrg/** 294a49301eSmrg * Given a key, return an index into the storage of the config. 304a49301eSmrg * Return -1 if the key is invalid. 314a49301eSmrg */ 324a49301eSmrgstatic INLINE EGLint 334a49301eSmrg_eglIndexConfig(const _EGLConfig *conf, EGLint key) 344a49301eSmrg{ 354a49301eSmrg (void) conf; 364a49301eSmrg if (key >= _EGL_CONFIG_FIRST_ATTRIB && 374a49301eSmrg key < _EGL_CONFIG_FIRST_ATTRIB + _EGL_CONFIG_NUM_ATTRIBS) 384a49301eSmrg return key - _EGL_CONFIG_FIRST_ATTRIB; 394a49301eSmrg else 404a49301eSmrg return -1; 414a49301eSmrg} 424a49301eSmrg 434a49301eSmrg 444a49301eSmrg/** 454a49301eSmrg * Reset all keys in the config to a given value. 464a49301eSmrg */ 474a49301eSmrgstatic INLINE void 484a49301eSmrg_eglResetConfigKeys(_EGLConfig *conf, EGLint val) 494a49301eSmrg{ 504a49301eSmrg EGLint i; 514a49301eSmrg for (i = 0; i < _EGL_CONFIG_NUM_ATTRIBS; i++) 524a49301eSmrg conf->Storage[i] = val; 534a49301eSmrg} 544a49301eSmrg 554a49301eSmrg 564a49301eSmrg/** 574a49301eSmrg * Update a config for a given key. 584a49301eSmrg */ 594a49301eSmrgstatic INLINE void 604a49301eSmrg_eglSetConfigKey(_EGLConfig *conf, EGLint key, EGLint val) 614a49301eSmrg{ 624a49301eSmrg EGLint idx = _eglIndexConfig(conf, key); 634a49301eSmrg assert(idx >= 0); 644a49301eSmrg conf->Storage[idx] = val; 654a49301eSmrg} 664a49301eSmrg 674a49301eSmrg 684a49301eSmrg/** 694a49301eSmrg * Return the value for a given key. 704a49301eSmrg */ 714a49301eSmrgstatic INLINE EGLint 724a49301eSmrg_eglGetConfigKey(const _EGLConfig *conf, EGLint key) 734a49301eSmrg{ 744a49301eSmrg EGLint idx = _eglIndexConfig(conf, key); 754a49301eSmrg assert(idx >= 0); 764a49301eSmrg return conf->Storage[idx]; 774a49301eSmrg} 784a49301eSmrg 794a49301eSmrg 804a49301eSmrg/** 814a49301eSmrg * Set a given attribute. 824a49301eSmrg * 834a49301eSmrg * Because _eglGetConfigAttrib is already used as a fallback driver 844a49301eSmrg * function, this function is not considered to have a good name. 854a49301eSmrg * SET_CONFIG_ATTRIB is preferred over this function. 864a49301eSmrg */ 874a49301eSmrgstatic INLINE void 884a49301eSmrg_eglSetConfigAttrib(_EGLConfig *conf, EGLint attr, EGLint val) 894a49301eSmrg{ 904a49301eSmrg SET_CONFIG_ATTRIB(conf, attr, val); 914a49301eSmrg} 924a49301eSmrg 934a49301eSmrg 944a49301eSmrgextern void 954a49301eSmrg_eglInitConfig(_EGLConfig *config, EGLint id); 964a49301eSmrg 974a49301eSmrg 984a49301eSmrgextern EGLConfig 994a49301eSmrg_eglAddConfig(_EGLDisplay *dpy, _EGLConfig *conf); 1004a49301eSmrg 1014a49301eSmrg 1024a49301eSmrg#ifndef _EGL_SKIP_HANDLE_CHECK 1034a49301eSmrg 1044a49301eSmrg 1054a49301eSmrgextern EGLBoolean 1064a49301eSmrg_eglCheckConfigHandle(EGLConfig config, _EGLDisplay *dpy); 1074a49301eSmrg 1084a49301eSmrg 1094a49301eSmrg#else 1104a49301eSmrg 1114a49301eSmrg 1124a49301eSmrgstatic INLINE EGLBoolean 1134a49301eSmrg_eglCheckConfigHandle(EGLConfig config, _EGLDisplay *dpy) 1144a49301eSmrg{ 1154a49301eSmrg _EGLConfig *conf = (_EGLConfig *) config; 1164a49301eSmrg return (dpy && conf && conf->Display == dpy); 1174a49301eSmrg} 1184a49301eSmrg 1194a49301eSmrg 1204a49301eSmrg#endif /* _EGL_SKIP_HANDLE_CHECK */ 1214a49301eSmrg 1224a49301eSmrg 1234a49301eSmrg/** 1244a49301eSmrg * Lookup a handle to find the linked config. 1254a49301eSmrg * Return NULL if the handle has no corresponding linked config. 1264a49301eSmrg */ 1274a49301eSmrgstatic INLINE _EGLConfig * 1284a49301eSmrg_eglLookupConfig(EGLConfig config, _EGLDisplay *dpy) 1294a49301eSmrg{ 1304a49301eSmrg _EGLConfig *conf = (_EGLConfig *) config; 1314a49301eSmrg if (!_eglCheckConfigHandle(config, dpy)) 1324a49301eSmrg conf = NULL; 1334a49301eSmrg return conf; 1344a49301eSmrg} 1354a49301eSmrg 1364a49301eSmrg 1374a49301eSmrg/** 1384a49301eSmrg * Return the handle of a linked config, or NULL. 1394a49301eSmrg */ 1404a49301eSmrgstatic INLINE EGLConfig 1414a49301eSmrg_eglGetConfigHandle(_EGLConfig *conf) 1424a49301eSmrg{ 1434a49301eSmrg return (EGLConfig) ((conf && conf->Display) ? conf : NULL); 1444a49301eSmrg} 1454a49301eSmrg 1464a49301eSmrg 1474a49301eSmrgextern EGLBoolean 1484a49301eSmrg_eglValidateConfig(const _EGLConfig *conf, EGLBoolean for_matching); 1494a49301eSmrg 1504a49301eSmrg 1514a49301eSmrgextern EGLBoolean 1524a49301eSmrg_eglMatchConfig(const _EGLConfig *conf, const _EGLConfig *criteria); 1534a49301eSmrg 1544a49301eSmrg 1554a49301eSmrgextern EGLBoolean 1564a49301eSmrg_eglParseConfigAttribList(_EGLConfig *conf, const EGLint *attrib_list); 1574a49301eSmrg 1584a49301eSmrg 1594a49301eSmrgextern EGLint 1604a49301eSmrg_eglCompareConfigs(const _EGLConfig *conf1, const _EGLConfig *conf2, 1614a49301eSmrg const _EGLConfig *criteria, EGLBoolean compare_id); 1624a49301eSmrg 1634a49301eSmrg 1644a49301eSmrgextern void 1654a49301eSmrg_eglSortConfigs(const _EGLConfig **configs, EGLint count, 1664a49301eSmrg EGLint (*compare)(const _EGLConfig *, const _EGLConfig *, 1674a49301eSmrg void *), 1684a49301eSmrg void *priv_data); 1694a49301eSmrg 1704a49301eSmrg 1714a49301eSmrgextern EGLBoolean 1724a49301eSmrg_eglChooseConfig(_EGLDriver *drv, _EGLDisplay *dpy, const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config); 1734a49301eSmrg 1744a49301eSmrg 1754a49301eSmrgextern EGLBoolean 1764a49301eSmrg_eglGetConfigAttrib(_EGLDriver *drv, _EGLDisplay *dpy, _EGLConfig *conf, EGLint attribute, EGLint *value); 1774a49301eSmrg 1784a49301eSmrg 1794a49301eSmrgextern EGLBoolean 1804a49301eSmrg_eglGetConfigs(_EGLDriver *drv, _EGLDisplay *dpy, EGLConfig *configs, EGLint config_size, EGLint *num_config); 1814a49301eSmrg 1824a49301eSmrg 1834a49301eSmrg#endif /* EGLCONFIG_INCLUDED */ 184