eglconfig.h revision 897cb8950ae14ffe7029b1daf16113ff62ce0dfe
1adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#ifndef EGLCONFIG_INCLUDED
2adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#define EGLCONFIG_INCLUDED
3adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
4adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
5358c5a8fd1d518930c3e87316a2c743a661ac553Chia-I Wu#include <assert.h>
6adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#include "egltypedefs.h"
7adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
8adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
9358c5a8fd1d518930c3e87316a2c743a661ac553Chia-I Wu#define _EGL_CONFIG_FIRST_ATTRIB EGL_BUFFER_SIZE
10358c5a8fd1d518930c3e87316a2c743a661ac553Chia-I Wu#define _EGL_CONFIG_LAST_ATTRIB EGL_CONFORMANT
11358c5a8fd1d518930c3e87316a2c743a661ac553Chia-I Wu#define _EGL_CONFIG_NUM_ATTRIBS \
12358c5a8fd1d518930c3e87316a2c743a661ac553Chia-I Wu   (_EGL_CONFIG_LAST_ATTRIB - _EGL_CONFIG_FIRST_ATTRIB + 1)
13358c5a8fd1d518930c3e87316a2c743a661ac553Chia-I Wu
14358c5a8fd1d518930c3e87316a2c743a661ac553Chia-I Wu#define _EGL_CONFIG_STORAGE_SIZE _EGL_CONFIG_NUM_ATTRIBS
15adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
16adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
17adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paulstruct _egl_config
18adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul{
1956822b0812cd500bd54bb7c4b573c54547efb657Chia-I Wu   _EGLDisplay *Display;
20358c5a8fd1d518930c3e87316a2c743a661ac553Chia-I Wu   EGLint Storage[_EGL_CONFIG_STORAGE_SIZE];
21adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul};
22adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
23adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
24358c5a8fd1d518930c3e87316a2c743a661ac553Chia-I Wu#define SET_CONFIG_ATTRIB(CONF, ATTR, VAL) _eglSetConfigKey(CONF, ATTR, VAL)
25358c5a8fd1d518930c3e87316a2c743a661ac553Chia-I Wu#define GET_CONFIG_ATTRIB(CONF, ATTR) _eglGetConfigKey(CONF, ATTR)
26de71e4741d8b4e3719e702431912374f1cb90034Brian Paul
27de71e4741d8b4e3719e702431912374f1cb90034Brian Paul
28358c5a8fd1d518930c3e87316a2c743a661ac553Chia-I Wu/**
29358c5a8fd1d518930c3e87316a2c743a661ac553Chia-I Wu * Given a key, return an index into the storage of the config.
30358c5a8fd1d518930c3e87316a2c743a661ac553Chia-I Wu * Return -1 if the key is invalid.
31358c5a8fd1d518930c3e87316a2c743a661ac553Chia-I Wu */
32358c5a8fd1d518930c3e87316a2c743a661ac553Chia-I Wustatic INLINE EGLint
33358c5a8fd1d518930c3e87316a2c743a661ac553Chia-I Wu_eglIndexConfig(const _EGLConfig *conf, EGLint key)
34358c5a8fd1d518930c3e87316a2c743a661ac553Chia-I Wu{
35358c5a8fd1d518930c3e87316a2c743a661ac553Chia-I Wu   (void) conf;
36358c5a8fd1d518930c3e87316a2c743a661ac553Chia-I Wu   if (key >= _EGL_CONFIG_FIRST_ATTRIB &&
37358c5a8fd1d518930c3e87316a2c743a661ac553Chia-I Wu       key < _EGL_CONFIG_FIRST_ATTRIB + _EGL_CONFIG_NUM_ATTRIBS)
38358c5a8fd1d518930c3e87316a2c743a661ac553Chia-I Wu      return key - _EGL_CONFIG_FIRST_ATTRIB;
39358c5a8fd1d518930c3e87316a2c743a661ac553Chia-I Wu   else
40358c5a8fd1d518930c3e87316a2c743a661ac553Chia-I Wu      return -1;
41358c5a8fd1d518930c3e87316a2c743a661ac553Chia-I Wu}
42358c5a8fd1d518930c3e87316a2c743a661ac553Chia-I Wu
43358c5a8fd1d518930c3e87316a2c743a661ac553Chia-I Wu
44358c5a8fd1d518930c3e87316a2c743a661ac553Chia-I Wu/**
45358c5a8fd1d518930c3e87316a2c743a661ac553Chia-I Wu * Reset all keys in the config to a given value.
46358c5a8fd1d518930c3e87316a2c743a661ac553Chia-I Wu */
47358c5a8fd1d518930c3e87316a2c743a661ac553Chia-I Wustatic INLINE void
48358c5a8fd1d518930c3e87316a2c743a661ac553Chia-I Wu_eglResetConfigKeys(_EGLConfig *conf, EGLint val)
49358c5a8fd1d518930c3e87316a2c743a661ac553Chia-I Wu{
50358c5a8fd1d518930c3e87316a2c743a661ac553Chia-I Wu   EGLint i;
51358c5a8fd1d518930c3e87316a2c743a661ac553Chia-I Wu   for (i = 0; i < _EGL_CONFIG_NUM_ATTRIBS; i++)
52358c5a8fd1d518930c3e87316a2c743a661ac553Chia-I Wu      conf->Storage[i] = val;
53358c5a8fd1d518930c3e87316a2c743a661ac553Chia-I Wu}
54358c5a8fd1d518930c3e87316a2c743a661ac553Chia-I Wu
55358c5a8fd1d518930c3e87316a2c743a661ac553Chia-I Wu
56358c5a8fd1d518930c3e87316a2c743a661ac553Chia-I Wu/**
57358c5a8fd1d518930c3e87316a2c743a661ac553Chia-I Wu * Update a config for a given key.
58358c5a8fd1d518930c3e87316a2c743a661ac553Chia-I Wu */
59358c5a8fd1d518930c3e87316a2c743a661ac553Chia-I Wustatic INLINE void
60358c5a8fd1d518930c3e87316a2c743a661ac553Chia-I Wu_eglSetConfigKey(_EGLConfig *conf, EGLint key, EGLint val)
61358c5a8fd1d518930c3e87316a2c743a661ac553Chia-I Wu{
62358c5a8fd1d518930c3e87316a2c743a661ac553Chia-I Wu   EGLint idx = _eglIndexConfig(conf, key);
63358c5a8fd1d518930c3e87316a2c743a661ac553Chia-I Wu   assert(idx >= 0);
64358c5a8fd1d518930c3e87316a2c743a661ac553Chia-I Wu   conf->Storage[idx] = val;
65358c5a8fd1d518930c3e87316a2c743a661ac553Chia-I Wu}
66358c5a8fd1d518930c3e87316a2c743a661ac553Chia-I Wu
67358c5a8fd1d518930c3e87316a2c743a661ac553Chia-I Wu
68358c5a8fd1d518930c3e87316a2c743a661ac553Chia-I Wu/**
69358c5a8fd1d518930c3e87316a2c743a661ac553Chia-I Wu * Return the value for a given key.
70358c5a8fd1d518930c3e87316a2c743a661ac553Chia-I Wu */
71358c5a8fd1d518930c3e87316a2c743a661ac553Chia-I Wustatic INLINE EGLint
72358c5a8fd1d518930c3e87316a2c743a661ac553Chia-I Wu_eglGetConfigKey(const _EGLConfig *conf, EGLint key)
73358c5a8fd1d518930c3e87316a2c743a661ac553Chia-I Wu{
74358c5a8fd1d518930c3e87316a2c743a661ac553Chia-I Wu   EGLint idx = _eglIndexConfig(conf, key);
75358c5a8fd1d518930c3e87316a2c743a661ac553Chia-I Wu   assert(idx >= 0);
76358c5a8fd1d518930c3e87316a2c743a661ac553Chia-I Wu   return conf->Storage[idx];
77358c5a8fd1d518930c3e87316a2c743a661ac553Chia-I Wu}
78358c5a8fd1d518930c3e87316a2c743a661ac553Chia-I Wu
79358c5a8fd1d518930c3e87316a2c743a661ac553Chia-I Wu
80358c5a8fd1d518930c3e87316a2c743a661ac553Chia-I Wu/**
81358c5a8fd1d518930c3e87316a2c743a661ac553Chia-I Wu * Set a given attribute.
82358c5a8fd1d518930c3e87316a2c743a661ac553Chia-I Wu *
83358c5a8fd1d518930c3e87316a2c743a661ac553Chia-I Wu * Because _eglGetConfigAttrib is already used as a fallback driver
84358c5a8fd1d518930c3e87316a2c743a661ac553Chia-I Wu * function, this function is not considered to have a good name.
85358c5a8fd1d518930c3e87316a2c743a661ac553Chia-I Wu * SET_CONFIG_ATTRIB is preferred over this function.
86358c5a8fd1d518930c3e87316a2c743a661ac553Chia-I Wu */
87358c5a8fd1d518930c3e87316a2c743a661ac553Chia-I Wustatic INLINE void
88358c5a8fd1d518930c3e87316a2c743a661ac553Chia-I Wu_eglSetConfigAttrib(_EGLConfig *conf, EGLint attr, EGLint val)
89358c5a8fd1d518930c3e87316a2c743a661ac553Chia-I Wu{
90358c5a8fd1d518930c3e87316a2c743a661ac553Chia-I Wu   SET_CONFIG_ATTRIB(conf, attr, val);
91358c5a8fd1d518930c3e87316a2c743a661ac553Chia-I Wu}
92adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
93adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
94897cb8950ae14ffe7029b1daf16113ff62ce0dfeChia-I WuPUBLIC void
95adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul_eglInitConfig(_EGLConfig *config, EGLint id);
96adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
97adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
98897cb8950ae14ffe7029b1daf16113ff62ce0dfeChia-I WuPUBLIC EGLConfig
9956822b0812cd500bd54bb7c4b573c54547efb657Chia-I Wu_eglAddConfig(_EGLDisplay *dpy, _EGLConfig *conf);
100721ba15bf4596b2e9589e7656005b387724875c3Brian Paul
101721ba15bf4596b2e9589e7656005b387724875c3Brian Paul
10256822b0812cd500bd54bb7c4b573c54547efb657Chia-I Wu#ifndef _EGL_SKIP_HANDLE_CHECK
103adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
104adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
10556822b0812cd500bd54bb7c4b573c54547efb657Chia-I Wuextern EGLBoolean
10656822b0812cd500bd54bb7c4b573c54547efb657Chia-I Wu_eglCheckConfigHandle(EGLConfig config, _EGLDisplay *dpy);
10756822b0812cd500bd54bb7c4b573c54547efb657Chia-I Wu
10856822b0812cd500bd54bb7c4b573c54547efb657Chia-I Wu
10956822b0812cd500bd54bb7c4b573c54547efb657Chia-I Wu#else
11056822b0812cd500bd54bb7c4b573c54547efb657Chia-I Wu
11156822b0812cd500bd54bb7c4b573c54547efb657Chia-I Wu
11256822b0812cd500bd54bb7c4b573c54547efb657Chia-I Wustatic INLINE EGLBoolean
11356822b0812cd500bd54bb7c4b573c54547efb657Chia-I Wu_eglCheckConfigHandle(EGLConfig config, _EGLDisplay *dpy)
11456822b0812cd500bd54bb7c4b573c54547efb657Chia-I Wu{
11556822b0812cd500bd54bb7c4b573c54547efb657Chia-I Wu   _EGLConfig *conf = (_EGLConfig *) config;
11656822b0812cd500bd54bb7c4b573c54547efb657Chia-I Wu   return (dpy && conf && conf->Display == dpy);
11756822b0812cd500bd54bb7c4b573c54547efb657Chia-I Wu}
11856822b0812cd500bd54bb7c4b573c54547efb657Chia-I Wu
11956822b0812cd500bd54bb7c4b573c54547efb657Chia-I Wu
12056822b0812cd500bd54bb7c4b573c54547efb657Chia-I Wu#endif /* _EGL_SKIP_HANDLE_CHECK */
12156822b0812cd500bd54bb7c4b573c54547efb657Chia-I Wu
12256822b0812cd500bd54bb7c4b573c54547efb657Chia-I Wu
12356822b0812cd500bd54bb7c4b573c54547efb657Chia-I Wu/**
12456822b0812cd500bd54bb7c4b573c54547efb657Chia-I Wu * Lookup a handle to find the linked config.
12556822b0812cd500bd54bb7c4b573c54547efb657Chia-I Wu * Return NULL if the handle has no corresponding linked config.
12656822b0812cd500bd54bb7c4b573c54547efb657Chia-I Wu */
12756822b0812cd500bd54bb7c4b573c54547efb657Chia-I Wustatic INLINE _EGLConfig *
12856822b0812cd500bd54bb7c4b573c54547efb657Chia-I Wu_eglLookupConfig(EGLConfig config, _EGLDisplay *dpy)
12956822b0812cd500bd54bb7c4b573c54547efb657Chia-I Wu{
13056822b0812cd500bd54bb7c4b573c54547efb657Chia-I Wu   _EGLConfig *conf = (_EGLConfig *) config;
13156822b0812cd500bd54bb7c4b573c54547efb657Chia-I Wu   if (!_eglCheckConfigHandle(config, dpy))
13256822b0812cd500bd54bb7c4b573c54547efb657Chia-I Wu      conf = NULL;
13356822b0812cd500bd54bb7c4b573c54547efb657Chia-I Wu   return conf;
13456822b0812cd500bd54bb7c4b573c54547efb657Chia-I Wu}
13556822b0812cd500bd54bb7c4b573c54547efb657Chia-I Wu
13656822b0812cd500bd54bb7c4b573c54547efb657Chia-I Wu
13756822b0812cd500bd54bb7c4b573c54547efb657Chia-I Wu/**
13856822b0812cd500bd54bb7c4b573c54547efb657Chia-I Wu * Return the handle of a linked config, or NULL.
13956822b0812cd500bd54bb7c4b573c54547efb657Chia-I Wu */
14056822b0812cd500bd54bb7c4b573c54547efb657Chia-I Wustatic INLINE EGLConfig
14156822b0812cd500bd54bb7c4b573c54547efb657Chia-I Wu_eglGetConfigHandle(_EGLConfig *conf)
14256822b0812cd500bd54bb7c4b573c54547efb657Chia-I Wu{
14356822b0812cd500bd54bb7c4b573c54547efb657Chia-I Wu   return (EGLConfig) ((conf && conf->Display) ? conf : NULL);
14456822b0812cd500bd54bb7c4b573c54547efb657Chia-I Wu}
145c22990c29a5cdff89e6e3914aa565acc88a6a407Brian Paul
146c22990c29a5cdff89e6e3914aa565acc88a6a407Brian Paul
147897cb8950ae14ffe7029b1daf16113ff62ce0dfeChia-I WuPUBLIC EGLBoolean
14895cdd697e7e72cec1d0fe79c59a8ba7b8cef8571Chia-I Wu_eglValidateConfig(const _EGLConfig *conf, EGLBoolean for_matching);
14995cdd697e7e72cec1d0fe79c59a8ba7b8cef8571Chia-I Wu
15095cdd697e7e72cec1d0fe79c59a8ba7b8cef8571Chia-I Wu
151897cb8950ae14ffe7029b1daf16113ff62ce0dfeChia-I WuPUBLIC EGLBoolean
15295cdd697e7e72cec1d0fe79c59a8ba7b8cef8571Chia-I Wu_eglMatchConfig(const _EGLConfig *conf, const _EGLConfig *criteria);
15395cdd697e7e72cec1d0fe79c59a8ba7b8cef8571Chia-I Wu
15495cdd697e7e72cec1d0fe79c59a8ba7b8cef8571Chia-I Wu
155897cb8950ae14ffe7029b1daf16113ff62ce0dfeChia-I WuPUBLIC EGLBoolean
15695cdd697e7e72cec1d0fe79c59a8ba7b8cef8571Chia-I Wu_eglParseConfigAttribList(_EGLConfig *conf, const EGLint *attrib_list);
15795cdd697e7e72cec1d0fe79c59a8ba7b8cef8571Chia-I Wu
15895cdd697e7e72cec1d0fe79c59a8ba7b8cef8571Chia-I Wu
159897cb8950ae14ffe7029b1daf16113ff62ce0dfeChia-I WuPUBLIC EGLint
16095cdd697e7e72cec1d0fe79c59a8ba7b8cef8571Chia-I Wu_eglCompareConfigs(const _EGLConfig *conf1, const _EGLConfig *conf2,
16195cdd697e7e72cec1d0fe79c59a8ba7b8cef8571Chia-I Wu                   const _EGLConfig *criteria, EGLBoolean compare_id);
16295cdd697e7e72cec1d0fe79c59a8ba7b8cef8571Chia-I Wu
16395cdd697e7e72cec1d0fe79c59a8ba7b8cef8571Chia-I Wu
164897cb8950ae14ffe7029b1daf16113ff62ce0dfeChia-I WuPUBLIC void
16595cdd697e7e72cec1d0fe79c59a8ba7b8cef8571Chia-I Wu_eglSortConfigs(const _EGLConfig **configs, EGLint count,
16695cdd697e7e72cec1d0fe79c59a8ba7b8cef8571Chia-I Wu                EGLint (*compare)(const _EGLConfig *, const _EGLConfig *,
16795cdd697e7e72cec1d0fe79c59a8ba7b8cef8571Chia-I Wu                                  void *),
16895cdd697e7e72cec1d0fe79c59a8ba7b8cef8571Chia-I Wu                void *priv_data);
169adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
170adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
171adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paulextern EGLBoolean
1722f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu_eglChooseConfig(_EGLDriver *drv, _EGLDisplay *dpy, const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config);
173adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
174adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
175adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paulextern EGLBoolean
1762f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu_eglGetConfigAttrib(_EGLDriver *drv, _EGLDisplay *dpy, _EGLConfig *conf, EGLint attribute, EGLint *value);
177adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
178adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
179adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paulextern EGLBoolean
1802f2cf461c57974abd89e4917945cc8ae6a67a72eChia-I Wu_eglGetConfigs(_EGLDriver *drv, _EGLDisplay *dpy, EGLConfig *configs, EGLint config_size, EGLint *num_config);
181adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
182adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul
183adbff7e977c7c768e752a24fb643d68bdf961bfeBrian Paul#endif /* EGLCONFIG_INCLUDED */
184