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 "egldriver.h"
64 #include "eglsurface.h"
65 #include "eglconfig.h"
66 #include "eglscreen.h"
72 * This is typically the first EGL function that an application calls.
73 * We initialize our global vars and create a private _EGLDisplay object.
75 EGLDisplay EGLAPIENTRY
76 eglGetDisplay(EGLNativeDisplayType nativeDisplay
)
79 dpy
= _eglFindDisplay(nativeDisplay
);
81 dpy
= _eglNewDisplay(nativeDisplay
);
85 return _eglGetDisplayHandle(dpy
);
90 * This is typically the second EGL function that an application calls.
91 * Here we load/initialize the actual hardware driver.
93 EGLBoolean EGLAPIENTRY
94 eglInitialize(EGLDisplay dpy
, EGLint
*major
, EGLint
*minor
)
96 _EGLDisplay
*disp
= _eglLookupDisplay(dpy
);
98 EGLint major_int
, minor_int
;
101 return _eglError(EGL_BAD_DISPLAY
, __FUNCTION__
);
105 _eglPreloadDrivers();
107 drv
= _eglOpenDriver(disp
);
109 return _eglError(EGL_NOT_INITIALIZED
, __FUNCTION__
);
111 /* Initialize the particular display now */
112 if (!drv
->API
.Initialize(drv
, disp
, &major_int
, &minor_int
)) {
113 _eglCloseDriver(drv
, disp
);
114 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
;
127 major_int
= disp
->APImajor
;
128 minor_int
= disp
->APIminor
;
131 /* Update applications version of major and minor if not NULL */
132 if ((major
!= NULL
) && (minor
!= NULL
)) {
141 EGLBoolean EGLAPIENTRY
142 eglTerminate(EGLDisplay dpy
)
144 _EGLDisplay
*disp
= _eglLookupDisplay(dpy
);
148 return _eglError(EGL_BAD_DISPLAY
, __FUNCTION__
);
152 drv
->API
.Terminate(drv
, disp
);
153 _eglCloseDriver(drv
, disp
);
162 * A bunch of check functions and declare macros to simply error checking.
164 static INLINE _EGLDriver
*
165 _eglCheckDisplay(_EGLDisplay
*disp
, const char *msg
)
168 _eglError(EGL_BAD_DISPLAY
, msg
);
172 _eglError(EGL_NOT_INITIALIZED
, msg
);
179 static INLINE _EGLDriver
*
180 _eglCheckSurface(_EGLDisplay
*disp
, _EGLSurface
*surf
, const char *msg
)
182 _EGLDriver
*drv
= _eglCheckDisplay(disp
, msg
);
186 _eglError(EGL_BAD_SURFACE
, msg
);
193 static INLINE _EGLDriver
*
194 _eglCheckContext(_EGLDisplay
*disp
, _EGLContext
*context
, const char *msg
)
196 _EGLDriver
*drv
= _eglCheckDisplay(disp
, msg
);
200 _eglError(EGL_BAD_CONTEXT
, msg
);
207 static INLINE _EGLDriver
*
208 _eglCheckConfig(_EGLDisplay
*disp
, _EGLConfig
*conf
, const char *msg
)
210 _EGLDriver
*drv
= _eglCheckDisplay(disp
, msg
);
214 _eglError(EGL_BAD_CONFIG
, msg
);
221 #define _EGL_DECLARE_DD(dpy) \
222 _EGLDisplay *disp = _eglLookupDisplay(dpy); \
225 drv = _eglCheckDisplay(disp, __FUNCTION__); \
231 #define _EGL_DECLARE_DD_AND_SURFACE(dpy, surface) \
232 _EGLDisplay *disp = _eglLookupDisplay(dpy); \
233 _EGLSurface *surf = _eglLookupSurface((surface), disp); \
236 drv = _eglCheckSurface(disp, surf, __FUNCTION__); \
242 #define _EGL_DECLARE_DD_AND_CONTEXT(dpy, ctx) \
243 _EGLDisplay *disp = _eglLookupDisplay(dpy); \
244 _EGLContext *context = _eglLookupContext((ctx), disp); \
247 drv = _eglCheckContext(disp, context, __FUNCTION__); \
253 #ifdef EGL_MESA_screen_surface
256 static INLINE _EGLDriver
*
257 _eglCheckScreen(_EGLDisplay
*disp
, _EGLScreen
*scrn
, const char *msg
)
259 _EGLDriver
*drv
= _eglCheckDisplay(disp
, msg
);
263 _eglError(EGL_BAD_SCREEN_MESA
, msg
);
270 static INLINE _EGLDriver
*
271 _eglCheckMode(_EGLDisplay
*disp
, _EGLMode
*m
, const char *msg
)
273 _EGLDriver
*drv
= _eglCheckDisplay(disp
, msg
);
277 _eglError(EGL_BAD_MODE_MESA
, msg
);
284 #define _EGL_DECLARE_DD_AND_SCREEN(dpy, screen) \
285 _EGLDisplay *disp = _eglLookupDisplay(dpy); \
286 _EGLScreen *scrn = _eglLookupScreen((screen), disp); \
289 drv = _eglCheckScreen(disp, scrn, __FUNCTION__); \
295 #define _EGL_DECLARE_DD_AND_MODE(dpy, mode) \
296 _EGLDisplay *disp = _eglLookupDisplay(dpy); \
297 _EGLMode *m = _eglLookupMode((mode), disp); \
300 drv = _eglCheckMode(disp, m, __FUNCTION__); \
306 #endif /* EGL_MESA_screen_surface */
309 const char * EGLAPIENTRY
310 eglQueryString(EGLDisplay dpy
, EGLint name
)
312 _EGL_DECLARE_DD(dpy
);
313 return drv
->API
.QueryString(drv
, disp
, name
);
317 EGLBoolean EGLAPIENTRY
318 eglGetConfigs(EGLDisplay dpy
, EGLConfig
*configs
,
319 EGLint config_size
, EGLint
*num_config
)
321 _EGL_DECLARE_DD(dpy
);
322 return drv
->API
.GetConfigs(drv
, disp
, configs
, config_size
, num_config
);
326 EGLBoolean EGLAPIENTRY
327 eglChooseConfig(EGLDisplay dpy
, const EGLint
*attrib_list
, EGLConfig
*configs
,
328 EGLint config_size
, EGLint
*num_config
)
330 _EGL_DECLARE_DD(dpy
);
331 return drv
->API
.ChooseConfig(drv
, disp
, attrib_list
, configs
,
332 config_size
, num_config
);
336 EGLBoolean EGLAPIENTRY
337 eglGetConfigAttrib(EGLDisplay dpy
, EGLConfig config
,
338 EGLint attribute
, EGLint
*value
)
340 _EGLDisplay
*disp
= _eglLookupDisplay(dpy
);
341 _EGLConfig
*conf
= _eglLookupConfig(config
, disp
);
344 drv
= _eglCheckConfig(disp
, conf
, __FUNCTION__
);
348 return drv
->API
.GetConfigAttrib(drv
, disp
, conf
, attribute
, value
);
352 EGLContext EGLAPIENTRY
353 eglCreateContext(EGLDisplay dpy
, EGLConfig config
, EGLContext share_list
,
354 const EGLint
*attrib_list
)
356 _EGLDisplay
*disp
= _eglLookupDisplay(dpy
);
357 _EGLConfig
*conf
= _eglLookupConfig(config
, disp
);
358 _EGLContext
*share
= _eglLookupContext(share_list
, disp
);
360 _EGLContext
*context
;
362 drv
= _eglCheckConfig(disp
, conf
, __FUNCTION__
);
364 return EGL_NO_CONTEXT
;
365 if (!share
&& share_list
!= EGL_NO_CONTEXT
) {
366 _eglError(EGL_BAD_CONTEXT
, __FUNCTION__
);
367 return EGL_NO_CONTEXT
;
370 context
= drv
->API
.CreateContext(drv
, disp
, conf
, share
, attrib_list
);
372 return _eglLinkContext(context
, disp
);
374 return EGL_NO_CONTEXT
;
378 EGLBoolean EGLAPIENTRY
379 eglDestroyContext(EGLDisplay dpy
, EGLContext ctx
)
381 _EGL_DECLARE_DD_AND_CONTEXT(dpy
, ctx
);
382 _eglUnlinkContext(context
);
383 return drv
->API
.DestroyContext(drv
, disp
, context
);
387 EGLBoolean EGLAPIENTRY
388 eglMakeCurrent(EGLDisplay dpy
, EGLSurface draw
, EGLSurface read
,
391 _EGLDisplay
*disp
= _eglLookupDisplay(dpy
);
392 _EGLContext
*context
= _eglLookupContext(ctx
, disp
);
393 _EGLSurface
*draw_surf
= _eglLookupSurface(draw
, disp
);
394 _EGLSurface
*read_surf
= _eglLookupSurface(read
, disp
);
397 drv
= _eglCheckDisplay(disp
, __FUNCTION__
);
400 if (!context
&& ctx
!= EGL_NO_CONTEXT
)
401 return _eglError(EGL_BAD_CONTEXT
, __FUNCTION__
);
402 if ((!draw_surf
&& draw
!= EGL_NO_SURFACE
) ||
403 (!read_surf
&& read
!= EGL_NO_SURFACE
))
404 return _eglError(EGL_BAD_SURFACE
, __FUNCTION__
);
406 return drv
->API
.MakeCurrent(drv
, disp
, draw_surf
, read_surf
, context
);
410 EGLBoolean EGLAPIENTRY
411 eglQueryContext(EGLDisplay dpy
, EGLContext ctx
,
412 EGLint attribute
, EGLint
*value
)
414 _EGL_DECLARE_DD_AND_CONTEXT(dpy
, ctx
);
415 return drv
->API
.QueryContext(drv
, disp
, context
, attribute
, value
);
419 EGLSurface EGLAPIENTRY
420 eglCreateWindowSurface(EGLDisplay dpy
, EGLConfig config
,
421 EGLNativeWindowType window
, const EGLint
*attrib_list
)
423 _EGLDisplay
*disp
= _eglLookupDisplay(dpy
);
424 _EGLConfig
*conf
= _eglLookupConfig(config
, disp
);
428 drv
= _eglCheckConfig(disp
, conf
, __FUNCTION__
);
430 return EGL_NO_SURFACE
;
432 surf
= drv
->API
.CreateWindowSurface(drv
, disp
, conf
, window
, attrib_list
);
434 return _eglLinkSurface(surf
, disp
);
436 return EGL_NO_SURFACE
;
440 EGLSurface EGLAPIENTRY
441 eglCreatePixmapSurface(EGLDisplay dpy
, EGLConfig config
,
442 EGLNativePixmapType pixmap
, const EGLint
*attrib_list
)
444 _EGLDisplay
*disp
= _eglLookupDisplay(dpy
);
445 _EGLConfig
*conf
= _eglLookupConfig(config
, disp
);
449 drv
= _eglCheckConfig(disp
, conf
, __FUNCTION__
);
451 return EGL_NO_SURFACE
;
453 surf
= drv
->API
.CreatePixmapSurface(drv
, disp
, conf
, pixmap
, attrib_list
);
455 return _eglLinkSurface(surf
, disp
);
457 return EGL_NO_SURFACE
;
461 EGLSurface EGLAPIENTRY
462 eglCreatePbufferSurface(EGLDisplay dpy
, EGLConfig config
,
463 const EGLint
*attrib_list
)
465 _EGLDisplay
*disp
= _eglLookupDisplay(dpy
);
466 _EGLConfig
*conf
= _eglLookupConfig(config
, disp
);
470 drv
= _eglCheckConfig(disp
, conf
, __FUNCTION__
);
472 return EGL_NO_SURFACE
;
474 surf
= drv
->API
.CreatePbufferSurface(drv
, disp
, conf
, attrib_list
);
476 return _eglLinkSurface(surf
, disp
);
478 return EGL_NO_SURFACE
;
482 EGLBoolean EGLAPIENTRY
483 eglDestroySurface(EGLDisplay dpy
, EGLSurface surface
)
485 _EGL_DECLARE_DD_AND_SURFACE(dpy
, surface
);
486 _eglUnlinkSurface(surf
);
487 return drv
->API
.DestroySurface(drv
, disp
, surf
);
490 EGLBoolean EGLAPIENTRY
491 eglQuerySurface(EGLDisplay dpy
, EGLSurface surface
,
492 EGLint attribute
, EGLint
*value
)
494 _EGL_DECLARE_DD_AND_SURFACE(dpy
, surface
);
495 return drv
->API
.QuerySurface(drv
, disp
, surf
, attribute
, value
);
498 EGLBoolean EGLAPIENTRY
499 eglSurfaceAttrib(EGLDisplay dpy
, EGLSurface surface
,
500 EGLint attribute
, EGLint value
)
502 _EGL_DECLARE_DD_AND_SURFACE(dpy
, surface
);
503 return drv
->API
.SurfaceAttrib(drv
, disp
, surf
, attribute
, value
);
507 EGLBoolean EGLAPIENTRY
508 eglBindTexImage(EGLDisplay dpy
, EGLSurface surface
, EGLint buffer
)
510 _EGL_DECLARE_DD_AND_SURFACE(dpy
, surface
);
511 return drv
->API
.BindTexImage(drv
, disp
, surf
, buffer
);
515 EGLBoolean EGLAPIENTRY
516 eglReleaseTexImage(EGLDisplay dpy
, EGLSurface surface
, EGLint buffer
)
518 _EGL_DECLARE_DD_AND_SURFACE(dpy
, surface
);
519 return drv
->API
.ReleaseTexImage(drv
, disp
, surf
, buffer
);
523 EGLBoolean EGLAPIENTRY
524 eglSwapInterval(EGLDisplay dpy
, EGLint interval
)
526 _EGLContext
*ctx
= _eglGetCurrentContext();
528 _EGL_DECLARE_DD(dpy
);
530 if (!ctx
|| !_eglIsContextLinked(ctx
) || ctx
->Resource
.Display
!= disp
)
531 return _eglError(EGL_BAD_CONTEXT
, __FUNCTION__
);
533 surf
= ctx
->DrawSurface
;
534 if (!_eglIsSurfaceLinked(surf
))
535 return _eglError(EGL_BAD_SURFACE
, __FUNCTION__
);
537 return drv
->API
.SwapInterval(drv
, disp
, surf
, interval
);
541 EGLBoolean EGLAPIENTRY
542 eglSwapBuffers(EGLDisplay dpy
, EGLSurface surface
)
544 _EGLContext
*ctx
= _eglGetCurrentContext();
545 _EGL_DECLARE_DD_AND_SURFACE(dpy
, surface
);
547 /* surface must be bound to current context in EGL 1.4 */
548 if (!ctx
|| !_eglIsContextLinked(ctx
) || surf
!= ctx
->DrawSurface
)
549 return _eglError(EGL_BAD_SURFACE
, __FUNCTION__
);
551 return drv
->API
.SwapBuffers(drv
, disp
, surf
);
555 EGLBoolean EGLAPIENTRY
556 eglCopyBuffers(EGLDisplay dpy
, EGLSurface surface
, EGLNativePixmapType target
)
558 _EGL_DECLARE_DD_AND_SURFACE(dpy
, surface
);
559 return drv
->API
.CopyBuffers(drv
, disp
, surf
, target
);
563 EGLBoolean EGLAPIENTRY
566 _EGLContext
*ctx
= _eglGetCurrentContext();
572 /* let bad current context imply bad current surface */
573 if (!_eglIsContextLinked(ctx
) || !_eglIsSurfaceLinked(ctx
->DrawSurface
))
574 return _eglError(EGL_BAD_CURRENT_SURFACE
, __FUNCTION__
);
576 /* a valid current context implies an initialized current display */
577 disp
= ctx
->Resource
.Display
;
581 return drv
->API
.WaitClient(drv
, disp
, ctx
);
585 EGLBoolean EGLAPIENTRY
588 #ifdef EGL_VERSION_1_2
589 _EGLThreadInfo
*t
= _eglGetCurrentThread();
590 EGLint api_index
= t
->CurrentAPIIndex
;
591 EGLint es_index
= _eglConvertApiToIndex(EGL_OPENGL_ES_API
);
594 if (api_index
!= es_index
&& _eglIsCurrentThreadDummy())
595 return _eglError(EGL_BAD_ALLOC
, "eglWaitGL");
597 t
->CurrentAPIIndex
= es_index
;
598 ret
= eglWaitClient();
599 t
->CurrentAPIIndex
= api_index
;
602 return eglWaitClient();
607 EGLBoolean EGLAPIENTRY
608 eglWaitNative(EGLint engine
)
610 _EGLContext
*ctx
= _eglGetCurrentContext();
616 /* let bad current context imply bad current surface */
617 if (!_eglIsContextLinked(ctx
) || !_eglIsSurfaceLinked(ctx
->DrawSurface
))
618 return _eglError(EGL_BAD_CURRENT_SURFACE
, __FUNCTION__
);
620 /* a valid current context implies an initialized current display */
621 disp
= ctx
->Resource
.Display
;
625 return drv
->API
.WaitNative(drv
, disp
, engine
);
629 EGLDisplay EGLAPIENTRY
630 eglGetCurrentDisplay(void)
632 _EGLDisplay
*dpy
= _eglGetCurrentDisplay();
633 return _eglGetDisplayHandle(dpy
);
637 EGLContext EGLAPIENTRY
638 eglGetCurrentContext(void)
640 _EGLContext
*ctx
= _eglGetCurrentContext();
641 return _eglGetContextHandle(ctx
);
645 EGLSurface EGLAPIENTRY
646 eglGetCurrentSurface(EGLint readdraw
)
648 _EGLContext
*ctx
= _eglGetCurrentContext();
652 return EGL_NO_SURFACE
;
656 surf
= ctx
->DrawSurface
;
659 surf
= ctx
->ReadSurface
;
662 _eglError(EGL_BAD_PARAMETER
, __FUNCTION__
);
667 return _eglGetSurfaceHandle(surf
);
674 _EGLThreadInfo
*t
= _eglGetCurrentThread();
675 EGLint e
= t
->LastError
;
676 if (!_eglIsCurrentThreadDummy())
677 t
->LastError
= EGL_SUCCESS
;
682 __eglMustCastToProperFunctionPointerType EGLAPIENTRY
683 eglGetProcAddress(const char *procname
)
685 static const struct {
688 } egl_functions
[] = {
689 /* extensions only */
690 #ifdef EGL_MESA_screen_surface
691 { "eglChooseModeMESA", (_EGLProc
) eglChooseModeMESA
},
692 { "eglGetModesMESA", (_EGLProc
) eglGetModesMESA
},
693 { "eglGetModeAttribMESA", (_EGLProc
) eglGetModeAttribMESA
},
694 { "eglCopyContextMESA", (_EGLProc
) eglCopyContextMESA
},
695 { "eglGetScreensMESA", (_EGLProc
) eglGetScreensMESA
},
696 { "eglCreateScreenSurfaceMESA", (_EGLProc
) eglCreateScreenSurfaceMESA
},
697 { "eglShowScreenSurfaceMESA", (_EGLProc
) eglShowScreenSurfaceMESA
},
698 { "eglScreenPositionMESA", (_EGLProc
) eglScreenPositionMESA
},
699 { "eglQueryScreenMESA", (_EGLProc
) eglQueryScreenMESA
},
700 { "eglQueryScreenSurfaceMESA", (_EGLProc
) eglQueryScreenSurfaceMESA
},
701 { "eglQueryScreenModeMESA", (_EGLProc
) eglQueryScreenModeMESA
},
702 { "eglQueryModeStringMESA", (_EGLProc
) eglQueryModeStringMESA
},
703 #endif /* EGL_MESA_screen_surface */
704 #ifdef EGL_KHR_image_base
705 { "eglCreateImageKHR", (_EGLProc
) eglCreateImageKHR
},
706 { "eglDestroyImageKHR", (_EGLProc
) eglDestroyImageKHR
},
707 #endif /* EGL_KHR_image_base */
714 if (strncmp(procname
, "egl", 3) == 0) {
715 for (i
= 0; egl_functions
[i
].name
; i
++) {
716 if (strcmp(egl_functions
[i
].name
, procname
) == 0)
717 return egl_functions
[i
].function
;
721 _eglPreloadDrivers();
723 /* now loop over drivers to query their procs */
724 for (i
= 0; i
< _eglGlobal
.NumDrivers
; i
++) {
725 _EGLDriver
*drv
= _eglGlobal
.Drivers
[i
];
726 _EGLProc p
= drv
->API
.GetProcAddress(drv
, procname
);
735 #ifdef EGL_MESA_screen_surface
739 * EGL_MESA_screen extension
742 EGLBoolean EGLAPIENTRY
743 eglChooseModeMESA(EGLDisplay dpy
, EGLScreenMESA screen
,
744 const EGLint
*attrib_list
, EGLModeMESA
*modes
,
745 EGLint modes_size
, EGLint
*num_modes
)
747 _EGL_DECLARE_DD_AND_SCREEN(dpy
, screen
);
748 return drv
->API
.ChooseModeMESA(drv
, disp
, scrn
, attrib_list
,
749 modes
, modes_size
, num_modes
);
753 EGLBoolean EGLAPIENTRY
754 eglGetModesMESA(EGLDisplay dpy
, EGLScreenMESA screen
, EGLModeMESA
*modes
,
755 EGLint mode_size
, EGLint
*num_mode
)
757 _EGL_DECLARE_DD_AND_SCREEN(dpy
, screen
);
758 return drv
->API
.GetModesMESA(drv
, disp
, scrn
, modes
, mode_size
, num_mode
);
762 EGLBoolean EGLAPIENTRY
763 eglGetModeAttribMESA(EGLDisplay dpy
, EGLModeMESA mode
,
764 EGLint attribute
, EGLint
*value
)
766 _EGL_DECLARE_DD_AND_MODE(dpy
, mode
);
767 return drv
->API
.GetModeAttribMESA(drv
, disp
, m
, attribute
, value
);
771 EGLBoolean EGLAPIENTRY
772 eglCopyContextMESA(EGLDisplay dpy
, EGLContext source
, EGLContext dest
,
775 _EGLDisplay
*disp
= _eglLookupDisplay(dpy
);
776 _EGLContext
*source_context
= _eglLookupContext(source
, disp
);
777 _EGLContext
*dest_context
= _eglLookupContext(dest
, disp
);
780 drv
= _eglCheckContext(disp
, source_context
, __FUNCTION__
);
781 if (!drv
|| !dest_context
) {
783 _eglError(EGL_BAD_CONTEXT
, __FUNCTION__
);
787 return drv
->API
.CopyContextMESA(drv
, disp
, source_context
, dest_context
,
793 eglGetScreensMESA(EGLDisplay dpy
, EGLScreenMESA
*screens
,
794 EGLint max_screens
, EGLint
*num_screens
)
796 _EGL_DECLARE_DD(dpy
);
797 return drv
->API
.GetScreensMESA(drv
, disp
, screens
,
798 max_screens
, num_screens
);
803 eglCreateScreenSurfaceMESA(EGLDisplay dpy
, EGLConfig config
,
804 const EGLint
*attrib_list
)
806 _EGLDisplay
*disp
= _eglLookupDisplay(dpy
);
807 _EGLConfig
*conf
= _eglLookupConfig(config
, disp
);
811 drv
= _eglCheckConfig(disp
, conf
, __FUNCTION__
);
813 return EGL_NO_SURFACE
;
815 surf
= drv
->API
.CreateScreenSurfaceMESA(drv
, disp
, conf
, attrib_list
);
817 return _eglLinkSurface(surf
, disp
);
819 return EGL_NO_SURFACE
;
824 eglShowScreenSurfaceMESA(EGLDisplay dpy
, EGLint screen
,
825 EGLSurface surface
, EGLModeMESA mode
)
827 _EGLDisplay
*disp
= _eglLookupDisplay(dpy
);
828 _EGLScreen
*scrn
= _eglLookupScreen((EGLScreenMESA
) screen
, disp
);
829 _EGLSurface
*surf
= _eglLookupSurface(surface
, disp
);
830 _EGLMode
*m
= _eglLookupMode(mode
, disp
);
833 drv
= _eglCheckScreen(disp
, scrn
, __FUNCTION__
);
836 if (!surf
&& surface
!= EGL_NO_SURFACE
)
837 return _eglError(EGL_BAD_SURFACE
, __FUNCTION__
);
838 if (!m
&& mode
!= EGL_NO_MODE_MESA
)
839 return _eglError(EGL_BAD_MODE_MESA
, __FUNCTION__
);
841 return drv
->API
.ShowScreenSurfaceMESA(drv
, disp
, scrn
, surf
, m
);
846 eglScreenPositionMESA(EGLDisplay dpy
, EGLScreenMESA screen
, EGLint x
, EGLint y
)
848 _EGL_DECLARE_DD_AND_SCREEN(dpy
, screen
);
849 return drv
->API
.ScreenPositionMESA(drv
, disp
, scrn
, x
, y
);
854 eglQueryScreenMESA(EGLDisplay dpy
, EGLScreenMESA screen
,
855 EGLint attribute
, EGLint
*value
)
857 _EGL_DECLARE_DD_AND_SCREEN(dpy
, screen
);
858 return drv
->API
.QueryScreenMESA(drv
, disp
, scrn
, attribute
, value
);
863 eglQueryScreenSurfaceMESA(EGLDisplay dpy
, EGLScreenMESA screen
,
866 _EGLDisplay
*disp
= _eglLookupDisplay(dpy
);
867 _EGLScreen
*scrn
= _eglLookupScreen((EGLScreenMESA
) screen
, disp
);
871 drv
= _eglCheckScreen(disp
, scrn
, __FUNCTION__
);
875 if (drv
->API
.QueryScreenSurfaceMESA(drv
, disp
, scrn
, &surf
) != EGL_TRUE
)
878 *surface
= _eglGetSurfaceHandle(surf
);
879 return (surf
!= NULL
);
884 eglQueryScreenModeMESA(EGLDisplay dpy
, EGLScreenMESA screen
, EGLModeMESA
*mode
)
886 _EGLDisplay
*disp
= _eglLookupDisplay(dpy
);
887 _EGLScreen
*scrn
= _eglLookupScreen((EGLScreenMESA
) screen
, disp
);
891 drv
= _eglCheckScreen(disp
, scrn
, __FUNCTION__
);
895 if (drv
->API
.QueryScreenModeMESA(drv
, disp
, scrn
, &m
) != EGL_TRUE
)
905 eglQueryModeStringMESA(EGLDisplay dpy
, EGLModeMESA mode
)
907 _EGL_DECLARE_DD_AND_MODE(dpy
, mode
);
908 return drv
->API
.QueryModeStringMESA(drv
, disp
, m
);
912 #endif /* EGL_MESA_screen_surface */
919 #ifdef EGL_VERSION_1_2
923 * Specify the client API to use for subsequent calls including:
925 * eglGetCurrentContext()
926 * eglGetCurrentDisplay()
927 * eglGetCurrentSurface()
928 * eglMakeCurrent(when the ctx parameter is EGL NO CONTEXT)
931 * See section 3.7 "Rendering Context" in the EGL specification for details.
934 eglBindAPI(EGLenum api
)
936 _EGLThreadInfo
*t
= _eglGetCurrentThread();
938 if (_eglIsCurrentThreadDummy())
939 return _eglError(EGL_BAD_ALLOC
, "eglBindAPI");
941 if (!_eglIsApiValid(api
))
942 return _eglError(EGL_BAD_PARAMETER
, "eglBindAPI");
944 t
->CurrentAPIIndex
= _eglConvertApiToIndex(api
);
950 * Return the last value set with eglBindAPI().
955 /* returns one of EGL_OPENGL_API, EGL_OPENGL_ES_API or EGL_OPENVG_API */
956 _EGLThreadInfo
*t
= _eglGetCurrentThread();
957 return _eglConvertApiFromIndex(t
->CurrentAPIIndex
);
962 eglCreatePbufferFromClientBuffer(EGLDisplay dpy
, EGLenum buftype
,
963 EGLClientBuffer buffer
, EGLConfig config
,
964 const EGLint
*attrib_list
)
966 _EGLDisplay
*disp
= _eglLookupDisplay(dpy
);
967 _EGLConfig
*conf
= _eglLookupConfig(config
, disp
);
971 drv
= _eglCheckConfig(disp
, conf
, __FUNCTION__
);
973 return EGL_NO_SURFACE
;
975 surf
= drv
->API
.CreatePbufferFromClientBuffer(drv
, disp
, buftype
, buffer
,
978 return _eglLinkSurface(surf
, disp
);
980 return EGL_NO_SURFACE
;
985 eglReleaseThread(void)
987 /* unbind current context */
988 if (!_eglIsCurrentThreadDummy()) {
989 _EGLDisplay
*disp
= _eglGetCurrentDisplay();
993 (void) drv
->API
.MakeCurrent(drv
, disp
, NULL
, NULL
, NULL
);
997 _eglDestroyCurrentThread();
1002 #endif /* EGL_VERSION_1_2 */
1005 #ifdef EGL_KHR_image_base
1009 eglCreateImageKHR(EGLDisplay dpy
, EGLContext ctx
, EGLenum target
,
1010 EGLClientBuffer buffer
, const EGLint
*attr_list
)
1012 _EGLDisplay
*disp
= _eglLookupDisplay(dpy
);
1013 _EGLContext
*context
= _eglLookupContext(ctx
, disp
);
1017 drv
= _eglCheckDisplay(disp
, __FUNCTION__
);
1019 return EGL_NO_IMAGE_KHR
;
1020 if (!context
&& ctx
!= EGL_NO_CONTEXT
) {
1021 _eglError(EGL_BAD_CONTEXT
, __FUNCTION__
);
1022 return EGL_NO_IMAGE_KHR
;
1025 img
= drv
->API
.CreateImageKHR(drv
,
1026 disp
, context
, target
, buffer
, attr_list
);
1028 return _eglLinkImage(img
, disp
);
1030 return EGL_NO_IMAGE_KHR
;
1034 EGLBoolean
eglDestroyImageKHR(EGLDisplay dpy
, EGLImageKHR image
)
1036 _EGLDisplay
*disp
= _eglLookupDisplay(dpy
);
1037 _EGLImage
*img
= _eglLookupImage(image
, disp
);
1040 drv
= _eglCheckDisplay(disp
, __FUNCTION__
);
1044 return _eglError(EGL_BAD_PARAMETER
, __FUNCTION__
);
1046 _eglUnlinkImage(img
);
1047 return drv
->API
.DestroyImageKHR(drv
, disp
, img
);
1051 #endif /* EGL_KHR_image_base */