2 * Public EGL API entrypoints
4 * Generally, we use the EGLDisplay parameter as a key to lookup the
5 * appropriate device driver handle, then jump though the driver's
6 * dispatch table to handle the function.
8 * That allows us the option of supporting multiple, simultaneous,
9 * heterogeneous hardware devices in the future.
11 * The EGLDisplay, EGLConfig, EGLContext and EGLSurface types are
12 * opaque handles implemented with 32-bit unsigned integers.
13 * It's up to the driver function or fallback function to look up the
14 * handle and get an object.
15 * By using opaque handles, we leave open the possibility of having
16 * indirect rendering in the future, like GLX.
19 * Notes on naming conventions:
21 * eglFooBar - public EGL function
22 * EGL_FOO_BAR - public EGL token
23 * EGLDatatype - public EGL datatype
25 * _eglFooBar - private EGL function
26 * _EGLDatatype - private EGL datatype, typedef'd struct
27 * _egl_struct - private EGL struct, non-typedef'd
35 #include "eglcontext.h"
36 #include "egldisplay.h"
37 #include "egltypedefs.h"
38 #include "eglglobals.h"
39 #include "egldriver.h"
40 #include "eglsurface.h"
41 #include "eglconfig.h"
42 #include "eglscreen.h"
47 * This is typically the first EGL function that an application calls.
48 * We initialize our global vars and create a private _EGLDisplay object.
50 EGLDisplay EGLAPIENTRY
51 eglGetDisplay(NativeDisplayType nativeDisplay
)
54 dpy
= _eglFindDisplay(nativeDisplay
);
56 dpy
= _eglNewDisplay(nativeDisplay
);
60 return _eglGetDisplayHandle(dpy
);
65 * This is typically the second EGL function that an application calls.
66 * Here we load/initialize the actual hardware driver.
68 EGLBoolean EGLAPIENTRY
69 eglInitialize(EGLDisplay dpy
, EGLint
*major
, EGLint
*minor
)
71 _EGLDisplay
*disp
= _eglLookupDisplay(dpy
);
73 EGLint major_int
, minor_int
;
76 return _eglError(EGL_BAD_DISPLAY
, __FUNCTION__
);
80 drv
= _eglOpenDriver(disp
);
82 return _eglError(EGL_NOT_INITIALIZED
, __FUNCTION__
);
84 /* Initialize the particular display now */
85 if (!drv
->API
.Initialize(drv
, disp
, &major_int
, &minor_int
)) {
86 _eglCloseDriver(drv
, disp
);
87 return _eglError(EGL_NOT_INITIALIZED
, __FUNCTION__
);
90 drv
->APImajor
= major_int
;
91 drv
->APIminor
= minor_int
;
92 snprintf(drv
->Version
, sizeof(drv
->Version
),
93 "%d.%d (%s)", major_int
, minor_int
, drv
->Name
);
97 major_int
= drv
->APImajor
;
98 minor_int
= drv
->APIminor
;
101 /* Update applications version of major and minor if not NULL */
102 if ((major
!= NULL
) && (minor
!= NULL
)) {
111 EGLBoolean EGLAPIENTRY
112 eglTerminate(EGLDisplay dpy
)
114 _EGLDisplay
*disp
= _eglLookupDisplay(dpy
);
118 return _eglError(EGL_BAD_DISPLAY
, __FUNCTION__
);
122 /* TODO drv->API.Terminate should be called here */
123 _eglCloseDriver(drv
, disp
);
132 * A bunch of check functions and declare macros to simply error checking.
134 static INLINE _EGLDriver
*
135 _eglCheckDisplay(_EGLDisplay
*disp
, const char *msg
)
138 _eglError(EGL_BAD_DISPLAY
, msg
);
142 _eglError(EGL_NOT_INITIALIZED
, msg
);
149 static INLINE _EGLDriver
*
150 _eglCheckSurface(_EGLDisplay
*disp
, _EGLSurface
*surf
, const char *msg
)
152 _EGLDriver
*drv
= _eglCheckDisplay(disp
, msg
);
156 _eglError(EGL_BAD_SURFACE
, msg
);
163 static INLINE _EGLDriver
*
164 _eglCheckContext(_EGLDisplay
*disp
, _EGLContext
*context
, const char *msg
)
166 _EGLDriver
*drv
= _eglCheckDisplay(disp
, msg
);
170 _eglError(EGL_BAD_CONTEXT
, msg
);
177 static INLINE _EGLDriver
*
178 _eglCheckConfig(_EGLDisplay
*disp
, _EGLConfig
*conf
, const char *msg
)
180 _EGLDriver
*drv
= _eglCheckDisplay(disp
, msg
);
184 _eglError(EGL_BAD_CONFIG
, msg
);
191 #define _EGL_DECLARE_DD(dpy) \
192 _EGLDisplay *disp = _eglLookupDisplay(dpy); \
195 drv = _eglCheckDisplay(disp, __FUNCTION__); \
201 #define _EGL_DECLARE_DD_AND_SURFACE(dpy, surface) \
202 _EGLDisplay *disp = _eglLookupDisplay(dpy); \
203 _EGLSurface *surf = _eglLookupSurface((surface), disp); \
206 drv = _eglCheckSurface(disp, surf, __FUNCTION__); \
212 #define _EGL_DECLARE_DD_AND_CONTEXT(dpy, ctx) \
213 _EGLDisplay *disp = _eglLookupDisplay(dpy); \
214 _EGLContext *context = _eglLookupContext((ctx), disp); \
217 drv = _eglCheckContext(disp, context, __FUNCTION__); \
223 #ifdef EGL_MESA_screen_surface
226 static INLINE _EGLDriver
*
227 _eglCheckScreen(_EGLDisplay
*disp
, _EGLScreen
*scrn
, const char *msg
)
229 _EGLDriver
*drv
= _eglCheckDisplay(disp
, msg
);
233 _eglError(EGL_BAD_SCREEN_MESA
, msg
);
240 static INLINE _EGLDriver
*
241 _eglCheckMode(_EGLDisplay
*disp
, _EGLMode
*m
, const char *msg
)
243 _EGLDriver
*drv
= _eglCheckDisplay(disp
, msg
);
247 _eglError(EGL_BAD_MODE_MESA
, msg
);
254 #define _EGL_DECLARE_DD_AND_SCREEN(dpy, screen) \
255 _EGLDisplay *disp = _eglLookupDisplay(dpy); \
256 _EGLScreen *scrn = _eglLookupScreen((screen), disp); \
259 drv = _eglCheckScreen(disp, scrn, __FUNCTION__); \
265 #define _EGL_DECLARE_DD_AND_MODE(dpy, mode) \
266 _EGLDisplay *disp = _eglLookupDisplay(dpy); \
267 _EGLMode *m = _eglLookupMode((mode), disp); \
270 drv = _eglCheckMode(disp, m, __FUNCTION__); \
276 #endif /* EGL_MESA_screen_surface */
279 const char * EGLAPIENTRY
280 eglQueryString(EGLDisplay dpy
, EGLint name
)
282 _EGL_DECLARE_DD(dpy
);
283 return drv
->API
.QueryString(drv
, disp
, name
);
287 EGLBoolean EGLAPIENTRY
288 eglGetConfigs(EGLDisplay dpy
, EGLConfig
*configs
,
289 EGLint config_size
, EGLint
*num_config
)
291 _EGL_DECLARE_DD(dpy
);
292 return drv
->API
.GetConfigs(drv
, disp
, configs
, config_size
, num_config
);
296 EGLBoolean EGLAPIENTRY
297 eglChooseConfig(EGLDisplay dpy
, const EGLint
*attrib_list
, EGLConfig
*configs
,
298 EGLint config_size
, EGLint
*num_config
)
300 _EGL_DECLARE_DD(dpy
);
301 return drv
->API
.ChooseConfig(drv
, disp
, attrib_list
, configs
,
302 config_size
, num_config
);
306 EGLBoolean EGLAPIENTRY
307 eglGetConfigAttrib(EGLDisplay dpy
, EGLConfig config
,
308 EGLint attribute
, EGLint
*value
)
310 _EGLDisplay
*disp
= _eglLookupDisplay(dpy
);
311 _EGLConfig
*conf
= _eglLookupConfig(config
, disp
);
314 drv
= _eglCheckConfig(disp
, conf
, __FUNCTION__
);
318 return drv
->API
.GetConfigAttrib(drv
, disp
, conf
, attribute
, value
);
322 EGLContext EGLAPIENTRY
323 eglCreateContext(EGLDisplay dpy
, EGLConfig config
, EGLContext share_list
,
324 const EGLint
*attrib_list
)
326 _EGLDisplay
*disp
= _eglLookupDisplay(dpy
);
327 _EGLConfig
*conf
= _eglLookupConfig(config
, disp
);
328 _EGLContext
*share
= _eglLookupContext(share_list
, disp
);
330 _EGLContext
*context
;
332 drv
= _eglCheckConfig(disp
, conf
, __FUNCTION__
);
334 return EGL_NO_CONTEXT
;
335 if (!share
&& share_list
!= EGL_NO_CONTEXT
) {
336 _eglError(EGL_BAD_CONTEXT
, __FUNCTION__
);
337 return EGL_NO_CONTEXT
;
340 context
= drv
->API
.CreateContext(drv
, disp
, conf
, share
, attrib_list
);
342 return _eglLinkContext(context
, disp
);
344 return EGL_NO_CONTEXT
;
348 EGLBoolean EGLAPIENTRY
349 eglDestroyContext(EGLDisplay dpy
, EGLContext ctx
)
351 _EGL_DECLARE_DD_AND_CONTEXT(dpy
, ctx
);
352 _eglUnlinkContext(context
);
353 return drv
->API
.DestroyContext(drv
, disp
, context
);
357 EGLBoolean EGLAPIENTRY
358 eglMakeCurrent(EGLDisplay dpy
, EGLSurface draw
, EGLSurface read
,
361 _EGLDisplay
*disp
= _eglLookupDisplay(dpy
);
362 _EGLContext
*context
= _eglLookupContext(ctx
, disp
);
363 _EGLSurface
*draw_surf
= _eglLookupSurface(draw
, disp
);
364 _EGLSurface
*read_surf
= _eglLookupSurface(read
, disp
);
367 drv
= _eglCheckDisplay(disp
, __FUNCTION__
);
370 if (!context
&& ctx
!= EGL_NO_CONTEXT
)
371 return _eglError(EGL_BAD_CONTEXT
, __FUNCTION__
);
372 if ((!draw_surf
&& draw
!= EGL_NO_SURFACE
) ||
373 (!read_surf
&& read
!= EGL_NO_SURFACE
))
374 return _eglError(EGL_BAD_SURFACE
, __FUNCTION__
);
376 return drv
->API
.MakeCurrent(drv
, disp
, draw_surf
, read_surf
, context
);
380 EGLBoolean EGLAPIENTRY
381 eglQueryContext(EGLDisplay dpy
, EGLContext ctx
,
382 EGLint attribute
, EGLint
*value
)
384 _EGL_DECLARE_DD_AND_CONTEXT(dpy
, ctx
);
385 return drv
->API
.QueryContext(drv
, disp
, context
, attribute
, value
);
389 EGLSurface EGLAPIENTRY
390 eglCreateWindowSurface(EGLDisplay dpy
, EGLConfig config
,
391 NativeWindowType window
, const EGLint
*attrib_list
)
393 _EGLDisplay
*disp
= _eglLookupDisplay(dpy
);
394 _EGLConfig
*conf
= _eglLookupConfig(config
, disp
);
398 drv
= _eglCheckConfig(disp
, conf
, __FUNCTION__
);
400 return EGL_NO_SURFACE
;
402 surf
= drv
->API
.CreateWindowSurface(drv
, disp
, conf
, window
, attrib_list
);
404 return _eglLinkSurface(surf
, disp
);
406 return EGL_NO_SURFACE
;
410 EGLSurface EGLAPIENTRY
411 eglCreatePixmapSurface(EGLDisplay dpy
, EGLConfig config
,
412 NativePixmapType pixmap
, const EGLint
*attrib_list
)
414 _EGLDisplay
*disp
= _eglLookupDisplay(dpy
);
415 _EGLConfig
*conf
= _eglLookupConfig(config
, disp
);
419 drv
= _eglCheckConfig(disp
, conf
, __FUNCTION__
);
421 return EGL_NO_SURFACE
;
423 surf
= drv
->API
.CreatePixmapSurface(drv
, disp
, conf
, pixmap
, attrib_list
);
425 return _eglLinkSurface(surf
, disp
);
427 return EGL_NO_SURFACE
;
431 EGLSurface EGLAPIENTRY
432 eglCreatePbufferSurface(EGLDisplay dpy
, EGLConfig config
,
433 const EGLint
*attrib_list
)
435 _EGLDisplay
*disp
= _eglLookupDisplay(dpy
);
436 _EGLConfig
*conf
= _eglLookupConfig(config
, disp
);
440 drv
= _eglCheckConfig(disp
, conf
, __FUNCTION__
);
442 return EGL_NO_SURFACE
;
444 surf
= drv
->API
.CreatePbufferSurface(drv
, disp
, conf
, attrib_list
);
446 return _eglLinkSurface(surf
, disp
);
448 return EGL_NO_SURFACE
;
452 EGLBoolean EGLAPIENTRY
453 eglDestroySurface(EGLDisplay dpy
, EGLSurface surface
)
455 _EGL_DECLARE_DD_AND_SURFACE(dpy
, surface
);
456 _eglUnlinkSurface(surf
);
457 return drv
->API
.DestroySurface(drv
, disp
, surf
);
460 EGLBoolean EGLAPIENTRY
461 eglQuerySurface(EGLDisplay dpy
, EGLSurface surface
,
462 EGLint attribute
, EGLint
*value
)
464 _EGL_DECLARE_DD_AND_SURFACE(dpy
, surface
);
465 return drv
->API
.QuerySurface(drv
, disp
, surf
, attribute
, value
);
468 EGLBoolean EGLAPIENTRY
469 eglSurfaceAttrib(EGLDisplay dpy
, EGLSurface surface
,
470 EGLint attribute
, EGLint value
)
472 _EGL_DECLARE_DD_AND_SURFACE(dpy
, surface
);
473 return drv
->API
.SurfaceAttrib(drv
, disp
, surf
, attribute
, value
);
477 EGLBoolean EGLAPIENTRY
478 eglBindTexImage(EGLDisplay dpy
, EGLSurface surface
, EGLint buffer
)
480 _EGL_DECLARE_DD_AND_SURFACE(dpy
, surface
);
481 return drv
->API
.BindTexImage(drv
, disp
, surf
, buffer
);
485 EGLBoolean EGLAPIENTRY
486 eglReleaseTexImage(EGLDisplay dpy
, EGLSurface surface
, EGLint buffer
)
488 _EGL_DECLARE_DD_AND_SURFACE(dpy
, surface
);
489 return drv
->API
.ReleaseTexImage(drv
, disp
, surf
, buffer
);
493 EGLBoolean EGLAPIENTRY
494 eglSwapInterval(EGLDisplay dpy
, EGLint interval
)
496 _EGL_DECLARE_DD(dpy
);
497 return drv
->API
.SwapInterval(drv
, disp
, interval
);
501 EGLBoolean EGLAPIENTRY
502 eglSwapBuffers(EGLDisplay dpy
, EGLSurface surface
)
504 _EGL_DECLARE_DD_AND_SURFACE(dpy
, surface
);
505 return drv
->API
.SwapBuffers(drv
, disp
, surf
);
509 EGLBoolean EGLAPIENTRY
510 eglCopyBuffers(EGLDisplay dpy
, EGLSurface surface
, NativePixmapType target
)
512 _EGL_DECLARE_DD_AND_SURFACE(dpy
, surface
);
513 return drv
->API
.CopyBuffers(drv
, disp
, surf
, target
);
517 EGLBoolean EGLAPIENTRY
520 _EGLDisplay
*disp
= _eglGetCurrentDisplay();
526 /* a current display is always initialized */
529 return drv
->API
.WaitGL(drv
, disp
);
533 EGLBoolean EGLAPIENTRY
534 eglWaitNative(EGLint engine
)
536 _EGLDisplay
*disp
= _eglGetCurrentDisplay();
542 /* a current display is always initialized */
545 return drv
->API
.WaitNative(drv
, disp
, engine
);
549 EGLDisplay EGLAPIENTRY
550 eglGetCurrentDisplay(void)
552 _EGLDisplay
*dpy
= _eglGetCurrentDisplay();
553 return _eglGetDisplayHandle(dpy
);
557 EGLContext EGLAPIENTRY
558 eglGetCurrentContext(void)
560 _EGLContext
*ctx
= _eglGetCurrentContext();
561 return _eglGetContextHandle(ctx
);
565 EGLSurface EGLAPIENTRY
566 eglGetCurrentSurface(EGLint readdraw
)
568 _EGLSurface
*s
= _eglGetCurrentSurface(readdraw
);
569 return _eglGetSurfaceHandle(s
);
576 _EGLThreadInfo
*t
= _eglGetCurrentThread();
577 EGLint e
= t
->LastError
;
578 if (!_eglIsCurrentThreadDummy())
579 t
->LastError
= EGL_SUCCESS
;
584 void (* EGLAPIENTRY
eglGetProcAddress(const char *procname
))()
586 typedef void (*genericFunc
)();
587 struct name_function
{
591 static struct name_function egl_functions
[] = {
592 /* alphabetical order */
593 { "eglBindTexImage", (_EGLProc
) eglBindTexImage
},
594 { "eglChooseConfig", (_EGLProc
) eglChooseConfig
},
595 { "eglCopyBuffers", (_EGLProc
) eglCopyBuffers
},
596 { "eglCreateContext", (_EGLProc
) eglCreateContext
},
597 { "eglCreatePbufferSurface", (_EGLProc
) eglCreatePbufferSurface
},
598 { "eglCreatePixmapSurface", (_EGLProc
) eglCreatePixmapSurface
},
599 { "eglCreateWindowSurface", (_EGLProc
) eglCreateWindowSurface
},
600 { "eglDestroyContext", (_EGLProc
) eglDestroyContext
},
601 { "eglDestroySurface", (_EGLProc
) eglDestroySurface
},
602 { "eglGetConfigAttrib", (_EGLProc
) eglGetConfigAttrib
},
603 { "eglGetConfigs", (_EGLProc
) eglGetConfigs
},
604 { "eglGetCurrentContext", (_EGLProc
) eglGetCurrentContext
},
605 { "eglGetCurrentDisplay", (_EGLProc
) eglGetCurrentDisplay
},
606 { "eglGetCurrentSurface", (_EGLProc
) eglGetCurrentSurface
},
607 { "eglGetDisplay", (_EGLProc
) eglGetDisplay
},
608 { "eglGetError", (_EGLProc
) eglGetError
},
609 { "eglGetProcAddress", (_EGLProc
) eglGetProcAddress
},
610 { "eglInitialize", (_EGLProc
) eglInitialize
},
611 { "eglMakeCurrent", (_EGLProc
) eglMakeCurrent
},
612 { "eglQueryContext", (_EGLProc
) eglQueryContext
},
613 { "eglQueryString", (_EGLProc
) eglQueryString
},
614 { "eglQuerySurface", (_EGLProc
) eglQuerySurface
},
615 { "eglReleaseTexImage", (_EGLProc
) eglReleaseTexImage
},
616 { "eglSurfaceAttrib", (_EGLProc
) eglSurfaceAttrib
},
617 { "eglSwapBuffers", (_EGLProc
) eglSwapBuffers
},
618 { "eglSwapInterval", (_EGLProc
) eglSwapInterval
},
619 { "eglTerminate", (_EGLProc
) eglTerminate
},
620 { "eglWaitGL", (_EGLProc
) eglWaitGL
},
621 { "eglWaitNative", (_EGLProc
) eglWaitNative
},
623 #ifdef EGL_MESA_screen_surface
624 { "eglChooseModeMESA", (_EGLProc
) eglChooseModeMESA
},
625 { "eglGetModesMESA", (_EGLProc
) eglGetModesMESA
},
626 { "eglGetModeAttribMESA", (_EGLProc
) eglGetModeAttribMESA
},
627 { "eglCopyContextMESA", (_EGLProc
) eglCopyContextMESA
},
628 { "eglGetScreensMESA", (_EGLProc
) eglGetScreensMESA
},
629 { "eglCreateScreenSurfaceMESA", (_EGLProc
) eglCreateScreenSurfaceMESA
},
630 { "eglShowScreenSurfaceMESA", (_EGLProc
) eglShowScreenSurfaceMESA
},
631 { "eglScreenPositionMESA", (_EGLProc
) eglScreenPositionMESA
},
632 { "eglQueryScreenMESA", (_EGLProc
) eglQueryScreenMESA
},
633 { "eglQueryScreenSurfaceMESA", (_EGLProc
) eglQueryScreenSurfaceMESA
},
634 { "eglQueryScreenModeMESA", (_EGLProc
) eglQueryScreenModeMESA
},
635 { "eglQueryModeStringMESA", (_EGLProc
) eglQueryModeStringMESA
},
636 #endif /* EGL_MESA_screen_surface */
637 #ifdef EGL_VERSION_1_2
638 { "eglBindAPI", (_EGLProc
) eglBindAPI
},
639 { "eglCreatePbufferFromClientBuffer", (_EGLProc
) eglCreatePbufferFromClientBuffer
},
640 { "eglQueryAPI", (_EGLProc
) eglQueryAPI
},
641 { "eglReleaseThread", (_EGLProc
) eglReleaseThread
},
642 { "eglWaitClient", (_EGLProc
) eglWaitClient
},
643 #endif /* EGL_VERSION_1_2 */
647 for (i
= 0; egl_functions
[i
].name
; i
++) {
648 if (strcmp(egl_functions
[i
].name
, procname
) == 0) {
649 return (genericFunc
) egl_functions
[i
].function
;
653 /* now loop over drivers to query their procs */
654 for (i
= 0; i
< _eglGlobal
.NumDrivers
; i
++) {
655 _EGLProc p
= _eglGlobal
.Drivers
[i
]->API
.GetProcAddress(procname
);
665 * EGL_MESA_screen extension
668 EGLBoolean EGLAPIENTRY
669 eglChooseModeMESA(EGLDisplay dpy
, EGLScreenMESA screen
,
670 const EGLint
*attrib_list
, EGLModeMESA
*modes
,
671 EGLint modes_size
, EGLint
*num_modes
)
673 _EGL_DECLARE_DD_AND_SCREEN(dpy
, screen
);
674 return drv
->API
.ChooseModeMESA(drv
, disp
, scrn
, attrib_list
,
675 modes
, modes_size
, num_modes
);
679 EGLBoolean EGLAPIENTRY
680 eglGetModesMESA(EGLDisplay dpy
, EGLScreenMESA screen
, EGLModeMESA
*modes
,
681 EGLint mode_size
, EGLint
*num_mode
)
683 _EGL_DECLARE_DD_AND_SCREEN(dpy
, screen
);
684 return drv
->API
.GetModesMESA(drv
, disp
, scrn
, modes
, mode_size
, num_mode
);
688 EGLBoolean EGLAPIENTRY
689 eglGetModeAttribMESA(EGLDisplay dpy
, EGLModeMESA mode
,
690 EGLint attribute
, EGLint
*value
)
692 _EGL_DECLARE_DD_AND_MODE(dpy
, mode
);
693 return drv
->API
.GetModeAttribMESA(drv
, disp
, m
, attribute
, value
);
697 EGLBoolean EGLAPIENTRY
698 eglCopyContextMESA(EGLDisplay dpy
, EGLContext source
, EGLContext dest
,
701 _EGLDisplay
*disp
= _eglLookupDisplay(dpy
);
702 _EGLContext
*source_context
= _eglLookupContext(source
, disp
);
703 _EGLContext
*dest_context
= _eglLookupContext(dest
, disp
);
706 drv
= _eglCheckContext(disp
, source_context
, __FUNCTION__
);
707 if (!drv
|| !dest_context
) {
709 _eglError(EGL_BAD_CONTEXT
, __FUNCTION__
);
713 return drv
->API
.CopyContextMESA(drv
, disp
, source_context
, dest_context
,
719 eglGetScreensMESA(EGLDisplay dpy
, EGLScreenMESA
*screens
,
720 EGLint max_screens
, EGLint
*num_screens
)
722 _EGL_DECLARE_DD(dpy
);
723 return drv
->API
.GetScreensMESA(drv
, disp
, screens
,
724 max_screens
, num_screens
);
729 eglCreateScreenSurfaceMESA(EGLDisplay dpy
, EGLConfig config
,
730 const EGLint
*attrib_list
)
732 _EGLDisplay
*disp
= _eglLookupDisplay(dpy
);
733 _EGLConfig
*conf
= _eglLookupConfig(config
, disp
);
737 drv
= _eglCheckConfig(disp
, conf
, __FUNCTION__
);
739 return EGL_NO_SURFACE
;
741 surf
= drv
->API
.CreateScreenSurfaceMESA(drv
, disp
, conf
, attrib_list
);
743 return _eglLinkSurface(surf
, disp
);
745 return EGL_NO_SURFACE
;
750 eglShowScreenSurfaceMESA(EGLDisplay dpy
, EGLint screen
,
751 EGLSurface surface
, EGLModeMESA mode
)
753 _EGLDisplay
*disp
= _eglLookupDisplay(dpy
);
754 _EGLScreen
*scrn
= _eglLookupScreen((EGLScreenMESA
) screen
, disp
);
755 _EGLSurface
*surf
= _eglLookupSurface(surface
, disp
);
756 _EGLMode
*m
= _eglLookupMode(mode
, disp
);
759 drv
= _eglCheckScreen(disp
, scrn
, __FUNCTION__
);
762 if (!surf
&& surface
!= EGL_NO_SURFACE
)
763 return _eglError(EGL_BAD_SURFACE
, __FUNCTION__
);
764 if (!m
&& mode
!= EGL_NO_MODE_MESA
)
765 return _eglError(EGL_BAD_MODE_MESA
, __FUNCTION__
);
767 return drv
->API
.ShowScreenSurfaceMESA(drv
, disp
, scrn
, surf
, m
);
772 eglScreenPositionMESA(EGLDisplay dpy
, EGLScreenMESA screen
, EGLint x
, EGLint y
)
774 _EGL_DECLARE_DD_AND_SCREEN(dpy
, screen
);
775 return drv
->API
.ScreenPositionMESA(drv
, disp
, scrn
, x
, y
);
780 eglQueryScreenMESA(EGLDisplay dpy
, EGLScreenMESA screen
,
781 EGLint attribute
, EGLint
*value
)
783 _EGL_DECLARE_DD_AND_SCREEN(dpy
, screen
);
784 return drv
->API
.QueryScreenMESA(drv
, disp
, scrn
, attribute
, value
);
789 eglQueryScreenSurfaceMESA(EGLDisplay dpy
, EGLScreenMESA screen
,
792 _EGLDisplay
*disp
= _eglLookupDisplay(dpy
);
793 _EGLScreen
*scrn
= _eglLookupScreen((EGLScreenMESA
) screen
, disp
);
797 drv
= _eglCheckScreen(disp
, scrn
, __FUNCTION__
);
801 if (drv
->API
.QueryScreenSurfaceMESA(drv
, disp
, scrn
, &surf
) != EGL_TRUE
)
804 *surface
= _eglGetSurfaceHandle(surf
);
805 return (surf
!= NULL
);
810 eglQueryScreenModeMESA(EGLDisplay dpy
, EGLScreenMESA screen
, EGLModeMESA
*mode
)
812 _EGLDisplay
*disp
= _eglLookupDisplay(dpy
);
813 _EGLScreen
*scrn
= _eglLookupScreen((EGLScreenMESA
) screen
, disp
);
817 drv
= _eglCheckScreen(disp
, scrn
, __FUNCTION__
);
821 if (drv
->API
.QueryScreenModeMESA(drv
, disp
, scrn
, &m
) != EGL_TRUE
)
831 eglQueryModeStringMESA(EGLDisplay dpy
, EGLModeMESA mode
)
833 _EGL_DECLARE_DD_AND_MODE(dpy
, mode
);
834 return drv
->API
.QueryModeStringMESA(drv
, disp
, m
);
842 #ifdef EGL_VERSION_1_2
846 * Specify the client API to use for subsequent calls including:
848 * eglGetCurrentContext()
849 * eglGetCurrentDisplay()
850 * eglGetCurrentSurface()
851 * eglMakeCurrent(when the ctx parameter is EGL NO CONTEXT)
854 * See section 3.7 "Rendering Context" in the EGL specification for details.
857 eglBindAPI(EGLenum api
)
859 _EGLThreadInfo
*t
= _eglGetCurrentThread();
861 if (_eglIsCurrentThreadDummy())
862 return _eglError(EGL_BAD_ALLOC
, "eglBindAPI");
864 if (!_eglIsApiValid(api
))
865 return _eglError(EGL_BAD_PARAMETER
, "eglBindAPI");
868 #ifdef EGL_VERSION_1_4
870 if (_eglGlobal
.ClientAPIsMask
& EGL_OPENGL_BIT
) {
871 t
->CurrentAPIIndex
= _eglConvertApiToIndex(api
);
874 _eglError(EGL_BAD_PARAMETER
, "eglBindAPI");
877 case EGL_OPENGL_ES_API
:
878 if (_eglGlobal
.ClientAPIsMask
& (EGL_OPENGL_ES_BIT
| EGL_OPENGL_ES2_BIT
)) {
879 t
->CurrentAPIIndex
= _eglConvertApiToIndex(api
);
882 _eglError(EGL_BAD_PARAMETER
, "eglBindAPI");
885 if (_eglGlobal
.ClientAPIsMask
& EGL_OPENVG_BIT
) {
886 t
->CurrentAPIIndex
= _eglConvertApiToIndex(api
);
889 _eglError(EGL_BAD_PARAMETER
, "eglBindAPI");
899 * Return the last value set with eglBindAPI().
904 /* returns one of EGL_OPENGL_API, EGL_OPENGL_ES_API or EGL_OPENVG_API */
905 _EGLThreadInfo
*t
= _eglGetCurrentThread();
906 return _eglConvertApiFromIndex(t
->CurrentAPIIndex
);
911 eglCreatePbufferFromClientBuffer(EGLDisplay dpy
, EGLenum buftype
,
912 EGLClientBuffer buffer
, EGLConfig config
,
913 const EGLint
*attrib_list
)
915 _EGLDisplay
*disp
= _eglLookupDisplay(dpy
);
916 _EGLConfig
*conf
= _eglLookupConfig(config
, disp
);
920 drv
= _eglCheckConfig(disp
, conf
, __FUNCTION__
);
922 return EGL_NO_SURFACE
;
924 surf
= drv
->API
.CreatePbufferFromClientBuffer(drv
, disp
, buftype
, buffer
,
927 return _eglLinkSurface(surf
, disp
);
929 return EGL_NO_SURFACE
;
934 eglReleaseThread(void)
936 /* unbind current context */
937 if (!_eglIsCurrentThreadDummy()) {
938 _EGLDisplay
*disp
= _eglGetCurrentDisplay();
942 (void) drv
->API
.MakeCurrent(drv
, disp
, NULL
, NULL
, NULL
);
946 _eglDestroyCurrentThread();
954 _EGLDisplay
*disp
= _eglGetCurrentDisplay();
960 /* a current display is always initialized */
963 return drv
->API
.WaitClient(drv
, disp
);
967 #endif /* EGL_VERSION_1_2 */