It adds a _EGL_PLATFORM_TIZEN enum value to _EGLPlatformType for tizen platform.

It adds a detecting routine of tizen platform to 
_eglNativePlatformDetectNativeDisplay()
and _eglGetNativePlatform().

  - As tizen platform internally distinguishes native displays of tbm, drm/gbm
    and wayland client, when EGL_PLATFORM_WAYLAND_EXT or EGL_PLATFORM_GBM_MESA
    come from eglGetPlatformDisplayEXT(), it have call _eglGetTizenDisplay().

    Tizen supports various display protocols (tbm / gbm / wayland-egl) and each
    implementation is different from mesa's. Because of tizen specific 
scanout-buffer
    management for hardware overlay compositing and optimization. And also tizen
    has its own gbm implementation for tizen specific implementation.
    (gbm_create_device function pointer is differ from mesa's implementation.)

    Therefore tizen provides libtpl-egl(Tizen Porting Layer for EGL) which is
    an abstraction layer for the surface and buffer management on Tizen platform
    aimed to implement the EGL porting layer of the OpenGLES driver over the
    various display protocols.
    As the libtpl-egl detects native display, if mesa send native display to
    the libtpl-egl then it  distinguishes tbm/gbm/wayland-egl native display
    and loads appropriate backend.

  - If tizen platform is enabled at the configuration, _eglGetNativePlatform()
    always detects _EGL_PLATFORM_TIZEN as a detected_platform.

v2:
 - Fixes from Emil's review:
   a) Add commit messages in detail for a needing of a separated tizen backend.
   b) Remove unneeded ifndef blocks.
   c) Add comments in detail.
   d) Remove an wrong detection routine on _eglGetNativePlatform()

 - Add a detection routine of Tizen platform on _eglGetNativePlatformFromEnv()

Signed-off-by: Mun Gwan-gyeong <elong...@gmail.com>
---
 src/egl/main/eglapi.c     | 13 +++++++++++++
 src/egl/main/egldisplay.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++
 src/egl/main/egldisplay.h |  7 +++++++
 3 files changed, 66 insertions(+)

