Tizen platform (actually WL_TBM protocol) internally processes similiar actions
such as mesa's BindWaylandDisplayWL/UnbindWaylandDisplayWL/QueryWaylandBufferWL.
So the platform_tizen.c needs to implemment BindWaylandDisplayWL,
UnbindWaylandDisplayWL and QueryWaylandBufferWL apart from mesa's.

  - tizen's enlightenment wayland display server calls wayland_tbm_server_init()
    which processes described tasks.

  - section TPL-EGL and Wayland Server and Client
    from https://wiki.tizen.org/3.0_Porting_Guide/Graphics_and_UI/OpenGL

    "Tizen uses the wl_tbm protocol instead of wl_drm. The wl_tbm protocol is
     born for sharing the buffer(tbm_surface) between the wayland_client and
     wayland_server. Although the wayland_tbm_server_init and 
wayland_tbm_client_init
     pair is a role for the eglBindWaylandDisplayWL, the EGL driver is required
     to implement the entrypoints for the eglBindWaylandDisplayWL and
     eglUnbindWaylandDisplayWL as dummy."

v2: Fixes from Emil's review:
   a) Remove unneeded compiler pragma
   b) Add and use get_texture_format() helper
   c) Add switch's default case on tizen_query_wayland_buffer_wl()

referenced materials:
[1] https://wiki.tizen.org/3.0_Porting_Guide/Graphics_and_UI/OpenGL
[2] repository: git://git.tizen.org/platform/core/uifw/wayland-tbm (branch: 
tizen)

Signed-off-by: Mun Gwan-gyeong <elong...@gmail.com>
---
 src/egl/drivers/dri2/platform_tizen.c | 92 +++++++++++++++++++++++++++++++++++
 1 file changed, 92 insertions(+)

diff --git a/src/egl/drivers/dri2/platform_tizen.c 
b/src/egl/drivers/dri2/platform_tizen.c
index addb7c8862..1b3b105fa3 100644
--- a/src/egl/drivers/dri2/platform_tizen.c
+++ b/src/egl/drivers/dri2/platform_tizen.c
@@ -64,6 +64,21 @@ static int get_format_bpp(tbm_format format)
    }
 }
 
+static EGLBoolean get_texture_format(tbm_format format, EGLint *value)
+{
+   switch (format) {
+   case TBM_FORMAT_ARGB8888:
+      *value = EGL_TEXTURE_RGBA;
+      return EGL_TRUE;
+   case TBM_FORMAT_XRGB8888:
+   case TBM_FORMAT_RGB565:
+      *value = EGL_TEXTURE_RGB;
+      return EGL_TRUE;
+   default:
+      return EGL_FALSE;
+   }
+}
+
 static int get_stride(tbm_surface_h tbm_surface)
 {
    tbm_surface_info_s surf_info;
@@ -734,6 +749,78 @@ static const __DRIextension 
*tizen_swrast_loader_extensions[] = {
    NULL,
 };
 
+static EGLBoolean
+tizen_bind_wayland_display_wl(_EGLDriver *drv, _EGLDisplay *disp,
+                              struct wl_display *wl_dpy)
+{
+   struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
+
+   (void) drv;
+   (void) wl_dpy;
+
+   if (!dri2_dpy->tpl_display)
+      return EGL_FALSE;
+
+   if (!tpl_display_get_native_handle(dri2_dpy->tpl_display))
+      return EGL_FALSE;
+
+   return EGL_TRUE;
+}
+
+static EGLBoolean
+tizen_unbind_wayland_display_wl(_EGLDriver *drv, _EGLDisplay *disp,
+                                struct wl_display *wl_dpy)
+{
+   struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
+
+   (void) drv;
+   (void) wl_dpy;
+
+   if (!dri2_dpy->tpl_display)
+      return EGL_FALSE;
+
+   if (!tpl_display_get_native_handle(dri2_dpy->tpl_display))
+      return EGL_FALSE;
+
+   return EGL_TRUE;
+}
+
+static EGLBoolean
+tizen_query_wayland_buffer_wl(_EGLDriver *drv, _EGLDisplay *disp,
+                              struct wl_resource *buffer_resource,
+                              EGLint attribute, EGLint *value)
+{
+   struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
+   tbm_format tbm_format = 0;
+   int width = 0, height = 0;
+   tpl_result_t res;
+
+   if (!dri2_dpy->tpl_display)
+      return EGL_FALSE;
+
+   if (!tpl_display_get_native_handle(dri2_dpy->tpl_display))
+      return EGL_FALSE;
+
+   res = tpl_display_get_native_pixmap_info(dri2_dpy->tpl_display,
+                                            (tpl_handle_t)buffer_resource,
+                                            &width, &height, &tbm_format);
+   if (res != TPL_ERROR_NONE)
+      return EGL_FALSE;
+
+   switch (attribute) {
+   case EGL_TEXTURE_FORMAT:
+      return get_texture_format(tbm_format, value);
+   case EGL_WIDTH:
+      *value = width;
+      return EGL_TRUE;
+   case EGL_HEIGHT:
+      *value = height;
+      return EGL_TRUE;
+   default:
+      return EGL_FALSE;
+   }
+}
+
 EGLBoolean
 dri2_initialize_tizen(_EGLDriver *drv, _EGLDisplay *dpy)
 {
@@ -864,6 +951,11 @@ dri2_initialize_tizen(_EGLDriver *drv, _EGLDisplay *dpy)
 
    dpy->Extensions.EXT_buffer_age = EGL_TRUE;
    dpy->Extensions.EXT_swap_buffers_with_damage = EGL_TRUE;
+   dpy->Extensions.WL_bind_wayland_display = EGL_TRUE;
+
+   drv->API.BindWaylandDisplayWL = tizen_bind_wayland_display_wl;
+   drv->API.UnbindWaylandDisplayWL = tizen_unbind_wayland_display_wl;
+   drv->API.QueryWaylandBufferWL = tizen_query_wayland_buffer_wl;
 
    return EGL_TRUE;
 
-- 
2.14.2

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

Reply via email to