1 | /* |
2 | Copyright (c) 2012, Broadcom Europe Ltd |
3 | All rights reserved. |
4 | |
5 | Redistribution and use in source and binary forms, with or without |
6 | modification, are permitted provided that the following conditions are met: |
7 | * Redistributions of source code must retain the above copyright |
8 | notice, this list of conditions and the following disclaimer. |
9 | * Redistributions in binary form must reproduce the above copyright |
10 | notice, this list of conditions and the following disclaimer in the |
11 | documentation and/or other materials provided with the distribution. |
12 | * Neither the name of the copyright holder nor the |
13 | names of its contributors may be used to endorse or promote products |
14 | derived from this software without specific prior written permission. |
15 | |
16 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND |
17 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
18 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
19 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY |
20 | DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
21 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
22 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
23 | ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
24 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
25 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
26 | */ |
27 | |
28 | /* |
29 | EGLAPI EGLint EGLAPIENTRY eglGetError(void) |
30 | |
31 | Khronos documentation: |
32 | |
33 | 3.1 Errors |
34 | Where possible, when an EGL function fails it has no side effects. |
35 | EGL functions usually return an indicator of success or failure; either an |
36 | EGLBoolean EGL TRUE or EGL FALSE value, or in the form of an out-of-band |
37 | return value indicating failure, such as returning EGL NO CONTEXT instead of a requested |
38 | context handle. Additional information about the success or failure of the |
39 | most recent EGL function called in a specific thread, in the form of an error code, |
40 | can be obtained by calling |
41 | EGLint eglGetError(); |
42 | The error codes that may be returned from eglGetError, and their meanings, |
43 | are: |
44 | EGL SUCCESS |
45 | Function succeeded. |
46 | EGL NOT INITIALIZED |
47 | EGL is not initialized, or could not be initialized, for the specified display. |
48 | EGL BAD ACCESS |
49 | EGL cannot access a requested resource (for example, a context is bound in |
50 | another thread). |
51 | EGL BAD ALLOC |
52 | EGL failed to allocate resources for the requested operation. |
53 | 9 |
54 | 10 CHAPTER 3. EGL FUNCTIONS AND ERRORS |
55 | EGL BAD ATTRIBUTE |
56 | An unrecognized attribute or attribute value was passed in an attribute list. |
57 | EGL BAD CONTEXT |
58 | An EGLContext argument does not name a valid EGLContext. |
59 | EGL BAD CONFIG |
60 | An EGLConfig argument does not name a valid EGLConfig. |
61 | EGL BAD CURRENT SURFACE |
62 | The current surface of the calling thread is a window, pbuffer, or pixmap that |
63 | is no longer valid. |
64 | EGL BAD DISPLAY |
65 | An EGLDisplay argument does not name a valid EGLDisplay; or, EGL |
66 | is not initialized on the specified EGLDisplay. |
67 | EGL BAD SURFACE |
68 | An EGLSurface argument does not name a valid surface (window, pbuffer, |
69 | or pixmap) configured for rendering. |
70 | EGL BAD MATCH |
71 | Arguments are inconsistent; for example, an otherwise valid context requires |
72 | buffers (e.g. depth or stencil) not allocated by an otherwise valid surface. |
73 | EGL BAD PARAMETER |
74 | One or more argument values are invalid. |
75 | EGL BAD NATIVE PIXMAP |
76 | An EGLNativePixmapType argument does not refer to a valid native |
77 | pixmap. |
78 | EGL BAD NATIVE WINDOW |
79 | An EGLNativeWindowType argument does not refer to a valid native |
80 | window. |
81 | EGL CONTEXT LOST |
82 | A power management event has occurred. The application must destroy all |
83 | contexts and reinitialise client API state and objects to continue rendering, |
84 | as described in section 2.6. |
85 | When there is no status to return (in other words, when eglGetError is called |
86 | as the first EGL call in a thread, or immediately after calling eglReleaseThread), |
87 | EGL SUCCESS will be returned. |
88 | |
89 | Implementation notes: |
90 | |
91 | What should we do if eglGetError is called twice? Currently we reset the error to EGL_SUCCESS. |
92 | |
93 | Preconditions: |
94 | |
95 | - |
96 | |
97 | Postconditions: |
98 | |
99 | Result is in the list (CLIENT_THREAD_STATE_ERROR) |
100 | |
101 | Invariants preserved: |
102 | |
103 | - |
104 | |
105 | Invariants used: |
106 | |
107 | (CLIENT_THREAD_STATE_ERROR) |
108 | */ |
109 | |
110 | EGLAPI EGLint EGLAPIENTRY eglGetError(void) |
111 | { |
112 | CLIENT_THREAD_STATE_T *thread = CLIENT_GET_CHECK_THREAD_STATE(); |
113 | |
114 | if (thread) |
115 | { |
116 | EGLint result; |
117 | |
118 | vcos_assert( thread != NULL ); |
119 | |
120 | result = thread->error; |
121 | thread->error = EGL_SUCCESS; |
122 | |
123 | return result; |
124 | } |
125 | else |
126 | return EGL_SUCCESS; |
127 | } |
128 | |
129 | /* |
130 | EGLAPI EGLDisplay EGLAPIENTRY eglGetDisplay(EGLNativeDisplayType display_id) |
131 | |
132 | Khronos documentation: |
133 | |
134 | 3.2 Initialization |
135 | Initialization must be performed once for each display prior to calling most other |
136 | EGL or client API functions. A display can be obtained by calling |
137 | EGLDisplay eglGetDisplay(EGLNativeDisplayType |
138 | display id); |
139 | The type and format of display id are implementation-specific, and it describes a |
140 | specific display provided by the system EGL is running on. For example, an EGL |
141 | implementation under X windows would require display id to be an X Display, |
142 | while an implementation under Microsoft Windows would require display id to be |
143 | a Windows Device Context. If display id is EGL DEFAULT DISPLAY, a default |
144 | display is returned. |
145 | If no display matching display id is available, EGL NO DISPLAY is returned; |
146 | no error condition is raised in this case. |
147 | |
148 | Implementation notes: |
149 | |
150 | We only support one display. This is assumed to have a native display_id |
151 | of 0 (==EGL_DEFAULT_DISPLAY) and an EGLDisplay id of 1 |
152 | |
153 | Preconditions: |
154 | |
155 | - |
156 | |
157 | Postconditions: |
158 | |
159 | - |
160 | |
161 | Invariants preserved: |
162 | |
163 | - |
164 | |
165 | Invariants used: |
166 | |
167 | - |
168 | */ |
169 | |
170 | EGLAPI EGLDisplay EGLAPIENTRY eglGetDisplay(EGLNativeDisplayType display_id) |
171 | { |
172 | CLIENT_THREAD_STATE_T *thread = CLIENT_GET_CHECK_THREAD_STATE(); |
173 | if (thread) |
174 | thread->error = EGL_SUCCESS; |
175 | |
176 | return khrn_platform_set_display_id(display_id); |
177 | } |
178 | |
179 | |
180 | //eglInitialize |
181 | //eglTerminate |
182 | //eglQueryString |
183 | |
184 | /* |
185 | EGLAPI EGLBoolean EGLAPIENTRY eglGetConfigs(EGLDisplay dpy, EGLConfig *configs, EGLint config_size, EGLint *num_config) |
186 | |
187 | Khronos documentation: |
188 | |
189 | 3.4.1 Querying Configurations |
190 | Use |
191 | EGLBoolean eglGetConfigs(EGLDisplay dpy, |
192 | EGLConfig *configs, EGLint config size, |
193 | EGLint *num config); |
194 | to get the list of all EGLConfigs that are available on the specified display. configs |
195 | is a pointer to a buffer containing config size elements. On success, EGL TRUE is |
196 | returned. The number of configurations is returned in num config, and elements 0 |
197 | through num config - 1 of configs are filled in with the valid EGLConfigs. No |
198 | more than config size EGLConfigs will be returned even if more are available on |
199 | the specified display. However, if eglGetConfigs is called with configs = NULL, |
200 | then no configurations are returned, but the total number of configurations available |
201 | will be returned in num config. |
202 | On failure, EGL FALSE is returned. An EGL NOT INITIALIZED error is generated |
203 | if EGL is not initialized on dpy. An EGL BAD PARAMETER error is generated |
204 | if num config is NULL. |
205 | |
206 | Implementation notes: |
207 | |
208 | - |
209 | |
210 | Preconditions: |
211 | |
212 | configs is NULL or a valid pointer to config_size elements |
213 | num_config is NULL or a valid pointer |
214 | |
215 | Postconditions: |
216 | |
217 | The following conditions cause error to assume the specified value |
218 | |
219 | EGL_BAD_DISPLAY An EGLDisplay argument does not name a valid EGLDisplay |
220 | EGL_NOT_INITIALIZED EGL is not initialized for the specified display. |
221 | EGL_BAD_PARAMETER num_config is null |
222 | EGL_SUCCESS Function succeeded. |
223 | |
224 | if more than one condition holds, the first error is generated. |
225 | |
226 | Invariants preserved: |
227 | |
228 | - |
229 | |
230 | Invariants used: |
231 | |
232 | - |
233 | */ |
234 | |
235 | EGLAPI EGLBoolean EGLAPIENTRY eglGetConfigs(EGLDisplay dpy, EGLConfig *configs, EGLint config_size, EGLint *num_config) |
236 | { |
237 | CLIENT_THREAD_STATE_T *thread; |
238 | CLIENT_PROCESS_STATE_T *process; |
239 | EGLBoolean result; |
240 | |
241 | if (CLIENT_LOCK_AND_GET_STATES(dpy, &thread, &process)) |
242 | { |
243 | if (!num_config) { |
244 | thread->error = EGL_BAD_PARAMETER; |
245 | result = EGL_FALSE; |
246 | } else if (!configs) { |
247 | thread->error = EGL_SUCCESS; |
248 | *num_config = EGL_MAX_CONFIGS; |
249 | result = EGL_TRUE; |
250 | } else { |
251 | int i; |
252 | for (i = 0; i < EGL_MAX_CONFIGS && i < config_size; i++) |
253 | configs[i] = egl_config_from_id(i); |
254 | |
255 | thread->error = EGL_SUCCESS; |
256 | *num_config = i; |
257 | result = EGL_TRUE; |
258 | } |
259 | CLIENT_UNLOCK(); |
260 | } |
261 | else |
262 | result = EGL_FALSE; |
263 | |
264 | return result; |
265 | } |
266 | |
267 | /* |
268 | EGLAPI EGLBoolean EGLAPIENTRY eglChooseConfig(EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config) |
269 | |
270 | Khronos documentation: |
271 | |
272 | Use |
273 | EGLBoolean eglChooseConfig(EGLDisplay dpy, const |
274 | EGLint *attrib list, EGLConfig *configs, |
275 | EGLint config size, EGLint *num config); |
276 | to get EGLConfigs that match a list of attributes. The return value and the meaning |
277 | of configs, config size, and num config are the same as for eglGetConfigs. |
278 | However, only configurations matching attrib list, as discussed below, will be returned. |
279 | On failure, EGL FALSE is returned. An EGL BAD ATTRIBUTE error is generated |
280 | if attrib list contains an undefined EGL attribute or an attribute value that is |
281 | unrecognized or out of range. |
282 | All attribute names in attrib list are immediately followed by the corresponding |
283 | desired value. The list is terminated with EGL NONE. If an attribute is not specified |
284 | in attrib list, then the default value (listed in Table 3.4) is used (it is said to be |
285 | specified implicitly). If EGL_DONT_CARE is specified as an attribute value, then the |
286 | attribute will not be checked. EGL_DONT_CARE may be specified for all attributes |
287 | except EGL LEVEL. If attrib list is NULL or empty (first attribute is EGL NONE), |
288 | then selection and sorting of EGLConfigs is done according to the default criteria |
289 | in Tables 3.4 and 3.1, as described below under Selection and Sorting. |
290 | Selection of EGLConfigs |
291 | Attributes are matched in an attribute-specific manner, as shown in the ”Selection |
292 | Critera” column of table 3.4. The criteria listed in the table have the following |
293 | meanings: |
294 | AtLeast Only EGLConfigs with an attribute value that meets or exceeds the |
295 | specified value are selected. |
296 | Exact Only EGLConfigs whose attribute value equals the specified value are |
297 | matched. |
298 | Mask Only EGLConfigs for which the bits set in the attribute value include all |
299 | the bits that are set in the specified value are selected (additional bits might |
300 | be set in the attribute value). |
301 | Special As described for the specific attribute. |
302 | Some of the attributes must match the specified value exactly; others, such as |
303 | EGL RED SIZE, must meet or exceed the specified minimum values. |
304 | To retrieve an EGLConfig given its unique integer ID, use the |
305 | EGL CONFIG ID attribute. When EGL CONFIG ID is specified, all other attributes |
306 | are ignored, and only the EGLConfig with the given ID is returned. |
307 | If EGL MAX PBUFFER WIDTH, EGL MAX PBUFFER HEIGHT, |
308 | EGL MAX PBUFFER PIXELS, or EGL NATIVE VISUAL ID are specified in |
309 | attrib list, then they are ignored (however, if present, these attributes must still be |
310 | Version 1.3 - December 4, 2006 |
311 | 3.4. CONFIGURATION MANAGEMENT 21 |
312 | followed by an attribute value in attrib list). If EGL SURFACE TYPE is specified |
313 | in attrib list and the mask that follows does not have EGL WINDOW BIT set, or if |
314 | there are no native visual types, then the EGL NATIVE VISUAL TYPE attribute is |
315 | ignored. |
316 | If EGL TRANSPARENT TYPE is set to EGL NONE in attrib list, then |
317 | the EGL TRANSPARENT RED VALUE, EGL TRANSPARENT GREEN VALUE, and |
318 | EGL TRANSPARENT BLUE VALUE attributes are ignored. |
319 | If EGL MATCH NATIVE PIXMAP is specified in attrib list, it must be followed |
320 | by an attribute value which is the handle of a valid native pixmap. Only |
321 | EGLConfigs which support rendering to that pixmap will match this attribute2. |
322 | If no EGLConfig matching the attribute list exists, then the call succeeds, but |
323 | num config is set to 0. |
324 | |
325 | Attribute Default Selection Sort Sort |
326 | Criteria Order Priority |
327 | EGL_BUFFER_SIZE 0 AtLeast Smaller 4 |
328 | EGL_RED_SIZE 0 AtLeast Special 3 |
329 | EGL_GREEN_SIZE 0 AtLeast Special 3 |
330 | EGL_BLUE_SIZE 0 AtLeast Special 3 |
331 | EGL_LUMINANCE_SIZE 0 AtLeast Special 3 |
332 | EGL_ALPHA_SIZE 0 AtLeast Special 3 |
333 | EGL_ALPHA_MASK_SIZE 0 AtLeast Smaller 9 |
334 | EGL_BIND_TO_TEXTURE_RGB EGL_DONT_CARE Exact None |
335 | EGL_BIND_TO_TEXTURE_RGBA EGL_DONT_CARE Exact None |
336 | EGL_COLOR_BUFFER_TYPE EGL_RGB BUFFER Exact None 2 |
337 | EGL_CONFIG_CAVEAT EGL_DONT_CARE Exact Special 1 |
338 | EGL_CONFIG_ID EGL_DONT_CARE Exact Smaller 11 (last) |
339 | EGL_CONFORMANT 0 Mask None |
340 | EGL_DEPTH_SIZE 0 AtLeast Smaller 7 |
341 | EGL_LEVEL 0 Exact None |
342 | EGL_MATCH_NATIVE_PIXMAP EGL_NONE Special None |
343 | EGL_MAX_SWAP_INTERVAL EGL_DONT_CARE Exact None |
344 | EGL_MIN_SWAP_INTERVAL EGL_DONT_CARE Exact None |
345 | EGL_NATIVE_RENDERABLE EGL_DONT_CARE Exact None |
346 | EGL_NATIVE_VISUAL_TYPE EGL_DONT_CARE Exact Special 10 |
347 | EGL_RENDERABLE_TYPE EGL_OPENGL_ES_BIT Mask None |
348 | EGL_SAMPLE_BUFFERS 0 AtLeast Smaller 5 |
349 | EGL_SAMPLES 0 AtLeast Smaller 6 |
350 | EGL_STENCIL_SIZE 0 AtLeast Smaller 8 |
351 | EGL_SURFACE_TYPE EGL_WINDOW_BIT Mask None |
352 | EGL_TRANSPARENT_TYPE EGL_NONE Exact None |
353 | EGL_TRANSPARENT_RED_VALUE EGL_DONT_CARE Exact None |
354 | EGL_TRANSPARENT_GREEN_VALUE EGL_DONT_CARE Exact None |
355 | EGL_TRANSPARENT_BLUE_VALUE EGL_DONT_CARE Exact None |
356 | Table 3.4: Default values and match criteria for EGLConfig attributes. |
357 | |
358 | |
359 | 2 The special match criteria for EGL MATCH NATIVE PIXMAP was introduced due to the |
360 | difficulty of determining an EGLConfig equivalent to a native pixmap using only color component |
361 | depths. |
362 | 3This rule places configs with deeper color buffers first in the list returned by eglChooseConfig. |
363 | Applications may find this counterintuitive, and need to perform additional processing on the list of |
364 | configs to find one best matching their requirements. For example, specifying RGBA depths of 5651 |
365 | could return a list whose first config has a depth of 8888. |
366 | |
367 | Implementation notes: |
368 | |
369 | Configurations are not always returned in the same order; the sort order depends on |
370 | whether we care about EGL_RED_SIZE, EGL_GREEN_SIZE, etc. So we need to extract the information |
371 | about which of these we care about, then pass this to a sorting function. |
372 | |
373 | Preconditions: |
374 | |
375 | configs is NULL or a valid pointer to config_size elements |
376 | num_config is NULL or a valid pointer |
377 | attrib_list is NULL or a pointer to an EGL_NONE-terminated list of attribute/value pairs |
378 | |
379 | Postconditions: |
380 | |
381 | The following conditions cause error to assume the specified value |
382 | |
383 | EGL_BAD_DISPLAY An EGLDisplay argument does not name a valid EGLDisplay |
384 | EGL_NOT_INITIALIZED EGL is not initialized for dpy |
385 | EGL_BAD_PARAMETER num_config is null |
386 | EGL_BAD_ATTRIBUTE attrib_list contains an undefined EGL attribute |
387 | EGL_BAD_ATTRIBUTE attrib_list contains an attribute value that is unrecognized or out of range. |
388 | EGL_SUCCESS Function succeeded. |
389 | |
390 | if more than one condition holds, the first error is generated. |
391 | |
392 | Invariants preserved: |
393 | |
394 | - |
395 | |
396 | Invariants used: |
397 | |
398 | - |
399 | */ |
400 | |
401 | static EGLBoolean choose_config(EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config, bool sane) |
402 | { |
403 | CLIENT_THREAD_STATE_T *thread; |
404 | CLIENT_PROCESS_STATE_T *process; |
405 | EGLBoolean result; |
406 | |
407 | if (CLIENT_LOCK_AND_GET_STATES(dpy, &thread, &process)) |
408 | { |
409 | if (!num_config) { |
410 | thread->error = EGL_BAD_PARAMETER; |
411 | result = EGL_FALSE; |
412 | } else { |
413 | /* |
414 | check for invalid attributes, and find color components for which |
415 | we have expressed a preference |
416 | */ |
417 | |
418 | bool use_red = false; |
419 | bool use_green = false; |
420 | bool use_blue = false; |
421 | bool use_alpha = false; |
422 | |
423 | if (!egl_config_check_attribs(attrib_list, &use_red, &use_green, &use_blue, &use_alpha)) { |
424 | thread->error = EGL_BAD_ATTRIBUTE; |
425 | result = EGL_FALSE; |
426 | } else { |
427 | |
428 | /* |
429 | sort configs |
430 | */ |
431 | |
432 | int ids[EGL_MAX_CONFIGS]; |
433 | int i, j; |
434 | |
435 | for (i = 0; i < EGL_MAX_CONFIGS; i++) |
436 | ids[i] = i; |
437 | |
438 | egl_config_sort(ids, |
439 | !sane && use_red, !sane && use_green, |
440 | !sane && use_blue, !sane && use_alpha); |
441 | |
442 | /* |
443 | return configs |
444 | */ |
445 | |
446 | j = 0; |
447 | for (i = 0; i < EGL_MAX_CONFIGS; i++) { |
448 | if (egl_config_filter(ids[i], attrib_list)) { |
449 | if (configs && j < config_size) { |
450 | configs[j] = egl_config_from_id(ids[i]); |
451 | j++; |
452 | } else if (!configs) { |
453 | // If configs==NULL then we count all configs |
454 | // Otherwise we only count the configs we return |
455 | j++; |
456 | } |
457 | } |
458 | } |
459 | |
460 | thread->error = EGL_SUCCESS; |
461 | *num_config = j; |
462 | result = EGL_TRUE; |
463 | } |
464 | } |
465 | |
466 | CLIENT_UNLOCK(); |
467 | } |
468 | else |
469 | result = EGL_FALSE; |
470 | |
471 | return result; |
472 | } |
473 | |
474 | EGLAPI EGLBoolean EGLAPIENTRY eglChooseConfig(EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config) |
475 | { |
476 | return choose_config(dpy, attrib_list, configs, config_size, num_config, false); |
477 | } |
478 | |
479 | #if EGL_BRCM_sane_choose_config |
480 | EGLAPI EGLBoolean EGLAPIENTRY eglSaneChooseConfigBRCM(EGLDisplay dpy, const EGLint *attrib_list, EGLConfig *configs, EGLint config_size, EGLint *num_config) |
481 | { |
482 | return choose_config(dpy, attrib_list, configs, config_size, num_config, true); |
483 | } |
484 | #endif |
485 | |
486 | /* |
487 | EGLBoolean EGLAPIENTRY eglGetConfigAttrib(EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint *value) |
488 | |
489 | Khronos documentation: |
490 | 3.4.3 Querying Configuration Attributes |
491 | To get the value of an EGLConfig attribute, use |
492 | EGLBoolean eglGetConfigAttrib(EGLDisplay dpy, |
493 | EGLConfig config, EGLint attribute, EGLint |
494 | *value); |
495 | If eglGetConfigAttrib succeeds then it returns EGL_TRUE and the value for the |
496 | specified attribute is returned in value. Otherwise it returns EGL_FALSE. If attribute |
497 | is not a valid attribute then EGL_BAD_ATTRIBUTE is generated. |
498 | Refer to Table 3.1 and Table 3.4 for a list of valid EGL attributes. |
499 | |
500 | EGL_BUFFER_SIZE integer depth of the color buffer |
501 | EGL_RED_SIZE integer bits of Red in the color buffer |
502 | EGL_GREEN_SIZE integer bits of Green in the color buffer |
503 | EGL_BLUE_SIZE integer bits of Blue in the color buffer |
504 | EGL_LUMINANCE_SIZE integer bits of Luminance in the color buffer |
505 | EGL_ALPHA_SIZE integer bits of Alpha in the color buffer |
506 | EGL_ALPHA_MASK_SIZE integer bits of Alpha Mask in the mask buffer |
507 | EGL_BIND_TO_TEXTURE_RGB boolean True if bindable to RGB textures. |
508 | EGL_BIND_TO_TEXTURE_RGBA boolean True if bindable to RGBA textures. |
509 | EGL_COLOR_BUFFER_TYPE enum color buffer type |
510 | EGL_CONFIG_CAVEAT enum any caveats for the configuration |
511 | EGL_CONFIG_ID integer unique EGLConfig identifier |
512 | EGL_CONFORMANT bitmask whether contexts created with this config are conformant |
513 | EGL_DEPTH_SIZE integer bits of Z in the depth buffer |
514 | EGL_LEVEL integer frame buffer level |
515 | EGL_MAX_PBUFFER_WIDTH integer maximum width of pbuffer |
516 | EGL_MAX_PBUFFER_HEIGHT integer maximum height of pbuffer |
517 | EGL_MAX_PBUFFER_PIXELS integer maximum size of pbuffer |
518 | EGL_MAX_SWAP_INTERVAL integer maximum swap interval |
519 | EGL_MIN_SWAP_INTERVAL integer minimum swap interval |
520 | EGL_NATIVE_RENDERABLE boolean EGL_TRUE if native rendering APIs can render to surface |
521 | EGL_NATIVE_VISUAL_ID integer handle of corresponding native visual |
522 | EGL_NATIVE_VISUAL_TYPE integer native visual type of the associated visual |
523 | EGL_RENDERABLE_TYPE bitmask which client APIs are supported |
524 | EGL_SAMPLE_BUFFERS integer number of multisample buffers |
525 | EGL_SAMPLES integer number of samples per pixel |
526 | EGL_STENCIL_SIZE integer bits of Stencil in the stencil buffer |
527 | EGL_SURFACE_TYPE bitmask which types of EGL surfaces are supported. |
528 | EGL_TRANSPARENT_TYPE enum type of transparency supported |
529 | EGL_TRANSPARENT_RED_VALUE integer transparent red value |
530 | EGL_TRANSPARENT_GREEN_VALUE integer transparent green value |
531 | EGL_TRANSPARENT_BLUE_VALUE integer transparent blue value |
532 | |
533 | Preconditions: |
534 | |
535 | value is null or a valid pointer |
536 | |
537 | Postconditions: |
538 | |
539 | The following conditions cause error to assume the specified value |
540 | |
541 | EGL_BAD_DISPLAY An EGLDisplay argument does not name a valid EGLDisplay |
542 | EGL_NOT_INITIALIZED EGL is not initialized for the specified display. |
543 | EGL_BAD_PARAMETER value is null |
544 | EGL_BAD_CONFIG config does not name a valid EGLConfig |
545 | EGL_BAD_ATTRIBUTE attribute is not a valid attribute |
546 | EGL_SUCCESS Function succeeded. |
547 | |
548 | if more than one condition holds, the first error is generated. |
549 | |
550 | */ |
551 | |
552 | EGLAPI EGLBoolean EGLAPIENTRY eglGetConfigAttrib(EGLDisplay dpy, EGLConfig config, EGLint attribute, EGLint *value) |
553 | { |
554 | CLIENT_THREAD_STATE_T *thread; |
555 | CLIENT_PROCESS_STATE_T *process; |
556 | EGLBoolean result; |
557 | |
558 | if (CLIENT_LOCK_AND_GET_STATES(dpy, &thread, &process)) |
559 | { |
560 | if (!value) { |
561 | thread->error = EGL_BAD_PARAMETER; |
562 | result = EGL_FALSE; |
563 | } else if (egl_config_to_id(config) < 0 || egl_config_to_id(config) >= EGL_MAX_CONFIGS) { |
564 | thread->error = EGL_BAD_CONFIG; |
565 | result = EGL_FALSE; |
566 | } else if (!egl_config_get_attrib(egl_config_to_id(config), attribute, value)) { |
567 | thread->error = EGL_BAD_ATTRIBUTE; |
568 | result = EGL_FALSE; |
569 | } else { |
570 | thread->error = EGL_SUCCESS; |
571 | result = EGL_TRUE; |
572 | } |
573 | CLIENT_UNLOCK(); |
574 | } |
575 | else |
576 | result = EGL_FALSE; |
577 | |
578 | return result; |
579 | } |
580 | |