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
= _eglMatchDriver(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 return _eglError(EGL_NOT_INITIALIZED
, __FUNCTION__
);
115 disp
->APImajor
= major_int
;
116 disp
->APIminor
= minor_int
;
117 snprintf(disp
->Version
, sizeof(disp
->Version
),
118 "%d.%d (%s)", major_int
, minor_int
, drv
->Name
);
120 /* limit to APIs supported by core */
121 disp
->ClientAPIsMask
&= _EGL_API_ALL_BITS
;
125 major_int
= disp
->APImajor
;
126 minor_int
= disp
->APIminor
;
129 /* Update applications version of major and minor if not NULL */
130 if ((major
!= NULL
) && (minor
!= NULL
)) {
139 EGLBoolean EGLAPIENTRY
140 eglTerminate(EGLDisplay dpy
)
142 _EGLDisplay
*disp
= _eglLookupDisplay(dpy
);
146 return _eglError(EGL_BAD_DISPLAY
, __FUNCTION__
);
150 drv
->API
.Terminate(drv
, disp
);
159 * A bunch of check functions and declare macros to simply error checking.
161 static INLINE _EGLDriver
*
162 _eglCheckDisplay(_EGLDisplay
*disp
, const char *msg
)
165 _eglError(EGL_BAD_DISPLAY
, msg
);
169 _eglError(EGL_NOT_INITIALIZED
, msg
);
176 static INLINE _EGLDriver
*
177 _eglCheckSurface(_EGLDisplay
*disp
, _EGLSurface
*surf
, const char *msg
)
179 _EGLDriver
*drv
= _eglCheckDisplay(disp
, msg
);
183 _eglError(EGL_BAD_SURFACE
, msg
);
190 static INLINE _EGLDriver
*
191 _eglCheckContext(_EGLDisplay
*disp
, _EGLContext
*context
, const char *msg
)
193 _EGLDriver
*drv
= _eglCheckDisplay(disp
, msg
);
197 _eglError(EGL_BAD_CONTEXT
, msg
);
204 static INLINE _EGLDriver
*
205 _eglCheckConfig(_EGLDisplay
*disp
, _EGLConfig
*conf
, const char *msg
)
207 _EGLDriver
*drv
= _eglCheckDisplay(disp
, msg
);
211 _eglError(EGL_BAD_CONFIG
, msg
);
218 #define _EGL_DECLARE_DD(dpy) \
219 _EGLDisplay *disp = _eglLookupDisplay(dpy); \
222 drv = _eglCheckDisplay(disp, __FUNCTION__); \
228 #define _EGL_DECLARE_DD_AND_SURFACE(dpy, surface) \
229 _EGLDisplay *disp = _eglLookupDisplay(dpy); \
230 _EGLSurface *surf = _eglLookupSurface((surface), disp); \
233 drv = _eglCheckSurface(disp, surf, __FUNCTION__); \
239 #define _EGL_DECLARE_DD_AND_CONTEXT(dpy, ctx) \
240 _EGLDisplay *disp = _eglLookupDisplay(dpy); \
241 _EGLContext *context = _eglLookupContext((ctx), disp); \
244 drv = _eglCheckContext(disp, context, __FUNCTION__); \
250 #ifdef EGL_MESA_screen_surface
253 static INLINE _EGLDriver
*
254 _eglCheckScreen(_EGLDisplay
*disp
, _EGLScreen
*scrn
, const char *msg
)
256 _EGLDriver
*drv
= _eglCheckDisplay(disp
, msg
);
260 _eglError(EGL_BAD_SCREEN_MESA
, msg
);
267 static INLINE _EGLDriver
*
268 _eglCheckMode(_EGLDisplay
*disp
, _EGLMode
*m
, const char *msg
)
270 _EGLDriver
*drv
= _eglCheckDisplay(disp
, msg
);
274 _eglError(EGL_BAD_MODE_MESA
, msg
);
281 #define _EGL_DECLARE_DD_AND_SCREEN(dpy, screen) \
282 _EGLDisplay *disp = _eglLookupDisplay(dpy); \
283 _EGLScreen *scrn = _eglLookupScreen((screen), disp); \
286 drv = _eglCheckScreen(disp, scrn, __FUNCTION__); \
292 #define _EGL_DECLARE_DD_AND_MODE(dpy, mode) \
293 _EGLDisplay *disp = _eglLookupDisplay(dpy); \
294 _EGLMode *m = _eglLookupMode((mode), disp); \
297 drv = _eglCheckMode(disp, m, __FUNCTION__); \
303 #endif /* EGL_MESA_screen_surface */
306 const char * EGLAPIENTRY
307 eglQueryString(EGLDisplay dpy
, EGLint name
)
309 _EGL_DECLARE_DD(dpy
);
310 return drv
->API
.QueryString(drv
, disp
, name
);
314 EGLBoolean EGLAPIENTRY
315 eglGetConfigs(EGLDisplay dpy
, EGLConfig
*configs
,
316 EGLint config_size
, EGLint
*num_config
)
318 _EGL_DECLARE_DD(dpy
);
319 return drv
->API
.GetConfigs(drv
, disp
, configs
, config_size
, num_config
);
323 EGLBoolean EGLAPIENTRY
324 eglChooseConfig(EGLDisplay dpy
, const EGLint
*attrib_list
, EGLConfig
*configs
,
325 EGLint config_size
, EGLint
*num_config
)
327 _EGL_DECLARE_DD(dpy
);
328 return drv
->API
.ChooseConfig(drv
, disp
, attrib_list
, configs
,
329 config_size
, num_config
);
333 EGLBoolean EGLAPIENTRY
334 eglGetConfigAttrib(EGLDisplay dpy
, EGLConfig config
,
335 EGLint attribute
, EGLint
*value
)
337 _EGLDisplay
*disp
= _eglLookupDisplay(dpy
);
338 _EGLConfig
*conf
= _eglLookupConfig(config
, disp
);
341 drv
= _eglCheckConfig(disp
, conf
, __FUNCTION__
);
345 return drv
->API
.GetConfigAttrib(drv
, disp
, conf
, attribute
, value
);
349 EGLContext EGLAPIENTRY
350 eglCreateContext(EGLDisplay dpy
, EGLConfig config
, EGLContext share_list
,
351 const EGLint
*attrib_list
)
353 _EGLDisplay
*disp
= _eglLookupDisplay(dpy
);
354 _EGLConfig
*conf
= _eglLookupConfig(config
, disp
);
355 _EGLContext
*share
= _eglLookupContext(share_list
, disp
);
357 _EGLContext
*context
;
359 drv
= _eglCheckConfig(disp
, conf
, __FUNCTION__
);
361 return EGL_NO_CONTEXT
;
362 if (!share
&& share_list
!= EGL_NO_CONTEXT
) {
363 _eglError(EGL_BAD_CONTEXT
, __FUNCTION__
);
364 return EGL_NO_CONTEXT
;
367 context
= drv
->API
.CreateContext(drv
, disp
, conf
, share
, attrib_list
);
369 return _eglLinkContext(context
, disp
);
371 return EGL_NO_CONTEXT
;
375 EGLBoolean EGLAPIENTRY
376 eglDestroyContext(EGLDisplay dpy
, EGLContext ctx
)
378 _EGL_DECLARE_DD_AND_CONTEXT(dpy
, ctx
);
379 _eglUnlinkContext(context
);
380 return drv
->API
.DestroyContext(drv
, disp
, context
);
384 EGLBoolean EGLAPIENTRY
385 eglMakeCurrent(EGLDisplay dpy
, EGLSurface draw
, EGLSurface read
,
388 _EGLDisplay
*disp
= _eglLookupDisplay(dpy
);
389 _EGLContext
*context
= _eglLookupContext(ctx
, disp
);
390 _EGLSurface
*draw_surf
= _eglLookupSurface(draw
, disp
);
391 _EGLSurface
*read_surf
= _eglLookupSurface(read
, disp
);
394 drv
= _eglCheckDisplay(disp
, __FUNCTION__
);
397 if (!context
&& ctx
!= EGL_NO_CONTEXT
)
398 return _eglError(EGL_BAD_CONTEXT
, __FUNCTION__
);
399 if ((!draw_surf
&& draw
!= EGL_NO_SURFACE
) ||
400 (!read_surf
&& read
!= EGL_NO_SURFACE
))
401 return _eglError(EGL_BAD_SURFACE
, __FUNCTION__
);
403 return drv
->API
.MakeCurrent(drv
, disp
, draw_surf
, read_surf
, context
);
407 EGLBoolean EGLAPIENTRY
408 eglQueryContext(EGLDisplay dpy
, EGLContext ctx
,
409 EGLint attribute
, EGLint
*value
)
411 _EGL_DECLARE_DD_AND_CONTEXT(dpy
, ctx
);
412 return drv
->API
.QueryContext(drv
, disp
, context
, attribute
, value
);
416 EGLSurface EGLAPIENTRY
417 eglCreateWindowSurface(EGLDisplay dpy
, EGLConfig config
,
418 EGLNativeWindowType window
, const EGLint
*attrib_list
)
420 _EGLDisplay
*disp
= _eglLookupDisplay(dpy
);
421 _EGLConfig
*conf
= _eglLookupConfig(config
, disp
);
425 drv
= _eglCheckConfig(disp
, conf
, __FUNCTION__
);
427 return EGL_NO_SURFACE
;
429 surf
= drv
->API
.CreateWindowSurface(drv
, disp
, conf
, window
, attrib_list
);
431 return _eglLinkSurface(surf
, disp
);
433 return EGL_NO_SURFACE
;
437 EGLSurface EGLAPIENTRY
438 eglCreatePixmapSurface(EGLDisplay dpy
, EGLConfig config
,
439 EGLNativePixmapType pixmap
, const EGLint
*attrib_list
)
441 _EGLDisplay
*disp
= _eglLookupDisplay(dpy
);
442 _EGLConfig
*conf
= _eglLookupConfig(config
, disp
);
446 drv
= _eglCheckConfig(disp
, conf
, __FUNCTION__
);
448 return EGL_NO_SURFACE
;
450 surf
= drv
->API
.CreatePixmapSurface(drv
, disp
, conf
, pixmap
, attrib_list
);
452 return _eglLinkSurface(surf
, disp
);
454 return EGL_NO_SURFACE
;
458 EGLSurface EGLAPIENTRY
459 eglCreatePbufferSurface(EGLDisplay dpy
, EGLConfig config
,
460 const EGLint
*attrib_list
)
462 _EGLDisplay
*disp
= _eglLookupDisplay(dpy
);
463 _EGLConfig
*conf
= _eglLookupConfig(config
, disp
);
467 drv
= _eglCheckConfig(disp
, conf
, __FUNCTION__
);
469 return EGL_NO_SURFACE
;
471 surf
= drv
->API
.CreatePbufferSurface(drv
, disp
, conf
, attrib_list
);
473 return _eglLinkSurface(surf
, disp
);
475 return EGL_NO_SURFACE
;
479 EGLBoolean EGLAPIENTRY
480 eglDestroySurface(EGLDisplay dpy
, EGLSurface surface
)
482 _EGL_DECLARE_DD_AND_SURFACE(dpy
, surface
);
483 _eglUnlinkSurface(surf
);
484 return drv
->API
.DestroySurface(drv
, disp
, surf
);
487 EGLBoolean EGLAPIENTRY
488 eglQuerySurface(EGLDisplay dpy
, EGLSurface surface
,
489 EGLint attribute
, EGLint
*value
)
491 _EGL_DECLARE_DD_AND_SURFACE(dpy
, surface
);
492 return drv
->API
.QuerySurface(drv
, disp
, surf
, attribute
, value
);
495 EGLBoolean EGLAPIENTRY
496 eglSurfaceAttrib(EGLDisplay dpy
, EGLSurface surface
,
497 EGLint attribute
, EGLint value
)
499 _EGL_DECLARE_DD_AND_SURFACE(dpy
, surface
);
500 return drv
->API
.SurfaceAttrib(drv
, disp
, surf
, attribute
, value
);
504 EGLBoolean EGLAPIENTRY
505 eglBindTexImage(EGLDisplay dpy
, EGLSurface surface
, EGLint buffer
)
507 _EGL_DECLARE_DD_AND_SURFACE(dpy
, surface
);
508 return drv
->API
.BindTexImage(drv
, disp
, surf
, buffer
);
512 EGLBoolean EGLAPIENTRY
513 eglReleaseTexImage(EGLDisplay dpy
, EGLSurface surface
, EGLint buffer
)
515 _EGL_DECLARE_DD_AND_SURFACE(dpy
, surface
);
516 return drv
->API
.ReleaseTexImage(drv
, disp
, surf
, buffer
);
520 EGLBoolean EGLAPIENTRY
521 eglSwapInterval(EGLDisplay dpy
, EGLint interval
)
523 _EGLContext
*ctx
= _eglGetCurrentContext();
525 _EGL_DECLARE_DD(dpy
);
527 if (!ctx
|| !_eglIsContextLinked(ctx
) || ctx
->Resource
.Display
!= disp
)
528 return _eglError(EGL_BAD_CONTEXT
, __FUNCTION__
);
530 surf
= ctx
->DrawSurface
;
531 if (!_eglIsSurfaceLinked(surf
))
532 return _eglError(EGL_BAD_SURFACE
, __FUNCTION__
);
534 return drv
->API
.SwapInterval(drv
, disp
, surf
, interval
);
538 EGLBoolean EGLAPIENTRY
539 eglSwapBuffers(EGLDisplay dpy
, EGLSurface surface
)
541 _EGLContext
*ctx
= _eglGetCurrentContext();
542 _EGL_DECLARE_DD_AND_SURFACE(dpy
, surface
);
544 /* surface must be bound to current context in EGL 1.4 */
545 if (!ctx
|| !_eglIsContextLinked(ctx
) || surf
!= ctx
->DrawSurface
)
546 return _eglError(EGL_BAD_SURFACE
, __FUNCTION__
);
548 return drv
->API
.SwapBuffers(drv
, disp
, surf
);
552 EGLBoolean EGLAPIENTRY
553 eglCopyBuffers(EGLDisplay dpy
, EGLSurface surface
, EGLNativePixmapType target
)
555 _EGL_DECLARE_DD_AND_SURFACE(dpy
, surface
);
556 return drv
->API
.CopyBuffers(drv
, disp
, surf
, target
);
560 EGLBoolean EGLAPIENTRY
563 _EGLContext
*ctx
= _eglGetCurrentContext();
569 /* let bad current context imply bad current surface */
570 if (!_eglIsContextLinked(ctx
) || !_eglIsSurfaceLinked(ctx
->DrawSurface
))
571 return _eglError(EGL_BAD_CURRENT_SURFACE
, __FUNCTION__
);
573 /* a valid current context implies an initialized current display */
574 disp
= ctx
->Resource
.Display
;
578 return drv
->API
.WaitClient(drv
, disp
, ctx
);
582 EGLBoolean EGLAPIENTRY
585 #ifdef EGL_VERSION_1_2
586 _EGLThreadInfo
*t
= _eglGetCurrentThread();
587 EGLint api_index
= t
->CurrentAPIIndex
;
588 EGLint es_index
= _eglConvertApiToIndex(EGL_OPENGL_ES_API
);
591 if (api_index
!= es_index
&& _eglIsCurrentThreadDummy())
592 return _eglError(EGL_BAD_ALLOC
, "eglWaitGL");
594 t
->CurrentAPIIndex
= es_index
;
595 ret
= eglWaitClient();
596 t
->CurrentAPIIndex
= api_index
;
599 return eglWaitClient();
604 EGLBoolean EGLAPIENTRY
605 eglWaitNative(EGLint engine
)
607 _EGLContext
*ctx
= _eglGetCurrentContext();
613 /* let bad current context imply bad current surface */
614 if (!_eglIsContextLinked(ctx
) || !_eglIsSurfaceLinked(ctx
->DrawSurface
))
615 return _eglError(EGL_BAD_CURRENT_SURFACE
, __FUNCTION__
);
617 /* a valid current context implies an initialized current display */
618 disp
= ctx
->Resource
.Display
;
622 return drv
->API
.WaitNative(drv
, disp
, engine
);
626 EGLDisplay EGLAPIENTRY
627 eglGetCurrentDisplay(void)
629 _EGLContext
*ctx
= _eglGetCurrentContext();
630 return (ctx
) ? _eglGetDisplayHandle(ctx
->Resource
.Display
) : EGL_NO_DISPLAY
;
634 EGLContext EGLAPIENTRY
635 eglGetCurrentContext(void)
637 _EGLContext
*ctx
= _eglGetCurrentContext();
638 return _eglGetContextHandle(ctx
);
642 EGLSurface EGLAPIENTRY
643 eglGetCurrentSurface(EGLint readdraw
)
645 _EGLContext
*ctx
= _eglGetCurrentContext();
649 return EGL_NO_SURFACE
;
653 surf
= ctx
->DrawSurface
;
656 surf
= ctx
->ReadSurface
;
659 _eglError(EGL_BAD_PARAMETER
, __FUNCTION__
);
664 return _eglGetSurfaceHandle(surf
);
671 _EGLThreadInfo
*t
= _eglGetCurrentThread();
672 EGLint e
= t
->LastError
;
673 if (!_eglIsCurrentThreadDummy())
674 t
->LastError
= EGL_SUCCESS
;
679 __eglMustCastToProperFunctionPointerType EGLAPIENTRY
680 eglGetProcAddress(const char *procname
)
682 static const struct {
685 } egl_functions
[] = {
686 /* extensions only */
687 #ifdef EGL_MESA_screen_surface
688 { "eglChooseModeMESA", (_EGLProc
) eglChooseModeMESA
},
689 { "eglGetModesMESA", (_EGLProc
) eglGetModesMESA
},
690 { "eglGetModeAttribMESA", (_EGLProc
) eglGetModeAttribMESA
},
691 { "eglCopyContextMESA", (_EGLProc
) eglCopyContextMESA
},
692 { "eglGetScreensMESA", (_EGLProc
) eglGetScreensMESA
},
693 { "eglCreateScreenSurfaceMESA", (_EGLProc
) eglCreateScreenSurfaceMESA
},
694 { "eglShowScreenSurfaceMESA", (_EGLProc
) eglShowScreenSurfaceMESA
},
695 { "eglScreenPositionMESA", (_EGLProc
) eglScreenPositionMESA
},
696 { "eglQueryScreenMESA", (_EGLProc
) eglQueryScreenMESA
},
697 { "eglQueryScreenSurfaceMESA", (_EGLProc
) eglQueryScreenSurfaceMESA
},
698 { "eglQueryScreenModeMESA", (_EGLProc
) eglQueryScreenModeMESA
},
699 { "eglQueryModeStringMESA", (_EGLProc
) eglQueryModeStringMESA
},
700 #endif /* EGL_MESA_screen_surface */
701 #ifdef EGL_KHR_image_base
702 { "eglCreateImageKHR", (_EGLProc
) eglCreateImageKHR
},
703 { "eglDestroyImageKHR", (_EGLProc
) eglDestroyImageKHR
},
704 #endif /* EGL_KHR_image_base */
711 if (strncmp(procname
, "egl", 3) == 0) {
712 for (i
= 0; egl_functions
[i
].name
; i
++) {
713 if (strcmp(egl_functions
[i
].name
, procname
) == 0)
714 return egl_functions
[i
].function
;
718 _eglPreloadDrivers();
720 /* now loop over drivers to query their procs */
721 for (i
= 0; i
< _eglGlobal
.NumDrivers
; i
++) {
722 _EGLDriver
*drv
= _eglGlobal
.Drivers
[i
];
723 _EGLProc p
= drv
->API
.GetProcAddress(drv
, procname
);
732 #ifdef EGL_MESA_screen_surface
736 * EGL_MESA_screen extension
739 EGLBoolean EGLAPIENTRY
740 eglChooseModeMESA(EGLDisplay dpy
, EGLScreenMESA screen
,
741 const EGLint
*attrib_list
, EGLModeMESA
*modes
,
742 EGLint modes_size
, EGLint
*num_modes
)
744 _EGL_DECLARE_DD_AND_SCREEN(dpy
, screen
);
745 return drv
->API
.ChooseModeMESA(drv
, disp
, scrn
, attrib_list
,
746 modes
, modes_size
, num_modes
);
750 EGLBoolean EGLAPIENTRY
751 eglGetModesMESA(EGLDisplay dpy
, EGLScreenMESA screen
, EGLModeMESA
*modes
,
752 EGLint mode_size
, EGLint
*num_mode
)
754 _EGL_DECLARE_DD_AND_SCREEN(dpy
, screen
);
755 return drv
->API
.GetModesMESA(drv
, disp
, scrn
, modes
, mode_size
, num_mode
);
759 EGLBoolean EGLAPIENTRY
760 eglGetModeAttribMESA(EGLDisplay dpy
, EGLModeMESA mode
,
761 EGLint attribute
, EGLint
*value
)
763 _EGL_DECLARE_DD_AND_MODE(dpy
, mode
);
764 return drv
->API
.GetModeAttribMESA(drv
, disp
, m
, attribute
, value
);
768 EGLBoolean EGLAPIENTRY
769 eglCopyContextMESA(EGLDisplay dpy
, EGLContext source
, EGLContext dest
,
772 _EGLDisplay
*disp
= _eglLookupDisplay(dpy
);
773 _EGLContext
*source_context
= _eglLookupContext(source
, disp
);
774 _EGLContext
*dest_context
= _eglLookupContext(dest
, disp
);
777 drv
= _eglCheckContext(disp
, source_context
, __FUNCTION__
);
778 if (!drv
|| !dest_context
) {
780 _eglError(EGL_BAD_CONTEXT
, __FUNCTION__
);
784 return drv
->API
.CopyContextMESA(drv
, disp
, source_context
, dest_context
,
790 eglGetScreensMESA(EGLDisplay dpy
, EGLScreenMESA
*screens
,
791 EGLint max_screens
, EGLint
*num_screens
)
793 _EGL_DECLARE_DD(dpy
);
794 return drv
->API
.GetScreensMESA(drv
, disp
, screens
,
795 max_screens
, num_screens
);
800 eglCreateScreenSurfaceMESA(EGLDisplay dpy
, EGLConfig config
,
801 const EGLint
*attrib_list
)
803 _EGLDisplay
*disp
= _eglLookupDisplay(dpy
);
804 _EGLConfig
*conf
= _eglLookupConfig(config
, disp
);
808 drv
= _eglCheckConfig(disp
, conf
, __FUNCTION__
);
810 return EGL_NO_SURFACE
;
812 surf
= drv
->API
.CreateScreenSurfaceMESA(drv
, disp
, conf
, attrib_list
);
814 return _eglLinkSurface(surf
, disp
);
816 return EGL_NO_SURFACE
;
821 eglShowScreenSurfaceMESA(EGLDisplay dpy
, EGLint screen
,
822 EGLSurface surface
, EGLModeMESA mode
)
824 _EGLDisplay
*disp
= _eglLookupDisplay(dpy
);
825 _EGLScreen
*scrn
= _eglLookupScreen((EGLScreenMESA
) screen
, disp
);
826 _EGLSurface
*surf
= _eglLookupSurface(surface
, disp
);
827 _EGLMode
*m
= _eglLookupMode(mode
, disp
);
830 drv
= _eglCheckScreen(disp
, scrn
, __FUNCTION__
);
833 if (!surf
&& surface
!= EGL_NO_SURFACE
)
834 return _eglError(EGL_BAD_SURFACE
, __FUNCTION__
);
835 if (!m
&& mode
!= EGL_NO_MODE_MESA
)
836 return _eglError(EGL_BAD_MODE_MESA
, __FUNCTION__
);
838 return drv
->API
.ShowScreenSurfaceMESA(drv
, disp
, scrn
, surf
, m
);
843 eglScreenPositionMESA(EGLDisplay dpy
, EGLScreenMESA screen
, EGLint x
, EGLint y
)
845 _EGL_DECLARE_DD_AND_SCREEN(dpy
, screen
);
846 return drv
->API
.ScreenPositionMESA(drv
, disp
, scrn
, x
, y
);
851 eglQueryScreenMESA(EGLDisplay dpy
, EGLScreenMESA screen
,
852 EGLint attribute
, EGLint
*value
)
854 _EGL_DECLARE_DD_AND_SCREEN(dpy
, screen
);
855 return drv
->API
.QueryScreenMESA(drv
, disp
, scrn
, attribute
, value
);
860 eglQueryScreenSurfaceMESA(EGLDisplay dpy
, EGLScreenMESA screen
,
863 _EGLDisplay
*disp
= _eglLookupDisplay(dpy
);
864 _EGLScreen
*scrn
= _eglLookupScreen((EGLScreenMESA
) screen
, disp
);
868 drv
= _eglCheckScreen(disp
, scrn
, __FUNCTION__
);
872 if (drv
->API
.QueryScreenSurfaceMESA(drv
, disp
, scrn
, &surf
) != EGL_TRUE
)
875 *surface
= _eglGetSurfaceHandle(surf
);
876 return (surf
!= NULL
);
881 eglQueryScreenModeMESA(EGLDisplay dpy
, EGLScreenMESA screen
, EGLModeMESA
*mode
)
883 _EGLDisplay
*disp
= _eglLookupDisplay(dpy
);
884 _EGLScreen
*scrn
= _eglLookupScreen((EGLScreenMESA
) screen
, disp
);
888 drv
= _eglCheckScreen(disp
, scrn
, __FUNCTION__
);
892 if (drv
->API
.QueryScreenModeMESA(drv
, disp
, scrn
, &m
) != EGL_TRUE
)
902 eglQueryModeStringMESA(EGLDisplay dpy
, EGLModeMESA mode
)
904 _EGL_DECLARE_DD_AND_MODE(dpy
, mode
);
905 return drv
->API
.QueryModeStringMESA(drv
, disp
, m
);
909 #endif /* EGL_MESA_screen_surface */
916 #ifdef EGL_VERSION_1_2
920 * Specify the client API to use for subsequent calls including:
922 * eglGetCurrentContext()
923 * eglGetCurrentDisplay()
924 * eglGetCurrentSurface()
925 * eglMakeCurrent(when the ctx parameter is EGL NO CONTEXT)
928 * See section 3.7 "Rendering Context" in the EGL specification for details.
931 eglBindAPI(EGLenum api
)
933 _EGLThreadInfo
*t
= _eglGetCurrentThread();
935 if (_eglIsCurrentThreadDummy())
936 return _eglError(EGL_BAD_ALLOC
, "eglBindAPI");
938 if (!_eglIsApiValid(api
))
939 return _eglError(EGL_BAD_PARAMETER
, "eglBindAPI");
941 t
->CurrentAPIIndex
= _eglConvertApiToIndex(api
);
947 * Return the last value set with eglBindAPI().
952 /* returns one of EGL_OPENGL_API, EGL_OPENGL_ES_API or EGL_OPENVG_API */
953 _EGLThreadInfo
*t
= _eglGetCurrentThread();
954 return _eglConvertApiFromIndex(t
->CurrentAPIIndex
);
959 eglCreatePbufferFromClientBuffer(EGLDisplay dpy
, EGLenum buftype
,
960 EGLClientBuffer buffer
, EGLConfig config
,
961 const EGLint
*attrib_list
)
963 _EGLDisplay
*disp
= _eglLookupDisplay(dpy
);
964 _EGLConfig
*conf
= _eglLookupConfig(config
, disp
);
968 drv
= _eglCheckConfig(disp
, conf
, __FUNCTION__
);
970 return EGL_NO_SURFACE
;
972 surf
= drv
->API
.CreatePbufferFromClientBuffer(drv
, disp
, buftype
, buffer
,
975 return _eglLinkSurface(surf
, disp
);
977 return EGL_NO_SURFACE
;
982 eglReleaseThread(void)
984 /* unbind current contexts */
985 if (!_eglIsCurrentThreadDummy()) {
986 _EGLThreadInfo
*t
= _eglGetCurrentThread();
989 for (i
= 0; i
< _EGL_API_NUM_APIS
; i
++) {
990 _EGLContext
*ctx
= t
->CurrentContexts
[i
];
992 _EGLDisplay
*disp
= ctx
->Resource
.Display
;
993 _EGLDriver
*drv
= disp
->Driver
;
994 /* what if drv is not avaialbe? */
996 (void) drv
->API
.MakeCurrent(drv
, disp
, NULL
, NULL
, NULL
);
1001 _eglDestroyCurrentThread();
1006 #endif /* EGL_VERSION_1_2 */
1009 #ifdef EGL_KHR_image_base
1013 eglCreateImageKHR(EGLDisplay dpy
, EGLContext ctx
, EGLenum target
,
1014 EGLClientBuffer buffer
, const EGLint
*attr_list
)
1016 _EGLDisplay
*disp
= _eglLookupDisplay(dpy
);
1017 _EGLContext
*context
= _eglLookupContext(ctx
, disp
);
1021 drv
= _eglCheckDisplay(disp
, __FUNCTION__
);
1023 return EGL_NO_IMAGE_KHR
;
1024 if (!context
&& ctx
!= EGL_NO_CONTEXT
) {
1025 _eglError(EGL_BAD_CONTEXT
, __FUNCTION__
);
1026 return EGL_NO_IMAGE_KHR
;
1029 img
= drv
->API
.CreateImageKHR(drv
,
1030 disp
, context
, target
, buffer
, attr_list
);
1032 return _eglLinkImage(img
, disp
);
1034 return EGL_NO_IMAGE_KHR
;
1038 EGLBoolean
eglDestroyImageKHR(EGLDisplay dpy
, EGLImageKHR image
)
1040 _EGLDisplay
*disp
= _eglLookupDisplay(dpy
);
1041 _EGLImage
*img
= _eglLookupImage(image
, disp
);
1044 drv
= _eglCheckDisplay(disp
, __FUNCTION__
);
1048 return _eglError(EGL_BAD_PARAMETER
, __FUNCTION__
);
1050 _eglUnlinkImage(img
);
1051 return drv
->API
.DestroyImageKHR(drv
, disp
, img
);
1055 #endif /* EGL_KHR_image_base */