Re: [Mesa-dev] Mesa (master): egl: Native Display autodetection

2011-08-15 Thread Cooper Yuan
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-08-15 Thread Benjamin Franzke
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
 @@