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