Support GL Client 68/66368/1 accepted/tizen/ivi/20160419.152329 accepted/tizen/mobile/20160419.151547 accepted/tizen/tv/20160419.151852 accepted/tizen/wearable/20160419.152040 submit/tizen/20160419.084131
authorSangjin Lee <lsj119@samsung.com>
Mon, 18 Apr 2016 11:28:53 +0000 (20:28 +0900)
committerSangjin Lee <lsj119@samsung.com>
Mon, 18 Apr 2016 11:28:53 +0000 (20:28 +0900)
Tizen GLES use wayland-tbm protocol, so the embedded compositor
should get tbm_surface_h from wl_buffer and then set native_surface to
a evas object.

Change-Id: Ie9ccd9ae9c5247ea1720fa1165dc6924c48d7e14

configure.ac
packaging/libpepper-efl.spec
src/examples/pepper_efl_simple.c
src/lib/Makefile.am
src/lib/compositor.c
src/lib/object.c
src/lib/object.h
src/lib/private.h

index cc477834ba45de86223c8ca99ef1c8b7577141d7..ba7e23983373c871ddf87039af36e5e255daf5eb 100644 (file)
@@ -16,6 +16,7 @@ AC_PROG_LIBTOOL
 PKG_CHECK_MODULES([PEPPER], [pepper xkbcommon])
 PKG_CHECK_MODULES([WAYLAND], [wayland-server xdg-shell-server tizen-extension-client])
 PKG_CHECK_MODULES([EFL], [eina ecore ecore-input evas ecore-wayland])
