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. Internal objects are linked to a display to
15 * For each public API entry point, the opaque handles are looked up
16 * before being dispatched to the drivers. When it fails to look up
26 * is generated and the driver function is not called. An
27 * uninitialized EGLDisplay has no driver associated with it. When
28 * such display is detected,
34 * Some of the entry points use current display, context, or surface
35 * implicitly. For such entry points, the implicit objects are also
36 * checked before calling the driver function. Other than the
37 * errors listed above,
39 * EGL_BAD_CURRENT_SURFACE
41 * may also be generated.
43 * Notes on naming conventions:
45 * eglFooBar - public EGL function
46 * EGL_FOO_BAR - public EGL token
47 * EGLDatatype - public EGL datatype
49 * _eglFooBar - private EGL function
50 * _EGLDatatype - private EGL datatype, typedef'd struct
51 * _egl_struct - private EGL struct, non-typedef'd
59 #include "eglcontext.h"
60 #include "egldisplay.h"
61 #include "egltypedefs.h"
62 #include "eglglobals.h"
63 #include "eglcurrent.h"
64 #include "egldriver.h"
65 #include "eglsurface.h"
66 #include "eglconfig.h"
67 #include "eglscreen.h"
73 * This is typically the first EGL function that an application calls.
74 * We initialize our global vars and create a private _EGLDisplay object.
76 EGLDisplay EGLAPIENTRY
77 eglGetDisplay(EGLNativeDisplayType nativeDisplay
)
80 dpy
= _eglFindDisplay(nativeDisplay
);
82 dpy
= _eglNewDisplay(nativeDisplay
);
86 return _eglGetDisplayHandle(dpy
);
91 * This is typically the second EGL function that an application calls.
92 * Here we load/initialize the actual hardware driver.
94 EGLBoolean EGLAPIENTRY
95 eglInitialize(EGLDisplay dpy
, EGLint
*major
, EGLint
*minor
)
97 _EGLDisplay
*disp
= _eglLookupDisplay(dpy
);
98 EGLint major_int
, minor_int
;
101 return _eglError(EGL_BAD_DISPLAY
, __FUNCTION__
);
103 if (!disp
->Initialized
) {
104 _EGLDriver
*drv
= disp
->Driver
;
107 _eglPreloadDrivers();
108 drv
= _eglMatchDriver(disp
);
110 return _eglError(EGL_NOT_INITIALIZED
, __FUNCTION__
);
113 /* Initialize the particular display now */
114 if (!drv
->API
.Initialize(drv
, disp
, &major_int
, &minor_int
))
115 return _eglError(EGL_NOT_INITIALIZED
, __FUNCTION__
);
117 disp
->APImajor
= major_int
;
118 disp
->APIminor
= minor_int
;
119 snprintf(disp
->Version
, sizeof(disp
->Version
),
120 "%d.%d (%s)", major_int
, minor_int
, drv
->Name
);
122 /* limit to APIs supported by core */
123 disp
->ClientAPIsMask
&= _EGL_API_ALL_BITS
;
126 disp
->Initialized
= EGL_TRUE
;
128 major_int
= disp
->APImajor
;
129 minor_int
= disp
->APIminor
;
132 /* Update applications version of major and minor if not NULL */
133 if ((major
!= NULL
) && (minor
!= NULL
)) {
142 EGLBoolean EGLAPIENTRY
143 eglTerminate(EGLDisplay dpy
)
145 _EGLDisplay
*disp
= _eglLookupDisplay(dpy
);
148 return _eglError(EGL_BAD_DISPLAY
, __FUNCTION__
);
150 if (disp
->Initialized
) {
151 _EGLDriver
*drv
= disp
->Driver
;
153 drv
->API
.Terminate(drv
, disp
);
154 /* do not reset disp->Driver */
155 disp
->Initialized
= EGL_FALSE
;
163 * A bunch of check functions and declare macros to simply error checking.
165 static INLINE _EGLDriver
*
166 _eglCheckDisplay(_EGLDisplay
*disp
, const char *msg
)
169 _eglError(EGL_BAD_DISPLAY
, msg
);
172 if (!disp
->Initialized
) {
173 _eglError(EGL_NOT_INITIALIZED
, msg
);
180 static INLINE _EGLDriver
*
181 _eglCheckSurface(_EGLDisplay
*disp
, _EGLSurface
*surf
, const char *msg
)
183 _EGLDriver
*drv
= _eglCheckDisplay(disp
, msg
);
187 _eglError(EGL_BAD_SURFACE
, msg
);
194 static INLINE _EGLDriver
*
195 _eglCheckContext(_EGLDisplay
*disp
, _EGLContext
*context
, const char *msg
)
197 _EGLDriver
*drv
= _eglCheckDisplay(disp
, msg
);
201 _eglError(EGL_BAD_CONTEXT
, msg
);
208 static INLINE _EGLDriver
*
209 _eglCheckConfig(_EGLDisplay
*disp
, _EGLConfig
*conf
, const char *msg
)
211 _EGLDriver
*drv
= _eglCheckDisplay(disp
, msg
);
215 _eglError(EGL_BAD_CONFIG
, msg
);
222 #define _EGL_DECLARE_DD(dpy) \
223 _EGLDisplay *disp = _eglLookupDisplay(dpy); \
226 drv = _eglCheckDisplay(disp, __FUNCTION__); \
232 #define _EGL_DECLARE_DD_AND_SURFACE(dpy, surface) \
233 _EGLDisplay *disp = _eglLookupDisplay(dpy); \
234 _EGLSurface *surf = _eglLookupSurface((surface), disp); \
237 drv = _eglCheckSurface(disp, surf, __FUNCTION__); \
243 #define _EGL_DECLARE_DD_AND_CONTEXT(dpy, ctx) \
244 _EGLDisplay *disp = _eglLookupDisplay(dpy); \
245 _EGLContext *context = _eglLookupContext((ctx), disp); \
248 drv = _eglCheckContext(disp, context, __FUNCTION__); \
254 #ifdef EGL_MESA_screen_surface
257 static INLINE _EGLDriver
*
258 _eglCheckScreen(_EGLDisplay
*disp
, _EGLScreen
*scrn
, const char *msg
)
260 _EGLDriver
*drv
= _eglCheckDisplay(disp
, msg
);
264 _eglError(EGL_BAD_SCREEN_MESA
, msg
);
271 static INLINE _EGLDriver
*
272 _eglCheckMode(_EGLDisplay
*disp
, _EGLMode
*m
, const char *msg
)
274 _EGLDriver
*drv
= _eglCheckDisplay(disp
, msg
);
278 _eglError(EGL_BAD_MODE_MESA
, msg
);
285 #define _EGL_DECLARE_DD_AND_SCREEN(dpy, screen) \
286 _EGLDisplay *disp = _eglLookupDisplay(dpy); \
287 _EGLScreen *scrn = _eglLookupScreen((screen), disp); \
290 drv = _eglCheckScreen(disp, scrn, __FUNCTION__); \
296 #define _EGL_DECLARE_DD_AND_MODE(dpy, mode) \
297 _EGLDisplay *disp = _eglLookupDisplay(dpy); \
298 _EGLMode *m = _eglLookupMode((mode), disp); \
301 drv = _eglCheckMode(disp, m, __FUNCTION__); \
307 #endif /* EGL_MESA_screen_surface */
310 const char * EGLAPIENTRY
311 eglQueryString(EGLDisplay dpy
, EGLint name
)
313 _EGL_DECLARE_DD(dpy
);
314 return drv
->API
.QueryString(drv
, disp
, name
);
318 EGLBoolean EGLAPIENTRY
319 eglGetConfigs(EGLDisplay dpy
, EGLConfig
*configs
,
320 EGLint config_size
, EGLint
*num_config
)
322 _EGL_DECLARE_DD(dpy
);
323 return drv
->API
.GetConfigs(drv
, disp
, configs
, config_size
, num_config
);
327 EGLBoolean EGLAPIENTRY
328 eglChooseConfig(EGLDisplay dpy
, const EGLint
*attrib_list
, EGLConfig
*configs
,
329 EGLint config_size
, EGLint
*num_config
)
331 _EGL_DECLARE_DD(dpy
);
332 return drv
->API
.ChooseConfig(drv
, disp
, attrib_list
, configs
,
333 config_size
, num_config
);
337 EGLBoolean EGLAPIENTRY
338 eglGetConfigAttrib(EGLDisplay dpy
, EGLConfig config
,
339 EGLint attribute
, EGLint
*value
)
341 _EGLDisplay
*disp
= _eglLookupDisplay(dpy
);
342 _EGLConfig
*conf
= _eglLookupConfig(config
, disp
);
345 drv
= _eglCheckConfig(disp
, conf
, __FUNCTION__
);
349 return drv
->API
.GetConfigAttrib(drv
, disp
, conf
, attribute
, value
);
353 EGLContext EGLAPIENTRY
354 eglCreateContext(EGLDisplay dpy
, EGLConfig config
, EGLContext share_list
,
355 const EGLint
*attrib_list
)
357 _EGLDisplay
*disp
= _eglLookupDisplay(dpy
);
358 _EGLConfig
*conf
= _eglLookupConfig(config
, disp
);
359 _EGLContext
*share
= _eglLookupContext(share_list
, disp
);
361 _EGLContext
*context
;
363 drv
= _eglCheckConfig(disp
, conf
, __FUNCTION__
);
365 return EGL_NO_CONTEXT
;
366 if (!share
&& share_list
!= EGL_NO_CONTEXT
) {
367 _eglError(EGL_BAD_CONTEXT
, __FUNCTION__
);
368 return EGL_NO_CONTEXT
;
371 context
= drv
->API
.CreateContext(drv
, disp
, conf
, share
, attrib_list
);
373 return _eglLinkContext(context
, disp
);
375 return EGL_NO_CONTEXT
;
379 EGLBoolean EGLAPIENTRY
380 eglDestroyContext(EGLDisplay dpy
, EGLContext ctx
)
382 _EGL_DECLARE_DD_AND_CONTEXT(dpy
, ctx
);
383 _eglUnlinkContext(context
);
384 return drv
->API
.DestroyContext(drv
, disp
, context
);
388 EGLBoolean EGLAPIENTRY
389 eglMakeCurrent(EGLDisplay dpy
, EGLSurface draw
, EGLSurface read
,
392 _EGLDisplay
*disp
= _eglLookupDisplay(dpy
);
393 _EGLContext
*context
= _eglLookupContext(ctx
, disp
);
394 _EGLSurface
*draw_surf
= _eglLookupSurface(draw
, disp
);
395 _EGLSurface
*read_surf
= _eglLookupSurface(read
, disp
);
399 return _eglError(EGL_BAD_DISPLAY
, __FUNCTION__
);
402 /* display is allowed to be uninitialized under certain condition */
403 if (!disp
->Initialized
) {
404 if (draw
!= EGL_NO_SURFACE
|| read
!= EGL_NO_SURFACE
||
405 ctx
!= EGL_NO_CONTEXT
)
406 return _eglError(EGL_BAD_DISPLAY
, __FUNCTION__
);
411 if (!context
&& ctx
!= EGL_NO_CONTEXT
)
412 return _eglError(EGL_BAD_CONTEXT
, __FUNCTION__
);
413 if ((!draw_surf
&& draw
!= EGL_NO_SURFACE
) ||
414 (!read_surf
&& read
!= EGL_NO_SURFACE
))
415 return _eglError(EGL_BAD_SURFACE
, __FUNCTION__
);
417 return drv
->API
.MakeCurrent(drv
, disp
, draw_surf
, read_surf
, context
);
421 EGLBoolean EGLAPIENTRY
422 eglQueryContext(EGLDisplay dpy
, EGLContext ctx
,
423 EGLint attribute
, EGLint
*value
)
425 _EGL_DECLARE_DD_AND_CONTEXT(dpy
, ctx
);
426 return drv
->API
.QueryContext(drv
, disp
, context
, attribute
, value
);
430 EGLSurface EGLAPIENTRY
431 eglCreateWindowSurface(EGLDisplay dpy
, EGLConfig config
,
432 EGLNativeWindowType window
, const EGLint
*attrib_list
)
434 _EGLDisplay
*disp
= _eglLookupDisplay(dpy
);
435 _EGLConfig
*conf
= _eglLookupConfig(config
, disp
);
439 drv
= _eglCheckConfig(disp
, conf
, __FUNCTION__
);
441 return EGL_NO_SURFACE
;
443 surf
= drv
->API
.CreateWindowSurface(drv
, disp
, conf
, window
, attrib_list
);
445 return _eglLinkSurface(surf
, disp
);
447 return EGL_NO_SURFACE
;
451 EGLSurface EGLAPIENTRY
452 eglCreatePixmapSurface(EGLDisplay dpy
, EGLConfig config
,
453 EGLNativePixmapType pixmap
, const EGLint
*attrib_list
)
455 _EGLDisplay
*disp
= _eglLookupDisplay(dpy
);
456 _EGLConfig
*conf
= _eglLookupConfig(config
, disp
);
460 drv
= _eglCheckConfig(disp
, conf
, __FUNCTION__
);
462 return EGL_NO_SURFACE
;
464 surf
= drv
->API
.CreatePixmapSurface(drv
, disp
, conf
, pixmap
, attrib_list
);
466 return _eglLinkSurface(surf
, disp
);
468 return EGL_NO_SURFACE
;
472 EGLSurface EGLAPIENTRY
473 eglCreatePbufferSurface(EGLDisplay dpy
, EGLConfig config
,
474 const EGLint
*attrib_list
)
476 _EGLDisplay
*disp
= _eglLookupDisplay(dpy
);
477 _EGLConfig
*conf
= _eglLookupConfig(config
, disp
);
481 drv
= _eglCheckConfig(disp
, conf
, __FUNCTION__
);
483 return EGL_NO_SURFACE
;
485 surf
= drv
->API
.CreatePbufferSurface(drv
, disp
, conf
, attrib_list
);
487 return _eglLinkSurface(surf
, disp
);
489 return EGL_NO_SURFACE
;
493 EGLBoolean EGLAPIENTRY
494 eglDestroySurface(EGLDisplay dpy
, EGLSurface surface
)
496 _EGL_DECLARE_DD_AND_SURFACE(dpy
, surface
);
497 _eglUnlinkSurface(surf
);
498 return drv
->API
.DestroySurface(drv
, disp
, surf
);
501 EGLBoolean EGLAPIENTRY
502 eglQuerySurface(EGLDisplay dpy
, EGLSurface surface
,
503 EGLint attribute
, EGLint
*value
)
505 _EGL_DECLARE_DD_AND_SURFACE(dpy
, surface
);
506 return drv
->API
.QuerySurface(drv
, disp
, surf
, attribute
, value
);
509 EGLBoolean EGLAPIENTRY
510 eglSurfaceAttrib(EGLDisplay dpy
, EGLSurface surface
,
511 EGLint attribute
, EGLint value
)
513 _EGL_DECLARE_DD_AND_SURFACE(dpy
, surface
);
514 return drv
->API
.SurfaceAttrib(drv
, disp
, surf
, attribute
, value
);
518 EGLBoolean EGLAPIENTRY
519 eglBindTexImage(EGLDisplay dpy
, EGLSurface surface
, EGLint buffer
)
521 _EGL_DECLARE_DD_AND_SURFACE(dpy
, surface
);
522 return drv
->API
.BindTexImage(drv
, disp
, surf
, buffer
);
526 EGLBoolean EGLAPIENTRY
527 eglReleaseTexImage(EGLDisplay dpy
, EGLSurface surface
, EGLint buffer
)
529 _EGL_DECLARE_DD_AND_SURFACE(dpy
, surface
);
530 return drv
->API
.ReleaseTexImage(drv
, disp
, surf
, buffer
);
534 EGLBoolean EGLAPIENTRY
535 eglSwapInterval(EGLDisplay dpy
, EGLint interval
)
537 _EGLContext
*ctx
= _eglGetCurrentContext();
539 _EGL_DECLARE_DD(dpy
);
541 if (!ctx
|| !_eglIsContextLinked(ctx
) || ctx
->Resource
.Display
!= disp
)
542 return _eglError(EGL_BAD_CONTEXT
, __FUNCTION__
);
544 surf
= ctx
->DrawSurface
;
545 if (!_eglIsSurfaceLinked(surf
))
546 return _eglError(EGL_BAD_SURFACE
, __FUNCTION__
);
548 return drv
->API
.SwapInterval(drv
, disp
, surf
, interval
);
552 EGLBoolean EGLAPIENTRY
553 eglSwapBuffers(EGLDisplay dpy
, EGLSurface surface
)
555 _EGLContext
*ctx
= _eglGetCurrentContext();
556 _EGL_DECLARE_DD_AND_SURFACE(dpy
, surface
);
558 /* surface must be bound to current context in EGL 1.4 */
559 if (!ctx
|| !_eglIsContextLinked(ctx
) || surf
!= ctx
->DrawSurface
)
560 return _eglError(EGL_BAD_SURFACE
, __FUNCTION__
);
562 return drv
->API
.SwapBuffers(drv
, disp
, surf
);
566 EGLBoolean EGLAPIENTRY
567 eglCopyBuffers(EGLDisplay dpy
, EGLSurface surface
, EGLNativePixmapType target
)
569 _EGL_DECLARE_DD_AND_SURFACE(dpy
, surface
);
570 return drv
->API
.CopyBuffers(drv
, disp
, surf
, target
);
574 EGLBoolean EGLAPIENTRY
577 _EGLContext
*ctx
= _eglGetCurrentContext();
583 /* let bad current context imply bad current surface */
584 if (!_eglIsContextLinked(ctx
) || !_eglIsSurfaceLinked(ctx
->DrawSurface
))
585 return _eglError(EGL_BAD_CURRENT_SURFACE
, __FUNCTION__
);
587 /* a valid current context implies an initialized current display */
588 disp
= ctx
->Resource
.Display
;
589 assert(disp
->Initialized
);
592 return drv
->API
.WaitClient(drv
, disp
, ctx
);
596 EGLBoolean EGLAPIENTRY
599 #ifdef EGL_VERSION_1_2
600 _EGLThreadInfo
*t
= _eglGetCurrentThread();
601 EGLint api_index
= t
->CurrentAPIIndex
;
602 EGLint es_index
= _eglConvertApiToIndex(EGL_OPENGL_ES_API
);
605 if (api_index
!= es_index
&& _eglIsCurrentThreadDummy())
606 return _eglError(EGL_BAD_ALLOC
, "eglWaitGL");
608 t
->CurrentAPIIndex
= es_index
;
609 ret
= eglWaitClient();
610 t
->CurrentAPIIndex
= api_index
;
613 return eglWaitClient();
618 EGLBoolean EGLAPIENTRY
619 eglWaitNative(EGLint engine
)
621 _EGLContext
*ctx
= _eglGetCurrentContext();
627 /* let bad current context imply bad current surface */
628 if (!_eglIsContextLinked(ctx
) || !_eglIsSurfaceLinked(ctx
->DrawSurface
))
629 return _eglError(EGL_BAD_CURRENT_SURFACE
, __FUNCTION__
);
631 /* a valid current context implies an initialized current display */
632 disp
= ctx
->Resource
.Display
;
633 assert(disp
->Initialized
);
636 return drv
->API
.WaitNative(drv
, disp
, engine
);
640 EGLDisplay EGLAPIENTRY
641 eglGetCurrentDisplay(void)
643 _EGLContext
*ctx
= _eglGetCurrentContext();
644 return (ctx
) ? _eglGetDisplayHandle(ctx
->Resource
.Display
) : EGL_NO_DISPLAY
;
648 EGLContext EGLAPIENTRY
649 eglGetCurrentContext(void)
651 _EGLContext
*ctx
= _eglGetCurrentContext();
652 return _eglGetContextHandle(ctx
);
656 EGLSurface EGLAPIENTRY
657 eglGetCurrentSurface(EGLint readdraw
)
659 _EGLContext
*ctx
= _eglGetCurrentContext();
663 return EGL_NO_SURFACE
;
667 surf
= ctx
->DrawSurface
;
670 surf
= ctx
->ReadSurface
;
673 _eglError(EGL_BAD_PARAMETER
, __FUNCTION__
);
678 return _eglGetSurfaceHandle(surf
);
685 _EGLThreadInfo
*t
= _eglGetCurrentThread();
686 EGLint e
= t
->LastError
;
687 if (!_eglIsCurrentThreadDummy())
688 t
->LastError
= EGL_SUCCESS
;
693 __eglMustCastToProperFunctionPointerType EGLAPIENTRY
694 eglGetProcAddress(const char *procname
)
696 static const struct {
699 } egl_functions
[] = {
700 /* extensions only */
701 #ifdef EGL_MESA_screen_surface
702 { "eglChooseModeMESA", (_EGLProc
) eglChooseModeMESA
},
703 { "eglGetModesMESA", (_EGLProc
) eglGetModesMESA
},
704 { "eglGetModeAttribMESA", (_EGLProc
) eglGetModeAttribMESA
},
705 { "eglCopyContextMESA", (_EGLProc
) eglCopyContextMESA
},
706 { "eglGetScreensMESA", (_EGLProc
) eglGetScreensMESA
},
707 { "eglCreateScreenSurfaceMESA", (_EGLProc
) eglCreateScreenSurfaceMESA
},
708 { "eglShowScreenSurfaceMESA", (_EGLProc
) eglShowScreenSurfaceMESA
},
709 { "eglScreenPositionMESA", (_EGLProc
) eglScreenPositionMESA
},
710 { "eglQueryScreenMESA", (_EGLProc
) eglQueryScreenMESA
},
711 { "eglQueryScreenSurfaceMESA", (_EGLProc
) eglQueryScreenSurfaceMESA
},
712 { "eglQueryScreenModeMESA", (_EGLProc
) eglQueryScreenModeMESA
},
713 { "eglQueryModeStringMESA", (_EGLProc
) eglQueryModeStringMESA
},
714 #endif /* EGL_MESA_screen_surface */
715 #ifdef EGL_KHR_image_base
716 { "eglCreateImageKHR", (_EGLProc
) eglCreateImageKHR
},
717 { "eglDestroyImageKHR", (_EGLProc
) eglDestroyImageKHR
},
718 #endif /* EGL_KHR_image_base */
725 if (strncmp(procname
, "egl", 3) == 0) {
726 for (i
= 0; egl_functions
[i
].name
; i
++) {
727 if (strcmp(egl_functions
[i
].name
, procname
) == 0)
728 return egl_functions
[i
].function
;
732 _eglPreloadDrivers();
734 /* now loop over drivers to query their procs */
735 for (i
= 0; i
< _eglGlobal
.NumDrivers
; i
++) {
736 _EGLDriver
*drv
= _eglGlobal
.Drivers
[i
];
737 _EGLProc p
= drv
->API
.GetProcAddress(drv
, procname
);
746 #ifdef EGL_MESA_screen_surface
750 * EGL_MESA_screen extension
753 EGLBoolean EGLAPIENTRY
754 eglChooseModeMESA(EGLDisplay dpy
, EGLScreenMESA screen
,
755 const EGLint
*attrib_list
, EGLModeMESA
*modes
,
756 EGLint modes_size
, EGLint
*num_modes
)
758 _EGL_DECLARE_DD_AND_SCREEN(dpy
, screen
);
759 return drv
->API
.ChooseModeMESA(drv
, disp
, scrn
, attrib_list
,
760 modes
, modes_size
, num_modes
);
764 EGLBoolean EGLAPIENTRY
765 eglGetModesMESA(EGLDisplay dpy
, EGLScreenMESA screen
, EGLModeMESA
*modes
,
766 EGLint mode_size
, EGLint
*num_mode
)
768 _EGL_DECLARE_DD_AND_SCREEN(dpy
, screen
);
769 return drv
->API
.GetModesMESA(drv
, disp
, scrn
, modes
, mode_size
, num_mode
);
773 EGLBoolean EGLAPIENTRY
774 eglGetModeAttribMESA(EGLDisplay dpy
, EGLModeMESA mode
,
775 EGLint attribute
, EGLint
*value
)
777 _EGL_DECLARE_DD_AND_MODE(dpy
, mode
);
778 return drv
->API
.GetModeAttribMESA(drv
, disp
, m
, attribute
, value
);
782 EGLBoolean EGLAPIENTRY
783 eglCopyContextMESA(EGLDisplay dpy
, EGLContext source
, EGLContext dest
,
786 _EGLDisplay
*disp
= _eglLookupDisplay(dpy
);
787 _EGLContext
*source_context
= _eglLookupContext(source
, disp
);
788 _EGLContext
*dest_context
= _eglLookupContext(dest
, disp
);
791 drv
= _eglCheckContext(disp
, source_context
, __FUNCTION__
);
792 if (!drv
|| !dest_context
) {
794 _eglError(EGL_BAD_CONTEXT
, __FUNCTION__
);
798 return drv
->API
.CopyContextMESA(drv
, disp
, source_context
, dest_context
,
804 eglGetScreensMESA(EGLDisplay dpy
, EGLScreenMESA
*screens
,
805 EGLint max_screens
, EGLint
*num_screens
)
807 _EGL_DECLARE_DD(dpy
);
808 return drv
->API
.GetScreensMESA(drv
, disp
, screens
,
809 max_screens
, num_screens
);
814 eglCreateScreenSurfaceMESA(EGLDisplay dpy
, EGLConfig config
,
815 const EGLint
*attrib_list
)
817 _EGLDisplay
*disp
= _eglLookupDisplay(dpy
);
818 _EGLConfig
*conf
= _eglLookupConfig(config
, disp
);
822 drv
= _eglCheckConfig(disp
, conf
, __FUNCTION__
);
824 return EGL_NO_SURFACE
;
826 surf
= drv
->API
.CreateScreenSurfaceMESA(drv
, disp
, conf
, attrib_list
);
828 return _eglLinkSurface(surf
, disp
);
830 return EGL_NO_SURFACE
;
835 eglShowScreenSurfaceMESA(EGLDisplay dpy
, EGLint screen
,
836 EGLSurface surface
, EGLModeMESA mode
)
838 _EGLDisplay
*disp
= _eglLookupDisplay(dpy
);
839 _EGLScreen
*scrn
= _eglLookupScreen((EGLScreenMESA
) screen
, disp
);
840 _EGLSurface
*surf
= _eglLookupSurface(surface
, disp
);
841 _EGLMode
*m
= _eglLookupMode(mode
, disp
);
844 drv
= _eglCheckScreen(disp
, scrn
, __FUNCTION__
);
847 if (!surf
&& surface
!= EGL_NO_SURFACE
)
848 return _eglError(EGL_BAD_SURFACE
, __FUNCTION__
);
849 if (!m
&& mode
!= EGL_NO_MODE_MESA
)
850 return _eglError(EGL_BAD_MODE_MESA
, __FUNCTION__
);
852 return drv
->API
.ShowScreenSurfaceMESA(drv
, disp
, scrn
, surf
, m
);
857 eglScreenPositionMESA(EGLDisplay dpy
, EGLScreenMESA screen
, EGLint x
, EGLint y
)
859 _EGL_DECLARE_DD_AND_SCREEN(dpy
, screen
);
860 return drv
->API
.ScreenPositionMESA(drv
, disp
, scrn
, x
, y
);
865 eglQueryScreenMESA(EGLDisplay dpy
, EGLScreenMESA screen
,
866 EGLint attribute
, EGLint
*value
)
868 _EGL_DECLARE_DD_AND_SCREEN(dpy
, screen
);
869 return drv
->API
.QueryScreenMESA(drv
, disp
, scrn
, attribute
, value
);
874 eglQueryScreenSurfaceMESA(EGLDisplay dpy
, EGLScreenMESA screen
,
877 _EGLDisplay
*disp
= _eglLookupDisplay(dpy
);
878 _EGLScreen
*scrn
= _eglLookupScreen((EGLScreenMESA
) screen
, disp
);
882 drv
= _eglCheckScreen(disp
, scrn
, __FUNCTION__
);
886 if (drv
->API
.QueryScreenSurfaceMESA(drv
, disp
, scrn
, &surf
) != EGL_TRUE
)
889 *surface
= _eglGetSurfaceHandle(surf
);
890 return (surf
!= NULL
);
895 eglQueryScreenModeMESA(EGLDisplay dpy
, EGLScreenMESA screen
, EGLModeMESA
*mode
)
897 _EGLDisplay
*disp
= _eglLookupDisplay(dpy
);
898 _EGLScreen
*scrn
= _eglLookupScreen((EGLScreenMESA
) screen
, disp
);
902 drv
= _eglCheckScreen(disp
, scrn
, __FUNCTION__
);
906 if (drv
->API
.QueryScreenModeMESA(drv
, disp
, scrn
, &m
) != EGL_TRUE
)
916 eglQueryModeStringMESA(EGLDisplay dpy
, EGLModeMESA mode
)
918 _EGL_DECLARE_DD_AND_MODE(dpy
, mode
);
919 return drv
->API
.QueryModeStringMESA(drv
, disp
, m
);
923 #endif /* EGL_MESA_screen_surface */
930 #ifdef EGL_VERSION_1_2
934 * Specify the client API to use for subsequent calls including:
936 * eglGetCurrentContext()
937 * eglGetCurrentDisplay()
938 * eglGetCurrentSurface()
939 * eglMakeCurrent(when the ctx parameter is EGL NO CONTEXT)
942 * See section 3.7 "Rendering Context" in the EGL specification for details.
945 eglBindAPI(EGLenum api
)
947 _EGLThreadInfo
*t
= _eglGetCurrentThread();
949 if (_eglIsCurrentThreadDummy())
950 return _eglError(EGL_BAD_ALLOC
, "eglBindAPI");
952 if (!_eglIsApiValid(api
))
953 return _eglError(EGL_BAD_PARAMETER
, "eglBindAPI");
955 t
->CurrentAPIIndex
= _eglConvertApiToIndex(api
);
961 * Return the last value set with eglBindAPI().
966 /* returns one of EGL_OPENGL_API, EGL_OPENGL_ES_API or EGL_OPENVG_API */
967 _EGLThreadInfo
*t
= _eglGetCurrentThread();
968 return _eglConvertApiFromIndex(t
->CurrentAPIIndex
);
973 eglCreatePbufferFromClientBuffer(EGLDisplay dpy
, EGLenum buftype
,
974 EGLClientBuffer buffer
, EGLConfig config
,
975 const EGLint
*attrib_list
)
977 _EGLDisplay
*disp
= _eglLookupDisplay(dpy
);
978 _EGLConfig
*conf
= _eglLookupConfig(config
, disp
);
982 drv
= _eglCheckConfig(disp
, conf
, __FUNCTION__
);
984 return EGL_NO_SURFACE
;
986 surf
= drv
->API
.CreatePbufferFromClientBuffer(drv
, disp
, buftype
, buffer
,
989 return _eglLinkSurface(surf
, disp
);
991 return EGL_NO_SURFACE
;
996 eglReleaseThread(void)
998 /* unbind current contexts */
999 if (!_eglIsCurrentThreadDummy()) {
1000 _EGLThreadInfo
*t
= _eglGetCurrentThread();
1001 EGLint api_index
= t
->CurrentAPIIndex
;
1004 for (i
= 0; i
< _EGL_API_NUM_APIS
; i
++) {
1005 _EGLContext
*ctx
= t
->CurrentContexts
[i
];
1007 _EGLDisplay
*disp
= ctx
->Resource
.Display
;
1008 _EGLDriver
*drv
= disp
->Driver
;
1009 t
->CurrentAPIIndex
= i
;
1010 (void) drv
->API
.MakeCurrent(drv
, disp
, NULL
, NULL
, NULL
);
1014 t
->CurrentAPIIndex
= api_index
;
1017 _eglDestroyCurrentThread();
1022 #endif /* EGL_VERSION_1_2 */
1025 #ifdef EGL_KHR_image_base
1029 eglCreateImageKHR(EGLDisplay dpy
, EGLContext ctx
, EGLenum target
,
1030 EGLClientBuffer buffer
, const EGLint
*attr_list
)
1032 _EGLDisplay
*disp
= _eglLookupDisplay(dpy
);
1033 _EGLContext
*context
= _eglLookupContext(ctx
, disp
);
1037 drv
= _eglCheckDisplay(disp
, __FUNCTION__
);
1039 return EGL_NO_IMAGE_KHR
;
1040 if (!context
&& ctx
!= EGL_NO_CONTEXT
) {
1041 _eglError(EGL_BAD_CONTEXT
, __FUNCTION__
);
1042 return EGL_NO_IMAGE_KHR
;
1045 img
= drv
->API
.CreateImageKHR(drv
,
1046 disp
, context
, target
, buffer
, attr_list
);
1048 return _eglLinkImage(img
, disp
);
1050 return EGL_NO_IMAGE_KHR
;
1054 EGLBoolean
eglDestroyImageKHR(EGLDisplay dpy
, EGLImageKHR image
)
1056 _EGLDisplay
*disp
= _eglLookupDisplay(dpy
);
1057 _EGLImage
*img
= _eglLookupImage(image
, disp
);
1060 drv
= _eglCheckDisplay(disp
, __FUNCTION__
);
1064 return _eglError(EGL_BAD_PARAMETER
, __FUNCTION__
);
1066 _eglUnlinkImage(img
);
1067 return drv
->API
.DestroyImageKHR(drv
, disp
, img
);
1071 #endif /* EGL_KHR_image_base */