diff --git a/src/egl/main/eglapi.c b/src/egl/main/eglapi.c
index 215332f99c..75790477e2 100644
--- a/src/egl/main/eglapi.c
+++ b/src/egl/main/eglapi.c
@@ -402,6 +402,19 @@ _eglGetPlatformDisplayCommon(EGLenum platform, void 
*native_display,
    case EGL_PLATFORM_SURFACELESS_MESA:
       dpy = _eglGetSurfacelessDisplay(native_display, attrib_list);
       break;
+#endif
+#ifdef HAVE_TIZEN_PLATFORM
+/* Tizen supports various display protocols (tbm / gbm / wayland-egl) and
+ * each implementation is different from mesa's.
+ * (Tizen has its own gbm implementation for tizen specific implementation.)
+ *  Therefore, when Tizen platform is enabled, it has call 
_eglGetTizenDisplay().
+ */
+    case EGL_PLATFORM_GBM_MESA:
+       dpy = _eglGetTizenDisplay(native_display, attrib_list);
+       break;
+    case EGL_PLATFORM_WAYLAND_EXT:
+       dpy = _eglGetTizenDisplay(native_display, attrib_list);
+       break;
 #endif
    default:
       RETURN_EGL_ERROR(NULL, EGL_BAD_PARAMETER, NULL);
diff --git a/src/egl/main/egldisplay.c b/src/egl/main/egldisplay.c
index 690728d2f7..43e2d73e73 100644
--- a/src/egl/main/egldisplay.c
+++ b/src/egl/main/egldisplay.c
@@ -70,6 +70,7 @@ static const struct {
    { _EGL_PLATFORM_ANDROID, "android" },
    { _EGL_PLATFORM_HAIKU, "haiku" },
    { _EGL_PLATFORM_SURFACELESS, "surfaceless" },
+   { _EGL_PLATFORM_TIZEN, "tizen" },
 };
 
 
@@ -92,7 +93,20 @@ _eglGetNativePlatformFromEnv(void)
 
    for (i = 0; i < _EGL_NUM_PLATFORMS; i++) {
       if (strcmp(egl_platforms[i].name, plat_name) == 0) {
+#ifdef HAVE_TIZEN_PLATFORM
+         /* Some widget library (ex. efl) can set EGL_DISPLAY environment
+          * variable as wayland or drm. But when TIZEN platform is enabled,
+          * we should ignore this variable in mesa. Becasue libtpl-egl detects
+          * this enviromnet variable and loads appropriate backend for that.
+          */
+         if ((egl_platforms[i].platform == _EGL_PLATFORM_WAYLAND) ||
+             (egl_platforms[i].platform == _EGL_PLATFORM_DRM))
+            plat = _EGL_PLATFORM_TIZEN;
+         else
+            plat = egl_platforms[i].platform;
+#else
          plat = egl_platforms[i].platform;
+#endif
          break;
       }
    }
@@ -115,6 +129,23 @@ _eglNativePlatformDetectNativeDisplay(void *nativeDisplay)
 
       (void) first_pointer; /* silence unused var warning */
 
+#ifdef HAVE_TIZEN_PLATFORM
+      /* Tizen supports various display protocols (tbm / gbm / wayland-egl)
+       * and each implementation is different from mesa's. Because of tizen
+       * specific scanout-buffer management for hardware overlay compositing
+       * and optimization. And also tizen has its own gbm implementation for
+       * tizen specific implementation. (gbm_create_device function pointer
+       * is differ from mesa's implementation.)
+       * Therefore tizen provides libtpl-egl(Tizen Porting Layer for EGL) which
+       * is an abstraction layer for the surface and buffer management on Tizen
+       * platform aimed to implement the EGL porting layer of the OpenGLES 
driver
+       * over the various display protocols. As the libtpl-egl detects native
+       * display, if mesa send native display to libtpl-egl then it 
distinguishes
+       * tbm / gbm / wayland-egl native display and loads appropriate backend.
+       */
+      return _EGL_PLATFORM_TIZEN;
+#endif
+
 #ifdef HAVE_WAYLAND_PLATFORM
       /* wl_display is a wl_proxy, which is a wl_object.
        * wl_object's first element points to the interfacetype. */
@@ -541,3 +572,18 @@ _eglGetSurfacelessDisplay(void *native_display,
    return _eglFindDisplay(_EGL_PLATFORM_SURFACELESS, native_display);
 }
 #endif /* HAVE_SURFACELESS_PLATFORM */
+
+#ifdef HAVE_TIZEN_PLATFORM
+_EGLDisplay*
+_eglGetTizenDisplay(void *native_display,
+                    const EGLint *attrib_list)
+{
+   /* EGL_EXT_platform_wayland recognizes no attributes. */
+   if (attrib_list != NULL && attrib_list[0] != EGL_NONE) {
+      _eglError(EGL_BAD_ATTRIBUTE, "eglGetPlatformDisplay");
+      return NULL;
+   }
+
+   return _eglFindDisplay(_EGL_PLATFORM_TIZEN, native_display);
+}
+#endif /* HAVE_TIZEN_PLATFORM */
diff --git a/src/egl/main/egldisplay.h b/src/egl/main/egldisplay.h
index 952bfe53f0..869c6601a1 100644
--- a/src/egl/main/egldisplay.h
+++ b/src/egl/main/egldisplay.h
@@ -50,6 +50,7 @@ enum _egl_platform_type {
    _EGL_PLATFORM_ANDROID,
    _EGL_PLATFORM_HAIKU,
    _EGL_PLATFORM_SURFACELESS,
+   _EGL_PLATFORM_TIZEN,
 
    _EGL_NUM_PLATFORMS,
    _EGL_INVALID_PLATFORM = -1
@@ -289,6 +290,12 @@ _eglGetSurfacelessDisplay(void *native_display,
                           const EGLint *attrib_list);
 #endif
 
+#ifdef HAVE_TIZEN_PLATFORM
+_EGLDisplay*
+_eglGetTizenDisplay(void *native_display,
+                    const EGLint *attrib_list);
+#endif
+
 #ifdef __cplusplus
 }
 #endif
-- 
2.14.2

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to