+PKG_CHECK_MODULES([WAYLAND_TBM], [wayland-tbm-server])
 
 
 AC_ARG_ENABLE([examples],
index 0eedfed7d94163a1a740e9db336ed2942944521a..ecca5c0e51337ca07cefc0cea38b3c6c2a274ce4 100644 (file)
@@ -15,6 +15,8 @@ BuildRequires: pkgconfig(xdg-shell-server)
 BuildRequires: pkgconfig(xkbcommon)
 BuildRequires: pkgconfig(tizen-extension-client)
 BuildRequires: pkgconfig(ecore-wayland)
+BuildRequires: pkgconfig(wayland-tbm-server)
+BuildRequires: pkgconfig(wayland-tbm-client)
 Requires: libwayland-extension-server
 
 %description
@@ -24,7 +26,7 @@ Pepper is a lightweight and flexible library for developing various types of way
 %prep
 %setup -q
 cp %{SOURCE1001} .
-                      
+
 %build
 %autogen --enable-examples
 make %{?_smp_mflags}
@@ -35,8 +37,8 @@ make %{?_smp_mflags}
 %files -n %{name}
 %manifest %{name}.manifest
 %defattr(-,root,root,-)
-%dir %{_includedir}/pepper-efl/                                                      
-%{_includedir}/pepper-efl/*.h 
+%dir %{_includedir}/pepper-efl/
+%{_includedir}/pepper-efl/*.h
 %{_libdir}/libpepper-efl.so.*
 %{_libdir}/libpepper-efl.so
 %{_libdir}/pkgconfig/libpepper-efl.pc
index 8eca2b8f1754a8bc2d0c83862b2ee77ef1319f7e..85464095687637ff1cc75fee2e6c1e3d0e199d69 100644 (file)
@@ -2,8 +2,8 @@
 #include "Pepper_Efl.h"
 #include <time.h>
 
-#define WIDTH 1920
-#define HEIGHT 1080
+#define WIDTH 720
+#define HEIGHT 1280
 
 static unsigned int seedx = 1;
 static unsigned int seedy = 43210;
index 1b83d883105a2c43a9182c086cb2d9426e569584..6552528839b0159a156f5cb83d284efb5e20e0f5 100644 (file)
@@ -1,12 +1,13 @@
 libpepper_efl_la_LTLIBRARIES = libpepper-efl.la
 libpepper_efl_ladir = $(libdir)
-libpepper_efl_la_LIBADD = @EFL_LIBS@ @WAYLAND_LIBS@ @PEPPER_LIBS@
+libpepper_efl_la_LIBADD = @EFL_LIBS@ @WAYLAND_LIBS@ @PEPPER_LIBS@ @WAYLAND_TBM_LIBS@
 libpepper_efl_la_LDFLAGS = ${LDFLAGS}
 libpepper_efl_la_CFLAGS = \
     ${CFLAGS} \
     @EFL_CFLAGS@ \
     @WAYLAND_CFLAGS@ \
     @PEPPER_CFLAGS@ \
+    @WAYLAND_TBM_CFLAGS@ \
     -I$(top_srcdir)/src
 
 libpepper_efl_la_SOURCES = \
index cf533ce4320664c3544edeaa9fa1540900e061b0..25adeec2defd3a1dac4d0d79ea80cc2ddad7e3f2 100644 (file)
@@ -196,6 +196,14 @@ pepper_efl_compositor_create(Evas_Object *win, const char *name)
         goto err_shell;
      }
 
+   comp->tbm_server = wayland_tbm_server_init(pepper_compositor_get_display(comp->pepper.comp),
+                                              NULL, -1, 0);
+   if (!comp->pepper.comp)
+     {
+        ERR("failed to create wayland_tbm_server");
+        goto err_comp;
+     }
+
    comp->input = pepper_efl_input_create(comp);
    if (!comp->input)
      {
index 31886d390f941425df380bf46067af377e5d9b83..ed7ff982e96ff15ac56b88e879aa26525fdcb218 100644 (file)
@@ -392,7 +392,6 @@ static void
 _pepper_efl_object_cb_buffer_destroy(pepper_event_listener_t *listener EINA_UNUSED, pepper_object_t *object EINA_UNUSED, uint32_t id EINA_UNUSED, void *info EINA_UNUSED, void *data)
 {
    pepper_efl_object_t *po = data;
-   void *shm_data;
 
    DBG("[OBJECT] Buffer destroy: obj %p", po->smart_obj);
 
@@ -406,6 +405,7 @@ _pepper_efl_object_cb_surface_destroy(pepper_event_listener_t *listener EINA_UNU
 
    po->es = NULL;
    po->surface = NULL;
+   po->tbm_surface = NULL;
    PE_FREE_FUNC(po->surface_destroy_listener, pepper_event_listener_remove);
 }
 
@@ -464,8 +464,9 @@ pepper_efl_object_buffer_attach(Evas_Object *obj, int *w, int *h)
 {
    pepper_efl_object_t *po;
    pepper_buffer_t *buffer;
-   struct wl_shm_buffer *shm_buffer;
+   struct wl_shm_buffer *shm_buffer = NULL;
    struct wl_resource *buf_res;
+   tbm_surface_h tbm_surface = NULL;
    int bw, bh;
 
    po = evas_object_smart_data_get(obj);
@@ -496,23 +497,39 @@ pepper_efl_object_buffer_attach(Evas_Object *obj, int *w, int *h)
                                        _pepper_efl_object_cb_buffer_destroy, po);
 
    buf_res = pepper_buffer_get_resource(buffer);
-   shm_buffer = wl_shm_buffer_get(buf_res);
-   if (!shm_buffer)
-     {
-        ERR("[OBJECT] Failed to get shm_buffer");
-        return EINA_FALSE;
-     }
 
-   po->shm_buffer = shm_buffer;
+   if ((shm_buffer = wl_shm_buffer_get(buf_res)))
+      {
+        po->shm_buffer = shm_buffer;
 
-   bw = wl_shm_buffer_get_width(shm_buffer);
-   bh = wl_shm_buffer_get_height(shm_buffer);
+        bw = wl_shm_buffer_get_width(shm_buffer);
+        bh = wl_shm_buffer_get_height(shm_buffer);
 
-   if ((po->w != bw) || (po->h != bh))
+        if ((po->w != bw) || (po->h != bh))
+          {
+             po->w = bw;
+             po->h = bh;
+             evas_object_resize(obj, bw, bh);
+          }
+     }
+   else if ((tbm_surface = wayland_tbm_server_get_surface(NULL, buf_res)))
      {
-        po->w = bw;
-        po->h = bh;
-        evas_object_resize(obj, bw, bh);
+       po->tbm_surface = tbm_surface;
+
+       bw = tbm_surface_get_width(tbm_surface);
+       bh = tbm_surface_get_height(tbm_surface);
+
+        if ((po->w != bw) || (po->h != bh))
+          {
+             po->w = bw;
+             po->h = bh;
+             evas_object_resize(obj, bw, bh);
+          }
+     }
+   else
+     {
+        ERR("[OBJECT] Failed to get buffer");
+        return EINA_FALSE;
      }
 
    // first attach
@@ -541,9 +558,24 @@ pepper_efl_object_render(Evas_Object *obj)
    DBG("[OBJECT] Render: obj %p", obj);
 
    // FIXME: just mark dirty here, and set the data in pixels_get callback.
-   evas_object_image_size_set(po->img, po->w, po->h);
-   evas_object_image_data_set(po->img, wl_shm_buffer_get_data(po->shm_buffer));
-   evas_object_image_data_update_add(po->img, 0, 0, po->w, po->h);
+   if (po->shm_buffer)
+     {
+        evas_object_image_size_set(po->img, po->w, po->h);
+        evas_object_image_data_set(po->img, wl_shm_buffer_get_data(po->shm_buffer));
+        evas_object_image_data_update_add(po->img, 0, 0, po->w, po->h);
+     }
+   else if(po->tbm_surface)
+     {
+        Evas_Native_Surface ns;
+
+        ns.version = EVAS_NATIVE_SURFACE_VERSION;
+        ns.type = EVAS_NATIVE_SURFACE_TBM;
+        ns.data.tbm.buffer = po->tbm_surface;
+
+        evas_object_image_size_set(po->img, po->w, po->h);
+        evas_object_image_native_surface_set(po->img, &ns);
+        evas_object_image_data_update_add(po->img, 0, 0, po->w, po->h);
+     }
 }
 
 pid_t
index 3394752ee85627edc072a8c5a99823a679b6ca64..742476791d2772892068a38bc36cea33ebc818fc 100644 (file)
@@ -18,6 +18,7 @@ struct pepper_efl_object
    pepper_event_listener_t *surface_destroy_listener;
 
    struct wl_shm_buffer *shm_buffer;
+   tbm_surface_h tbm_surface;
    int x, y, w, h;
 
    struct
index 3e7fe6a11b833b16c35145980dade7c256844635..b4ca9cf903b6162bbb16746a70b1b4c57cb24aa2 100644 (file)
@@ -6,6 +6,7 @@
 
 #include <pepper.h>
 #include <wayland-server.h>
+#include <wayland-tbm-server.h>
 
 typedef struct pepper_efl_comp pepper_efl_comp_t;
 typedef struct pepper_efl_output pepper_efl_output_t;
@@ -38,6 +39,8 @@ struct pepper_efl_comp
       struct wl_display *disp;
       struct wl_event_loop *loop;
    } wl;
+
+   struct wayland_tbm_server *tbm_server;
 };
 
 #define DEBUG