diff options
author | Chad Versace <[email protected]> | 2014-01-23 07:26:10 -0800 |
---|---|---|
committer | Chad Versace <[email protected]> | 2014-03-17 15:49:06 -0700 |
commit | 468cc866b4b308cee40470f06b31002c6c56da96 (patch) | |
tree | 2fef841f8c0bcd9af8aa25d7e144d5bde45a4284 /src/egl/main/eglapi.c | |
parent | 9a40ee16d0be3a08ac2f467311673f4b9333191d (diff) |
egl/main: Enable Linux platform extensions
Enable EGL_EXT_platform_base and the Linux platform extensions layered
atop it: EGL_EXT_platform_x11, EGL_EXT_platform_wayland,
and EGL_MESA_platform_gbm.
Tested with Piglit's EGL_EXT_platform_base tests under an X11 session.
To enable running the Wayland and GBM tests, windowed Weston was running
and the kernel had render nodes enabled.
I regression tested my EGL_EXT_platform_base patch set with Piglit on
Ivybridge under X11/EGL, standalone Weston, and GBM with rendernodes. No
regressions found.
Signed-off-by: Chad Versace <[email protected]>
Diffstat (limited to 'src/egl/main/eglapi.c')
-rw-r--r-- | src/egl/main/eglapi.c | 132 |
1 files changed, 110 insertions, 22 deletions
diff --git a/src/egl/main/eglapi.c b/src/egl/main/eglapi.c index 836714ce244..219d8e61715 100644 --- a/src/egl/main/eglapi.c +++ b/src/egl/main/eglapi.c @@ -308,6 +308,36 @@ eglGetDisplay(EGLNativeDisplayType nativeDisplay) return _eglGetDisplayHandle(dpy); } +EGLDisplay EGLAPIENTRY +eglGetPlatformDisplayEXT(EGLenum platform, void *native_display, + const EGLint *attrib_list) +{ + _EGLDisplay *dpy; + + switch (platform) { +#ifdef HAVE_X11_PLATFORM + case EGL_PLATFORM_X11_EXT: + dpy = _eglGetX11Display((Display*) native_display, attrib_list); + break; +#endif +#ifdef HAVE_DRM_PLATFORM + case EGL_PLATFORM_GBM_MESA: + dpy = _eglGetGbmDisplay((struct gbm_device*) native_display, + attrib_list); + break; +#endif +#ifdef HAVE_WAYLAND_PLATFORM + case EGL_PLATFORM_WAYLAND_EXT: + dpy = _eglGetWaylandDisplay((struct wl_display*) native_display, + attrib_list); + break; +#endif + default: + RETURN_EGL_ERROR(NULL, EGL_BAD_PARAMETER, NULL); + } + + return _eglGetDisplayHandle(dpy); +} /** * This is typically the second EGL function that an application calls. @@ -527,25 +557,17 @@ eglQueryContext(EGLDisplay dpy, EGLContext ctx, } -EGLSurface EGLAPIENTRY -eglCreateWindowSurface(EGLDisplay dpy, EGLConfig config, - EGLNativeWindowType window, const EGLint *attrib_list) +static EGLSurface +_eglCreateWindowSurfaceCommon(_EGLDisplay *disp, EGLConfig config, + void *native_window, const EGLint *attrib_list) { - _EGLDisplay *disp = _eglLockDisplay(dpy); _EGLConfig *conf = _eglLookupConfig(config, disp); _EGLDriver *drv; _EGLSurface *surf; EGLSurface ret; - void *native_window_ptr; - - STATIC_ASSERT(sizeof(void*) == sizeof(window)); - native_window_ptr = (void*) window; _EGL_CHECK_CONFIG(disp, conf, EGL_NO_SURFACE, drv); - if (disp->Platform != _eglGetNativePlatform(disp->PlatformDisplay)) - RETURN_EGL_ERROR(disp, EGL_BAD_NATIVE_WINDOW, EGL_NO_SURFACE); - - surf = drv->API.CreateWindowSurface(drv, disp, conf, native_window_ptr, + surf = drv->API.CreateWindowSurface(drv, disp, conf, native_window, attrib_list); ret = (surf) ? _eglLinkSurface(surf) : EGL_NO_SURFACE; @@ -554,24 +576,52 @@ eglCreateWindowSurface(EGLDisplay dpy, EGLConfig config, EGLSurface EGLAPIENTRY -eglCreatePixmapSurface(EGLDisplay dpy, EGLConfig config, - EGLNativePixmapType pixmap, const EGLint *attrib_list) +eglCreateWindowSurface(EGLDisplay dpy, EGLConfig config, + EGLNativeWindowType window, const EGLint *attrib_list) { _EGLDisplay *disp = _eglLockDisplay(dpy); + STATIC_ASSERT(sizeof(void*) == sizeof(window)); + return _eglCreateWindowSurfaceCommon(disp, config, (void*) window, + attrib_list); +} + + +EGLSurface EGLAPIENTRY +eglCreatePlatformWindowSurfaceEXT(EGLDisplay dpy, EGLConfig config, + void *native_window, + const EGLint *attrib_list) +{ + _EGLDisplay *disp = _eglLockDisplay(dpy); + +#ifdef HAVE_X11_PLATFORM + if (disp->Platform == _EGL_PLATFORM_X11 && native_window != NULL) { + /* The `native_window` parameter for the X11 platform differs between + * eglCreateWindowSurface() and eglCreatePlatformPixmapSurfaceEXT(). In + * eglCreateWindowSurface(), the type of `native_window` is an Xlib + * `Window`. In eglCreatePlatformWindowSurfaceEXT(), the type is + * `Window*`. Convert `Window*` to `Window` because that's what + * dri2_x11_create_window_surface() expects. + */ + native_window = (void*) (* (Window*) native_window); + } +#endif + + return _eglCreateWindowSurfaceCommon(disp, config, native_window, + attrib_list); +} + + +static EGLSurface +_eglCreatePixmapSurfaceCommon(_EGLDisplay *disp, EGLConfig config, + void *native_pixmap, const EGLint *attrib_list) +{ _EGLConfig *conf = _eglLookupConfig(config, disp); _EGLDriver *drv; _EGLSurface *surf; EGLSurface ret; - void *native_pixmap_ptr; - - STATIC_ASSERT(sizeof(void*) == sizeof(pixmap)); - native_pixmap_ptr = (void*) pixmap; _EGL_CHECK_CONFIG(disp, conf, EGL_NO_SURFACE, drv); - if (disp->Platform != _eglGetNativePlatform(disp->PlatformDisplay)) - RETURN_EGL_ERROR(disp, EGL_BAD_NATIVE_PIXMAP, EGL_NO_SURFACE); - - surf = drv->API.CreatePixmapSurface(drv, disp, conf, native_pixmap_ptr, + surf = drv->API.CreatePixmapSurface(drv, disp, conf, native_pixmap, attrib_list); ret = (surf) ? _eglLinkSurface(surf) : EGL_NO_SURFACE; @@ -580,6 +630,41 @@ eglCreatePixmapSurface(EGLDisplay dpy, EGLConfig config, EGLSurface EGLAPIENTRY +eglCreatePixmapSurface(EGLDisplay dpy, EGLConfig config, + EGLNativePixmapType pixmap, const EGLint *attrib_list) +{ + _EGLDisplay *disp = _eglLockDisplay(dpy); + STATIC_ASSERT(sizeof(void*) == sizeof(pixmap)); + return _eglCreatePixmapSurfaceCommon(disp, config, (void*) pixmap, + attrib_list); +} + +EGLSurface EGLAPIENTRY +eglCreatePlatformPixmapSurfaceEXT(EGLDisplay dpy, EGLConfig config, + void *native_pixmap, + const EGLint *attrib_list) +{ + _EGLDisplay *disp = _eglLockDisplay(dpy); + +#ifdef HAVE_X11_PLATFORM + /* The `native_pixmap` parameter for the X11 platform differs between + * eglCreatePixmapSurface() and eglCreatePlatformPixmapSurfaceEXT(). In + * eglCreatePixmapSurface(), the type of `native_pixmap` is an Xlib + * `Pixmap`. In eglCreatePlatformPixmapSurfaceEXT(), the type is + * `Pixmap*`. Convert `Pixmap*` to `Pixmap` because that's what + * dri2_x11_create_pixmap_surface() expects. + */ + if (disp->Platform == _EGL_PLATFORM_X11 && native_pixmap != NULL) { + native_pixmap = (void*) (* (Pixmap*) native_pixmap); + } +#endif + + return _eglCreatePixmapSurfaceCommon(disp, config, native_pixmap, + attrib_list); +} + + +EGLSurface EGLAPIENTRY eglCreatePbufferSurface(EGLDisplay dpy, EGLConfig config, const EGLint *attrib_list) { @@ -998,6 +1083,9 @@ eglGetProcAddress(const char *procname) #ifdef EGL_EXT_swap_buffers_with_damage { "eglSwapBuffersWithDamageEXT", (_EGLProc) eglSwapBuffersWithDamageEXT }, #endif + { "eglGetPlatformDisplayEXT", (_EGLProc) eglGetPlatformDisplayEXT }, + { "eglCreatePlatformWindowSurfaceEXT", (_EGLProc) eglCreatePlatformWindowSurfaceEXT }, + { "eglCreatePlatformPixmapSurfaceEXT", (_EGLProc) eglCreatePlatformPixmapSurfaceEXT }, { NULL, NULL } }; EGLint i; |