2 * test_egl_configs: List available EGL configurations
3 * Copyright (c) 2013 Thomas Perl <m@thp.io>
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
25 #include <EGL/eglext.h>
28 #define FAIL_WITH(...) do { fprintf(stderr, __VA_ARGS__); exit(1); } while (0)
29 #define TEST_LOG(...) fprintf(stderr, __VA_ARGS__)
31 #define TEST_ASSERT(x) do { \
32 int error = eglGetError(); \
33 if (error != EGL_SUCCESS) { \
34 FAIL_WITH("EGL Error %x at %s:%d\n", error, __FILE__, __LINE__); \
37 FAIL_WITH("Assertion failed: %s at %s:%d\n", (#x), __FILE__, __LINE__); \
42 static EGLDisplay display
;
43 static EGLConfig config
;
46 ATTRIB(EGLint attribute
)
51 result
= eglGetConfigAttrib(display
, config
, attribute
, &value
);
52 if (result
!= EGL_TRUE
) {
53 TEST_LOG("For attribute: %d\n", attribute
);
54 TEST_ASSERT(result
== EGL_TRUE
); // this makes sure we exit()
60 #define TEST_LOG_FEATURE(x) TEST_LOG(" %s: %s\n", (#x), ATTRIB(x) ? "yes" : "no")
61 #define TEST_LOG_VALUE(x) TEST_LOG(" %s: %d\n", (#x), ATTRIB(x))
62 #define TEST_LOG_VALUE_HEX(x) TEST_LOG(" %s: %x\n", (#x), ATTRIB(x))
64 #define SINCE_EGL_VERSION(maj, min) (major >= (maj) && minor >= (min))
66 /* Syntactic sugar for decoding one-of-many option fields */
67 #define ATTRIB_SWITCH(x) TEST_LOG(" %s: ", (#x)); switch (ATTRIB(x))
68 #define ATTRIB_CASE(x) case x: TEST_LOG("%s\n", (#x)); break
69 #define ATTRIB_SWITCH_DEFAULT(x) default: TEST_LOG("%x\n", ATTRIB(x)); break
71 /* Syntactic sugar for decoding bitfields */
72 #define START_DECODE_BITFIELD(x) value = ATTRIB(x); TEST_LOG(" %s: %x (", (#x), value);
73 #define TEST_BITFIELD_VALUE(x) if (value & (x)) TEST_LOG(" %s ", (#x))
74 #define END_DECODE_BITFIELD(x) TEST_LOG(")\n")
78 * For reference, the values tested below have been obtained from:
79 * http://www.khronos.org/registry/egl/sdk/docs/man/xhtml/eglGetConfigAttrib.html
80 * http://www.khronos.org/registry/egl/sdk/docs/man/xhtml/eglChooseConfig.html
84 main(int argc
, char *argv
[])
89 EGLint num_config_result
;
94 TEST_LOG("Starting test (EGL_PLATFORM=%s)\n", getenv("EGL_PLATFORM"));
96 display
= eglGetDisplay(EGL_DEFAULT_DISPLAY
);
97 TEST_ASSERT(display
!= EGL_NO_DISPLAY
);
99 result
= eglInitialize(display
, &major
, &minor
);
100 TEST_ASSERT(result
== EGL_TRUE
);
102 TEST_LOG("EGL Version %d.%d\n", major
, minor
);
103 TEST_LOG("Extensions: %s\n", eglQueryString(display
, EGL_EXTENSIONS
));
105 result
= eglGetConfigs(display
, NULL
, 0, &num_config
);
106 TEST_ASSERT(result
== EGL_TRUE
);
108 TEST_LOG("Available configurations: %d\n", num_config
);
109 configs
= (EGLConfig
*)calloc(num_config
, sizeof(EGLConfig
));
111 result
= eglGetConfigs(display
, configs
, num_config
, &num_config_result
);
112 TEST_ASSERT(result
== EGL_TRUE
);
114 for (i
=0; i
<num_config_result
; i
++) {
117 TEST_LOG("===== Configuration #%d =====\n", i
);
119 TEST_LOG_VALUE(EGL_RED_SIZE
);
120 TEST_LOG_VALUE(EGL_GREEN_SIZE
);
121 TEST_LOG_VALUE(EGL_BLUE_SIZE
);
122 TEST_LOG_VALUE(EGL_ALPHA_SIZE
);
123 TEST_LOG_VALUE(EGL_BUFFER_SIZE
);
124 TEST_LOG_VALUE(EGL_DEPTH_SIZE
);
125 TEST_LOG_VALUE(EGL_STENCIL_SIZE
);
127 TEST_LOG_VALUE(EGL_CONFIG_ID
);
128 TEST_LOG_VALUE(EGL_LEVEL
);
129 TEST_LOG_VALUE(EGL_SAMPLE_BUFFERS
);
130 TEST_LOG_VALUE(EGL_SAMPLES
);
132 TEST_LOG_VALUE(EGL_MAX_PBUFFER_WIDTH
);
133 TEST_LOG_VALUE(EGL_MAX_PBUFFER_HEIGHT
);
134 TEST_LOG_VALUE(EGL_MAX_PBUFFER_PIXELS
);
136 TEST_LOG_VALUE(EGL_MIN_SWAP_INTERVAL
);
137 TEST_LOG_VALUE(EGL_MAX_SWAP_INTERVAL
);
139 TEST_LOG_VALUE(EGL_NATIVE_VISUAL_ID
);
140 TEST_LOG_VALUE(EGL_NATIVE_VISUAL_TYPE
);
142 ATTRIB_SWITCH(EGL_CONFIG_CAVEAT
) {
143 ATTRIB_CASE(EGL_NONE
);
144 ATTRIB_CASE(EGL_SLOW_CONFIG
);
145 ATTRIB_CASE(EGL_NON_CONFORMANT_CONFIG
);
146 ATTRIB_SWITCH_DEFAULT(EGL_CONFIG_CAVEAT
);
149 TEST_LOG_FEATURE(EGL_BIND_TO_TEXTURE_RGB
);
150 TEST_LOG_FEATURE(EGL_BIND_TO_TEXTURE_RGBA
);
151 TEST_LOG_FEATURE(EGL_NATIVE_RENDERABLE
);
153 START_DECODE_BITFIELD(EGL_SURFACE_TYPE
) {
154 TEST_BITFIELD_VALUE(EGL_MULTISAMPLE_RESOLVE_BOX_BIT
);
155 TEST_BITFIELD_VALUE(EGL_PBUFFER_BIT
);
156 TEST_BITFIELD_VALUE(EGL_PIXMAP_BIT
);
157 TEST_BITFIELD_VALUE(EGL_SWAP_BEHAVIOR_PRESERVED_BIT
);
158 TEST_BITFIELD_VALUE(EGL_VG_ALPHA_FORMAT_PRE_BIT
);
159 TEST_BITFIELD_VALUE(EGL_VG_COLORSPACE_LINEAR_BIT
);
160 TEST_BITFIELD_VALUE(EGL_WINDOW_BIT
);
161 } END_DECODE_BITFIELD(EGL_SURFACE_TYPE
);
163 TEST_LOG_VALUE_HEX(EGL_TRANSPARENT_RED_VALUE
);
164 TEST_LOG_VALUE_HEX(EGL_TRANSPARENT_GREEN_VALUE
);
165 TEST_LOG_VALUE_HEX(EGL_TRANSPARENT_BLUE_VALUE
);
167 ATTRIB_SWITCH(EGL_TRANSPARENT_TYPE
) {
168 ATTRIB_CASE(EGL_NONE
);
169 ATTRIB_CASE(EGL_TRANSPARENT_RGB
);
170 ATTRIB_SWITCH_DEFAULT(EGL_TRANSPARENT_TYPE
);
173 // New features introduced in EGL 1.2
174 if (SINCE_EGL_VERSION(1, 2)) {
175 #ifdef EGL_LUMINANCE_SIZE
176 TEST_LOG_VALUE(EGL_LUMINANCE_SIZE
);
177 #endif /* EGL_LUMINANCE_SIZE */
179 #ifdef EGL_COLOR_BUFFER_TYPE
180 ATTRIB_SWITCH(EGL_COLOR_BUFFER_TYPE
) {
181 ATTRIB_CASE(EGL_RGB_BUFFER
);
182 ATTRIB_CASE(EGL_LUMINANCE_BUFFER
);
183 ATTRIB_SWITCH_DEFAULT(EGL_COLOR_BUFFER_TYPE
);
185 #endif /* EGL_COLOR_BUFFER_TYPE */
187 #ifdef EGL_RENDERABLE_TYPE
188 START_DECODE_BITFIELD(EGL_RENDERABLE_TYPE
) {
189 TEST_BITFIELD_VALUE(EGL_OPENGL_BIT
);
190 TEST_BITFIELD_VALUE(EGL_OPENGL_ES_BIT
);
191 TEST_BITFIELD_VALUE(EGL_OPENGL_ES2_BIT
);
192 TEST_BITFIELD_VALUE(EGL_OPENVG_BIT
);
193 } END_DECODE_BITFIELD(EGL_RENDERABLE_TYPE
);
194 #endif /* EGL_RENDERABLE_TYPE */
197 // New features introduced in EGL 1.3
198 if (SINCE_EGL_VERSION(1, 3)) {
199 #ifdef EGL_CONFORMANT
200 START_DECODE_BITFIELD(EGL_CONFORMANT
) {
201 TEST_BITFIELD_VALUE(EGL_OPENGL_BIT
);
202 TEST_BITFIELD_VALUE(EGL_OPENGL_ES_BIT
);
203 TEST_BITFIELD_VALUE(EGL_OPENGL_ES2_BIT
);
204 TEST_BITFIELD_VALUE(EGL_OPENVG_BIT
);
205 } END_DECODE_BITFIELD(EGL_CONFORMANT
);
206 #endif /* EGL_CONFORMANT */
214 result
= eglTerminate(display
);
215 TEST_ASSERT(result
== EGL_TRUE
);