Re: [Mesa-dev] Mesa (master): egl: Native Display autodetection
so, export EGL_PLATFORM=drm, is still working, right? On Mon, Aug 15, 2011 at 3:47 PM, Benjamin Franzke b...@kemper.freedesktop.org wrote: Module: Mesa Branch: master Commit: 85fe9484945cb57ffd49df248b0e5057eba6af04 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=85fe9484945cb57ffd49df248b0e5057eba6af04 Author: Benjamin Franzke benjaminfran...@googlemail.com Date: Tue Aug 9 14:23:18 2011 +0200 egl: Native Display autodetection EGL doesnt define howto manage different native platforms. So mesa has a builtime configurable default platform, whith non-standard envvar (EGL_PLATFORM) overwrites. This caused unneeded bugreports, when EGL_PLATFORM was forgotten. Detection is grouped into basic types of NativeDisplays (which itself needs to be detected). The final decision is based on characteristcs of these basic types: File Desciptor based platforms (fbdev): - fstat(2) to check for being a fd that belongs to a character device - check kernel subsystem (todo) Pointer to structuctures (x11, wayland, drm/gbm): - mincore(2) to check whether its valid pointer to some memory. - magic elements (e.g. pointers to exported symbols): o wayland display stores interface type pointer (first elm.) o gbm stores pointer to its constructor (first elm.) o x11 as a fallback (FIXME?) Reviewed-by: Kristian Høgsberg k...@bitplanet.net --- configure.ac |2 + src/egl/main/Makefile | 13 ++ src/egl/main/eglapi.c |8 ++-- src/egl/main/egldisplay.c | 100 +++- src/egl/main/egldisplay.h |2 +- 5 files changed, 117 insertions(+), 8 deletions(-) diff --git a/configure.ac b/configure.ac index 1b1823a..9195da9 100644 --- a/configure.ac +++ b/configure.ac @@ -1370,6 +1370,8 @@ if test x$enable_egl = xyes; then EGL_LIB_DEPS=$DLOPEN_LIBS $SELINUX_LIBS -lpthread EGL_DRIVERS_DIRS= +AC_CHECK_FUNC(mincore, [DEFINES=$DEFINES -DHAVE_MINCORE]) + if test $enable_static != yes; then # build egl_glx when libGL is built if test x$enable_glx = xyes; then diff --git a/src/egl/main/Makefile b/src/egl/main/Makefile index 775fbbe..c100fbf 100644 --- a/src/egl/main/Makefile +++ b/src/egl/main/Makefile @@ -93,6 +93,19 @@ ifeq ($(firstword $(EGL_PLATFORMS)),fbdev) EGL_NATIVE_PLATFORM=_EGL_PLATFORM_FBDEV endif +ifneq ($(findstring x11, $(EGL_PLATFORMS)),) +LOCAL_CFLAGS += -DHAVE_X11_PLATFORM +endif +ifneq ($(findstring wayland, $(EGL_PLATFORMS)),) +LOCAL_CFLAGS += -DHAVE_WAYLAND_PLATFORM +endif +ifneq ($(findstring drm, $(EGL_PLATFORMS)),) +LOCAL_CFLAGS += -DHAVE_DRM_PLATFORM +endif +ifneq ($(findstring fbdev, $(EGL_PLATFORMS)),) +LOCAL_CFLAGS += -DHAVE_FBDEV_PLATFORM +endif + LOCAL_CFLAGS += \ -D_EGL_NATIVE_PLATFORM=$(EGL_NATIVE_PLATFORM) \ -D_EGL_DRIVER_SEARCH_DIR=\$(EGL_DRIVER_INSTALL_DIR)\ diff --git a/src/egl/main/eglapi.c b/src/egl/main/eglapi.c index 0ba7794..5d186c6 100644 --- a/src/egl/main/eglapi.c +++ b/src/egl/main/eglapi.c @@ -301,7 +301,7 @@ _eglUnlockDisplay(_EGLDisplay *dpy) EGLDisplay EGLAPIENTRY eglGetDisplay(EGLNativeDisplayType nativeDisplay) { - _EGLPlatformType plat = _eglGetNativePlatform(); + _EGLPlatformType plat = _eglGetNativePlatform(nativeDisplay); _EGLDisplay *dpy = _eglFindDisplay(plat, (void *) nativeDisplay); return _eglGetDisplayHandle(dpy); } @@ -538,7 +538,7 @@ eglCreateWindowSurface(EGLDisplay dpy, EGLConfig config, EGLSurface ret; _EGL_CHECK_CONFIG(disp, conf, EGL_NO_SURFACE, drv); - if (disp-Platform != _eglGetNativePlatform()) + if (disp-Platform != _eglGetNativePlatform(disp-PlatformDisplay)) RETURN_EGL_ERROR(disp, EGL_BAD_NATIVE_WINDOW, EGL_NO_SURFACE); surf = drv-API.CreateWindowSurface(drv, disp, conf, window, attrib_list); @@ -559,7 +559,7 @@ eglCreatePixmapSurface(EGLDisplay dpy, EGLConfig config, EGLSurface ret; _EGL_CHECK_CONFIG(disp, conf, EGL_NO_SURFACE, drv); - if (disp-Platform != _eglGetNativePlatform()) + if (disp-Platform != _eglGetNativePlatform(disp-PlatformDisplay)) RETURN_EGL_ERROR(disp, EGL_BAD_NATIVE_PIXMAP, EGL_NO_SURFACE); surf = drv-API.CreatePixmapSurface(drv, disp, conf, pixmap, attrib_list); @@ -720,7 +720,7 @@ eglCopyBuffers(EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target) EGLBoolean ret; _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv); - if (disp-Platform != _eglGetNativePlatform()) + if (disp-Platform != _eglGetNativePlatform(disp-PlatformDisplay)) RETURN_EGL_ERROR(disp, EGL_BAD_NATIVE_PIXMAP, EGL_FALSE); ret = drv-API.CopyBuffers(drv, disp, surf, target); diff --git a/src/egl/main/egldisplay.c b/src/egl/main/egldisplay.c index 60f3177..2849dd9 100644 --- a/src/egl/main/egldisplay.c +++ b/src/egl/main/egldisplay.c @@ -43,6 +43,23 @@ #include eglmutex.h #include egllog.h +/* Includes for
Re: [Mesa-dev] Mesa (master): egl: Native Display autodetection
2011/8/15 Cooper Yuan coopery...@gmail.com: so, export EGL_PLATFORM=drm, is still working, right? Yes, and has a higher priority than the autodetection. On Mon, Aug 15, 2011 at 3:47 PM, Benjamin Franzke b...@kemper.freedesktop.org wrote: Module: Mesa Branch: master Commit: 85fe9484945cb57ffd49df248b0e5057eba6af04 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=85fe9484945cb57ffd49df248b0e5057eba6af04 Author: Benjamin Franzke benjaminfran...@googlemail.com Date: Tue Aug 9 14:23:18 2011 +0200 egl: Native Display autodetection EGL doesnt define howto manage different native platforms. So mesa has a builtime configurable default platform, whith non-standard envvar (EGL_PLATFORM) overwrites. This caused unneeded bugreports, when EGL_PLATFORM was forgotten. Detection is grouped into basic types of NativeDisplays (which itself needs to be detected). The final decision is based on characteristcs of these basic types: File Desciptor based platforms (fbdev): - fstat(2) to check for being a fd that belongs to a character device - check kernel subsystem (todo) Pointer to structuctures (x11, wayland, drm/gbm): - mincore(2) to check whether its valid pointer to some memory. - magic elements (e.g. pointers to exported symbols): o wayland display stores interface type pointer (first elm.) o gbm stores pointer to its constructor (first elm.) o x11 as a fallback (FIXME?) Reviewed-by: Kristian Høgsberg k...@bitplanet.net --- configure.ac | 2 + src/egl/main/Makefile | 13 ++ src/egl/main/eglapi.c | 8 ++-- src/egl/main/egldisplay.c | 100 +++- src/egl/main/egldisplay.h | 2 +- 5 files changed, 117 insertions(+), 8 deletions(-) diff --git a/configure.ac b/configure.ac index 1b1823a..9195da9 100644 --- a/configure.ac +++ b/configure.ac @@ -1370,6 +1370,8 @@ if test x$enable_egl = xyes; then EGL_LIB_DEPS=$DLOPEN_LIBS $SELINUX_LIBS -lpthread EGL_DRIVERS_DIRS= + AC_CHECK_FUNC(mincore, [DEFINES=$DEFINES -DHAVE_MINCORE]) + if test $enable_static != yes; then # build egl_glx when libGL is built if test x$enable_glx = xyes; then diff --git a/src/egl/main/Makefile b/src/egl/main/Makefile index 775fbbe..c100fbf 100644 --- a/src/egl/main/Makefile +++ b/src/egl/main/Makefile @@ -93,6 +93,19 @@ ifeq ($(firstword $(EGL_PLATFORMS)),fbdev) EGL_NATIVE_PLATFORM=_EGL_PLATFORM_FBDEV endif +ifneq ($(findstring x11, $(EGL_PLATFORMS)),) +LOCAL_CFLAGS += -DHAVE_X11_PLATFORM +endif +ifneq ($(findstring wayland, $(EGL_PLATFORMS)),) +LOCAL_CFLAGS += -DHAVE_WAYLAND_PLATFORM +endif +ifneq ($(findstring drm, $(EGL_PLATFORMS)),) +LOCAL_CFLAGS += -DHAVE_DRM_PLATFORM +endif +ifneq ($(findstring fbdev, $(EGL_PLATFORMS)),) +LOCAL_CFLAGS += -DHAVE_FBDEV_PLATFORM +endif + LOCAL_CFLAGS += \ -D_EGL_NATIVE_PLATFORM=$(EGL_NATIVE_PLATFORM) \ -D_EGL_DRIVER_SEARCH_DIR=\$(EGL_DRIVER_INSTALL_DIR)\ diff --git a/src/egl/main/eglapi.c b/src/egl/main/eglapi.c index 0ba7794..5d186c6 100644 --- a/src/egl/main/eglapi.c +++ b/src/egl/main/eglapi.c @@ -301,7 +301,7 @@ _eglUnlockDisplay(_EGLDisplay *dpy) EGLDisplay EGLAPIENTRY eglGetDisplay(EGLNativeDisplayType nativeDisplay) { - _EGLPlatformType plat = _eglGetNativePlatform(); + _EGLPlatformType plat = _eglGetNativePlatform(nativeDisplay); _EGLDisplay *dpy = _eglFindDisplay(plat, (void *) nativeDisplay); return _eglGetDisplayHandle(dpy); } @@ -538,7 +538,7 @@ eglCreateWindowSurface(EGLDisplay dpy, EGLConfig config, EGLSurface ret; _EGL_CHECK_CONFIG(disp, conf, EGL_NO_SURFACE, drv); - if (disp-Platform != _eglGetNativePlatform()) + if (disp-Platform != _eglGetNativePlatform(disp-PlatformDisplay)) RETURN_EGL_ERROR(disp, EGL_BAD_NATIVE_WINDOW, EGL_NO_SURFACE); surf = drv-API.CreateWindowSurface(drv, disp, conf, window, attrib_list); @@ -559,7 +559,7 @@ eglCreatePixmapSurface(EGLDisplay dpy, EGLConfig config, EGLSurface ret; _EGL_CHECK_CONFIG(disp, conf, EGL_NO_SURFACE, drv); - if (disp-Platform != _eglGetNativePlatform()) + if (disp-Platform != _eglGetNativePlatform(disp-PlatformDisplay)) RETURN_EGL_ERROR(disp, EGL_BAD_NATIVE_PIXMAP, EGL_NO_SURFACE); surf = drv-API.CreatePixmapSurface(drv, disp, conf, pixmap, attrib_list); @@ -720,7 +720,7 @@ eglCopyBuffers(EGLDisplay dpy, EGLSurface surface, EGLNativePixmapType target) EGLBoolean ret; _EGL_CHECK_SURFACE(disp, surf, EGL_FALSE, drv); - if (disp-Platform != _eglGetNativePlatform()) + if (disp-Platform != _eglGetNativePlatform(disp-PlatformDisplay)) RETURN_EGL_ERROR(disp, EGL_BAD_NATIVE_PIXMAP, EGL_FALSE); ret = drv-API.CopyBuffers(drv, disp, surf, target); diff --git a/src/egl/main/egldisplay.c b/src/egl/main/egldisplay.c index 60f3177..2849dd9 100644 --- a/src/egl/main/egldisplay.c +++ b/src/egl/main/egldisplay.c @@