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"
45 * NOTE: displayName is treated as a string in _eglChooseDriver()!!!
46 * This will probably change!
47 * See _eglChooseDriver() for details!
50 eglGetDisplay(NativeDisplayType displayName
)
54 dpy
= _eglNewDisplay(displayName
);
58 return EGL_NO_DISPLAY
;
63 eglInitialize(EGLDisplay dpy
, EGLint
*major
, EGLint
*minor
)
66 _EGLDriver
*drv
= _eglChooseDriver(dpy
);
68 return drv
->API
.Initialize(drv
, dpy
, major
, minor
);
75 eglTerminate(EGLDisplay dpy
)
77 _EGLDriver
*drv
= _eglLookupDriver(dpy
);
79 return _eglCloseDriver(drv
, dpy
);
86 eglQueryString(EGLDisplay dpy
, EGLint name
)
88 _EGLDriver
*drv
= _eglLookupDriver(dpy
);
90 return drv
->API
.QueryString(drv
, dpy
, name
);
97 eglGetConfigs(EGLDisplay dpy
, EGLConfig
*configs
, EGLint config_size
, EGLint
*num_config
)
99 _EGLDriver
*drv
= _eglLookupDriver(dpy
);
100 /* XXX check drv for null in remaining functions */
101 return drv
->API
.GetConfigs(drv
, dpy
, configs
, config_size
, num_config
);
106 eglChooseConfig(EGLDisplay dpy
, const EGLint
*attrib_list
, EGLConfig
*configs
, EGLint config_size
, EGLint
*num_config
)
108 _EGLDriver
*drv
= _eglLookupDriver(dpy
);
109 return drv
->API
.ChooseConfig(drv
, dpy
, attrib_list
, configs
, config_size
, num_config
);
114 eglGetConfigAttrib(EGLDisplay dpy
, EGLConfig config
, EGLint attribute
, EGLint
*value
)
116 _EGLDriver
*drv
= _eglLookupDriver(dpy
);
117 return drv
->API
.GetConfigAttrib(drv
, dpy
, config
, attribute
, value
);
122 eglCreateContext(EGLDisplay dpy
, EGLConfig config
, EGLContext share_list
, const EGLint
*attrib_list
)
124 _EGLDriver
*drv
= _eglLookupDriver(dpy
);
125 return drv
->API
.CreateContext(drv
, dpy
, config
, share_list
, attrib_list
);
130 eglDestroyContext(EGLDisplay dpy
, EGLContext ctx
)
132 _EGLDriver
*drv
= _eglLookupDriver(dpy
);
133 return drv
->API
.DestroyContext(drv
, dpy
, ctx
);
138 eglMakeCurrent(EGLDisplay dpy
, EGLSurface draw
, EGLSurface read
, EGLContext ctx
)
140 _EGLDriver
*drv
= _eglLookupDriver(dpy
);
141 return drv
->API
.MakeCurrent(drv
, dpy
, draw
, read
, ctx
);
146 eglQueryContext(EGLDisplay dpy
, EGLContext ctx
, EGLint attribute
, EGLint
*value
)
148 _EGLDriver
*drv
= _eglLookupDriver(dpy
);
149 return drv
->API
.QueryContext(drv
, dpy
, ctx
, attribute
, value
);
154 eglCreateWindowSurface(EGLDisplay dpy
, EGLConfig config
, NativeWindowType window
, const EGLint
*attrib_list
)
156 _EGLDriver
*drv
= _eglLookupDriver(dpy
);
157 return drv
->API
.CreateWindowSurface(drv
, dpy
, config
, window
, attrib_list
);
162 eglCreatePixmapSurface(EGLDisplay dpy
, EGLConfig config
, NativePixmapType pixmap
, const EGLint
*attrib_list
)
164 _EGLDriver
*drv
= _eglLookupDriver(dpy
);
165 return drv
->API
.CreatePixmapSurface(drv
, dpy
, config
, pixmap
, attrib_list
);
170 eglCreatePbufferSurface(EGLDisplay dpy
, EGLConfig config
, const EGLint
*attrib_list
)
172 _EGLDriver
*drv
= _eglLookupDriver(dpy
);
173 return drv
->API
.CreatePbufferSurface(drv
, dpy
, config
, attrib_list
);
178 eglDestroySurface(EGLDisplay dpy
, EGLSurface surface
)
180 _EGLDriver
*drv
= _eglLookupDriver(dpy
);
181 return drv
->API
.DestroySurface(drv
, dpy
, surface
);
186 eglQuerySurface(EGLDisplay dpy
, EGLSurface surface
, EGLint attribute
, EGLint
*value
)
188 _EGLDriver
*drv
= _eglLookupDriver(dpy
);
189 return drv
->API
.QuerySurface(drv
, dpy
, surface
, attribute
, value
);
194 eglSurfaceAttrib(EGLDisplay dpy
, EGLSurface surface
, EGLint attribute
, EGLint value
)
196 _EGLDriver
*drv
= _eglLookupDriver(dpy
);
197 return drv
->API
.SurfaceAttrib(drv
, dpy
, surface
, attribute
, value
);
202 eglBindTexImage(EGLDisplay dpy
, EGLSurface surface
, EGLint buffer
)
204 _EGLDriver
*drv
= _eglLookupDriver(dpy
);
205 return drv
->API
.BindTexImage(drv
, dpy
, surface
, buffer
);
210 eglReleaseTexImage(EGLDisplay dpy
, EGLSurface surface
, EGLint buffer
)
212 _EGLDriver
*drv
= _eglLookupDriver(dpy
);
213 return drv
->API
.ReleaseTexImage(drv
, dpy
, surface
, buffer
);
218 eglSwapInterval(EGLDisplay dpy
, EGLint interval
)
220 _EGLDriver
*drv
= _eglLookupDriver(dpy
);
221 return drv
->API
.SwapInterval(drv
, dpy
, interval
);
226 eglSwapBuffers(EGLDisplay dpy
, EGLSurface draw
)
228 _EGLDriver
*drv
= _eglLookupDriver(dpy
);
229 return drv
->API
.SwapBuffers(drv
, dpy
, draw
);
234 eglCopyBuffers(EGLDisplay dpy
, EGLSurface surface
, NativePixmapType target
)
236 _EGLDriver
*drv
= _eglLookupDriver(dpy
);
237 return drv
->API
.CopyBuffers(drv
, dpy
, surface
, target
);
244 EGLDisplay dpy
= eglGetCurrentDisplay();
245 if (dpy
!= EGL_NO_DISPLAY
) {
246 _EGLDriver
*drv
= _eglLookupDriver(dpy
);
247 return drv
->API
.WaitGL(drv
, dpy
);
255 eglWaitNative(EGLint engine
)
257 EGLDisplay dpy
= eglGetCurrentDisplay();
258 if (dpy
!= EGL_NO_DISPLAY
) {
259 _EGLDriver
*drv
= _eglLookupDriver(dpy
);
260 return drv
->API
.WaitNative(drv
, dpy
, engine
);
268 eglGetCurrentDisplay(void)
270 _EGLDisplay
*dpy
= _eglGetCurrentDisplay();
274 return EGL_NO_DISPLAY
;
279 eglGetCurrentContext(void)
281 _EGLContext
*ctx
= _eglGetCurrentContext();
285 return EGL_NO_CONTEXT
;
290 eglGetCurrentSurface(EGLint readdraw
)
292 _EGLSurface
*s
= _eglGetCurrentSurface(readdraw
);
296 return EGL_NO_SURFACE
;
303 _EGLThreadInfo
*t
= _eglGetCurrentThread();
304 EGLint e
= t
->LastError
;
305 t
->LastError
= EGL_SUCCESS
;
310 void (* APIENTRY
eglGetProcAddress(const char *procname
))()
312 typedef void (*genericFunc
)();
313 struct name_function
{
317 static struct name_function egl_functions
[] = {
318 /* alphabetical order */
319 { "eglBindTexImage", (_EGLProc
) eglBindTexImage
},
320 { "eglChooseConfig", (_EGLProc
) eglChooseConfig
},
321 { "eglCopyBuffers", (_EGLProc
) eglCopyBuffers
},
322 { "eglCreateContext", (_EGLProc
) eglCreateContext
},
323 { "eglCreatePbufferSurface", (_EGLProc
) eglCreatePbufferSurface
},
324 { "eglCreatePixmapSurface", (_EGLProc
) eglCreatePixmapSurface
},
325 { "eglCreateWindowSurface", (_EGLProc
) eglCreateWindowSurface
},
326 { "eglDestroyContext", (_EGLProc
) eglDestroyContext
},
327 { "eglDestroySurface", (_EGLProc
) eglDestroySurface
},
328 { "eglGetConfigAttrib", (_EGLProc
) eglGetConfigAttrib
},
329 { "eglGetConfigs", (_EGLProc
) eglGetConfigs
},
330 { "eglGetCurrentContext", (_EGLProc
) eglGetCurrentContext
},
331 { "eglGetCurrentDisplay", (_EGLProc
) eglGetCurrentDisplay
},
332 { "eglGetCurrentSurface", (_EGLProc
) eglGetCurrentSurface
},
333 { "eglGetDisplay", (_EGLProc
) eglGetDisplay
},
334 { "eglGetError", (_EGLProc
) eglGetError
},
335 { "eglGetProcAddress", (_EGLProc
) eglGetProcAddress
},
336 { "eglInitialize", (_EGLProc
) eglInitialize
},
337 { "eglMakeCurrent", (_EGLProc
) eglMakeCurrent
},
338 { "eglQueryContext", (_EGLProc
) eglQueryContext
},
339 { "eglQueryString", (_EGLProc
) eglQueryString
},
340 { "eglQuerySurface", (_EGLProc
) eglQuerySurface
},
341 { "eglReleaseTexImage", (_EGLProc
) eglReleaseTexImage
},
342 { "eglSurfaceAttrib", (_EGLProc
) eglSurfaceAttrib
},
343 { "eglSwapBuffers", (_EGLProc
) eglSwapBuffers
},
344 { "eglSwapInterval", (_EGLProc
) eglSwapInterval
},
345 { "eglTerminate", (_EGLProc
) eglTerminate
},
346 { "eglWaitGL", (_EGLProc
) eglWaitGL
},
347 { "eglWaitNative", (_EGLProc
) eglWaitNative
},
349 { "eglChooseModeMESA", (_EGLProc
) eglChooseModeMESA
},
350 { "eglGetModesMESA", (_EGLProc
) eglGetModesMESA
},
351 { "eglGetModeAttribMESA", (_EGLProc
) eglGetModeAttribMESA
},
352 { "eglCopyContextMESA", (_EGLProc
) eglCopyContextMESA
},
353 { "eglGetScreensMESA", (_EGLProc
) eglGetScreensMESA
},
354 { "eglCreateScreenSurfaceMESA", (_EGLProc
) eglCreateScreenSurfaceMESA
},
355 { "eglShowScreenSurfaceMESA", (_EGLProc
) eglShowScreenSurfaceMESA
},
356 { "eglScreenPositionMESA", (_EGLProc
) eglScreenPositionMESA
},
357 { "eglQueryScreenMESA", (_EGLProc
) eglQueryScreenMESA
},
358 { "eglQueryScreenSurfaceMESA", (_EGLProc
) eglQueryScreenSurfaceMESA
},
359 { "eglQueryScreenModeMESA", (_EGLProc
) eglQueryScreenModeMESA
},
360 { "eglQueryModeStringMESA", (_EGLProc
) eglQueryModeStringMESA
},
364 for (i
= 0; egl_functions
[i
].name
; i
++) {
365 if (strcmp(egl_functions
[i
].name
, procname
) == 0) {
366 return (genericFunc
) egl_functions
[i
].function
;
370 /* XXX enable this code someday */
371 return (genericFunc
) _glapi_get_proc_address(procname
);
379 * EGL_MESA_screen extension
383 eglChooseModeMESA(EGLDisplay dpy
, EGLScreenMESA screen
,
384 const EGLint
*attrib_list
, EGLModeMESA
*modes
,
385 EGLint modes_size
, EGLint
*num_modes
)
387 _EGLDriver
*drv
= _eglLookupDriver(dpy
);
389 return drv
->API
.ChooseModeMESA(drv
, dpy
, screen
, attrib_list
, modes
, modes_size
, num_modes
);
396 eglGetModesMESA(EGLDisplay dpy
, EGLScreenMESA screen
, EGLModeMESA
*modes
, EGLint mode_size
, EGLint
*num_mode
)
398 _EGLDriver
*drv
= _eglLookupDriver(dpy
);
400 return drv
->API
.GetModesMESA(drv
, dpy
, screen
, modes
, mode_size
, num_mode
);
407 eglGetModeAttribMESA(EGLDisplay dpy
, EGLModeMESA mode
, EGLint attribute
, EGLint
*value
)
409 _EGLDriver
*drv
= _eglLookupDriver(dpy
);
411 return drv
->API
.GetModeAttribMESA(drv
, dpy
, mode
, attribute
, value
);
418 eglCopyContextMESA(EGLDisplay dpy
, EGLContext source
, EGLContext dest
, EGLint mask
)
420 _EGLDriver
*drv
= _eglLookupDriver(dpy
);
422 return drv
->API
.CopyContextMESA(drv
, dpy
, source
, dest
, mask
);
429 eglGetScreensMESA(EGLDisplay dpy
, EGLScreenMESA
*screens
, EGLint max_screens
, EGLint
*num_screens
)
431 _EGLDriver
*drv
= _eglLookupDriver(dpy
);
433 return drv
->API
.GetScreensMESA(drv
, dpy
, screens
, max_screens
, num_screens
);
440 eglCreateScreenSurfaceMESA(EGLDisplay dpy
, EGLConfig config
, const EGLint
*attrib_list
)
442 _EGLDriver
*drv
= _eglLookupDriver(dpy
);
443 return drv
->API
.CreateScreenSurfaceMESA(drv
, dpy
, config
, attrib_list
);
448 eglShowScreenSurfaceMESA(EGLDisplay dpy
, EGLint screen
, EGLSurface surface
, EGLModeMESA mode
)
450 _EGLDriver
*drv
= _eglLookupDriver(dpy
);
451 return drv
->API
.ShowScreenSurfaceMESA(drv
, dpy
, screen
, surface
, mode
);
456 eglScreenPositionMESA(EGLDisplay dpy
, EGLScreenMESA screen
, EGLint x
, EGLint y
)
458 _EGLDriver
*drv
= _eglLookupDriver(dpy
);
459 return drv
->API
.ScreenPositionMESA(drv
, dpy
, screen
, x
, y
);
464 eglQueryScreenMESA( EGLDisplay dpy
, EGLScreenMESA screen
, EGLint attribute
, EGLint
*value
)
466 _EGLDriver
*drv
= _eglLookupDriver(dpy
);
467 return drv
->API
.QueryScreenMESA(drv
, dpy
, screen
, attribute
, value
);
472 eglQueryScreenSurfaceMESA(EGLDisplay dpy
, EGLScreenMESA screen
, EGLSurface
*surface
)
474 _EGLDriver
*drv
= _eglLookupDriver(dpy
);
475 return drv
->API
.QueryScreenSurfaceMESA(drv
, dpy
, screen
, surface
);
480 eglQueryScreenModeMESA(EGLDisplay dpy
, EGLScreenMESA screen
, EGLModeMESA
*mode
)
482 _EGLDriver
*drv
= _eglLookupDriver(dpy
);
483 return drv
->API
.QueryScreenModeMESA(drv
, dpy
, screen
, mode
);
488 eglQueryModeStringMESA(EGLDisplay dpy
, EGLModeMESA mode
)
490 _EGLDriver
*drv
= _eglLookupDriver(dpy
);
491 return drv
->API
.QueryModeStringMESA(drv
, dpy
, mode
);