tdm: remove gbm 52/59352/2
authorSangjin Lee <lsj119@samsung.com>
Sat, 13 Feb 2016 00:45:21 +0000 (09:45 +0900)
committerSangjin Lee <lsj119@samsung.com>
Mon, 15 Feb 2016 06:35:39 +0000 (22:35 -0800)
The tdm backend use tbm_surface_queue directly.
Tizen EGL support tbm_bufmgr to eglNativeDisplay and tbm_surface_queue to eglNativeWindow.

Change-Id: I8398b2d29d0231fc45b3594692c838358d35a74d

configure.ac
packaging/pepper.spec
src/lib/render/gl-renderer.c
src/lib/tdm/tdm-common.c
src/lib/tdm/tdm-internal.h
src/lib/tdm/tdm-output.c

index ef54ada..ca00dfa 100644 (file)
@@ -129,16 +129,16 @@ AC_ARG_ENABLE(tdm,
 AM_CONDITIONAL(ENABLE_TDM, test x$enable_tdm = xyes)
 
 if test x$enable_tdm = xyes; then
-       PEPPER_TDM_REQUIRES="gbm libtbm libtdm"
+       PEPPER_TDM_REQUIRES="libtbm libtdm"
        PKG_CHECK_MODULES(PEPPER_TDM, [$PEPPER_TDM_REQUIRES])
        PEPPER_TDM_REQUIRES="$PEPPER_TDM_REQUIRES pepper pepper-render pepper-libinput"
 
        PEPPER_TDM_DIR="-I\$(top_srcdir)/src/lib/tdm"
        PEPPER_TDM_LIB="\$(top_srcdir)/src/lib/tdm/libpepper-tdm.la"
 
-       PEPPER_TDM_CFLAGS="$PEPPER_DIR $PEPPER_RENDER_DIR $PEPPER_LIBINPUT_DIR $PEPPER_TDM_CFLAGS $TBM_CFLAGS"
-       PEPPER_TDM_CFLAGS="$PEPPER_DRM_CFLAGS $PEPPER_CFLAGS"
-       PEPPER_TDM_LIBS="$PEPPER_LIB $PEPPER_RENDER_LIB $PEPPER_LIBINPUT_LIB $PEPPER_TDM_LIBS $TBM_LIBS"
+       PEPPER_TDM_CFLAGS="$PEPPER_DIR $PEPPER_RENDER_DIR $PEPPER_LIBINPUT_DIR $PEPPER_TDM_CFLAGS"
+       PEPPER_TDM_CFLAGS="$PEPPER_TDM_CFLAGS $PEPPER_CFLAGS"
+       PEPPER_TDM_LIBS="$PEPPER_LIB $PEPPER_RENDER_LIB $PEPPER_LIBINPUT_LIB $PEPPER_TDM_LIBS"
 
        AC_SUBST(PEPPER_TDM_CFLAGS)
        AC_SUBST(PEPPER_TDM_LIBS)
index d112566..09c8bb3 100644 (file)
@@ -7,7 +7,7 @@ Group:          Graphics & UI Framework/Wayland Window System
 
 Source:                %{name}-%{version}.tar.xz
 
-%define ENABLE_TDM     0
+%define ENABLE_TDM     1
 
 BuildRequires: autoconf > 2.64
 BuildRequires: automake >= 1.11
index 91ed077..51b2460 100644 (file)
@@ -25,6 +25,7 @@
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 * DEALINGS IN THE SOFTWARE.
 */
+#include "config.h"
 
 #include "pepper-gl-renderer.h"
 #include "pepper-render-internal.h"
 #include <stdio.h>
 #include <float.h>
 
+#ifdef HAVE_TBM
+#include <tbm_surface.h>
+#include <wayland-tbm-server.h>
+#endif
+
 typedef struct gl_renderer      gl_renderer_t;
 typedef struct gl_shader        gl_shader_t;
 typedef struct gl_surface_state gl_surface_state_t;
@@ -64,6 +70,9 @@ typedef EGLSurface  (*PFNEGLCREATEPLATFORMWINDOWSURFACEEXTPROC)(EGLDisplay
 #ifndef EGL_PLATFORM_WAYLAND_KHR
 #define EGL_PLATFORM_WAYLAND_KHR    0x31d8
 #endif
+#ifndef EGL_PLATFORM_TBM_EXT
+#define EGL_PLATFORM_TBM_EXT        0x31d9
+#endif
 
 #define NUM_MAX_PLANES  3
 
@@ -205,6 +214,7 @@ enum buffer_type
     BUFFER_TYPE_NONE,
     BUFFER_TYPE_SHM,
     BUFFER_TYPE_EGL,
+    BUFFER_TYPE_TBM
 };
 
 #define MAX_BUFFER_COUNT    3
@@ -298,6 +308,9 @@ struct gl_surface_state
         GLenum                  pixel_format;
         int                     pitch;
     } shm;
+
+    /*TBM buffer type*/
+    tbm_surface_h       tbm_surface;
 };
 
 static pepper_bool_t
@@ -593,6 +606,25 @@ surface_state_attach_shm(gl_surface_state_t *state, pepper_buffer_t *buffer)
     return PEPPER_TRUE;
 }
 
+#ifdef HAVE_TBM
+static pepper_bool_t
+surface_state_attach_tbm(gl_surface_state_t *state, pepper_buffer_t *buffer)
+{
+    tbm_surface_h   tbm_surface = wayland_tbm_server_get_surface(NULL, pepper_buffer_get_resource(buffer));
+
+    if (!tbm_surface)
+        return PEPPER_FALSE;
+
+    state->tbm_surface      = tbm_surface;
+    state->buffer_width     = tbm_surface_get_width(tbm_surface);
+    state->buffer_height    = tbm_surface_get_height(tbm_surface);
+    state->y_inverted       = 1;
+    state->buffer_type      = BUFFER_TYPE_TBM;
+
+    return PEPPER_TRUE;;
+}
+#endif
+
 static pepper_bool_t
 surface_state_attach_egl(gl_surface_state_t *state, pepper_buffer_t *buffer)
 {
@@ -629,6 +661,11 @@ gl_renderer_attach_surface(pepper_renderer_t *renderer, pepper_surface_t *surfac
     if (surface_state_attach_shm(state, buffer))
         goto done;
 
+#ifdef HAVE_TBM
+    if (surface_state_attach_tbm(state, buffer))
+        goto done;
+#endif
+
     if (surface_state_attach_egl(state, buffer))
         goto done;
 
@@ -717,6 +754,55 @@ surface_state_flush_egl(gl_surface_state_t *state)
     return PEPPER_TRUE;
 }
 
+#ifdef HAVE_TBM
+static pepper_bool_t
+surface_state_flush_tbm(gl_surface_state_t *state)
+{
+    gl_renderer_t      *gr = (gl_renderer_t *)state->renderer;
+    EGLDisplay          display = gr->display;
+    tbm_surface_h       tbm_surface = wayland_tbm_server_get_surface(NULL, pepper_buffer_get_resource(state->buffer));
+    int                 sampler;
+
+       const EGLint image_attribs[] =
+       {
+               EGL_IMAGE_PRESERVED_KHR, EGL_TRUE,
+               EGL_NONE
+       };
+
+    if (!tbm_surface)
+        return PEPPER_FALSE;
+
+    switch (tbm_surface_get_format(tbm_surface))
+    {
+        case TBM_FORMAT_XRGB8888:
+            sampler = GL_SHADER_SAMPLER_RGBX;
+            break;
+        case TBM_FORMAT_ARGB8888:
+            sampler = GL_SHADER_SAMPLER_RGBA;
+            break;
+        case TBM_FORMAT_RGB565:
+            sampler = GL_SHADER_SAMPLER_RGBA;
+            break;
+        default:
+            PEPPER_ERROR("Unknown shm buffer format.\n");
+            return PEPPER_FALSE;
+    }
+
+    surface_state_ensure_textures(state, 1);
+    state->images[0] = gr->create_image(display, NULL, EGL_NATIVE_SURFACE_TIZEN,
+                                        state->tbm_surface, image_attribs);
+    PEPPER_ASSERT(state->images[0] != EGL_NO_IMAGE_KHR);
+
+    glActiveTexture(GL_TEXTURE0 + 0);
+    glBindTexture(GL_TEXTURE_2D, state->textures[0]);
+    gr->image_target_texture_2d(GL_TEXTURE_2D, state->images[0]);
+
+    state->sampler = sampler;
+
+    return PEPPER_TRUE;
+}
+#endif
+
 static pepper_bool_t
 surface_state_flush_shm(gl_surface_state_t *state)
 {
@@ -785,6 +871,10 @@ gl_renderer_flush_surface_damage(pepper_renderer_t *renderer, pepper_surface_t *
 
     if (state->buffer_type == BUFFER_TYPE_SHM)
         return surface_state_flush_shm(state);
+#ifdef HAVE_TBM
+    else if(state->buffer_type == BUFFER_TYPE_TBM)
+        return surface_state_flush_tbm(state);
+#endif
     else
         return surface_state_flush_egl(state);
 }
@@ -1541,6 +1631,8 @@ get_egl_platform(const char *str)
     if (!strcmp(str, "x11"))
         return EGL_PLATFORM_X11_KHR;
 
+    if (!strcmp(str, "tbm"))
+        return EGL_PLATFORM_TBM_EXT;
     return EGL_NONE;
 }
 
index 5220318..6f50aec 100644 (file)
@@ -58,8 +58,8 @@ pepper_tdm_create(pepper_compositor_t *compositor)
     ret = tdm_display_get_fd(tdm->disp, &tdm->fd);
     PEPPER_CHECK(ret == TDM_ERROR_NONE, goto error, "tdm_display_get_fd() failed %d\n", ret);
 
-    tdm->gbm_device = gbm_create_device(tdm->fd);
-    PEPPER_CHECK(tdm->gbm_device, goto error, "gbm_create_device() failed \n");
+    tdm->bufmgr = tbm_bufmgr_init(tdm->fd);
+    PEPPER_CHECK(tdm->bufmgr, goto error, "tbm_bufmgr_init() failed \n");
 
 #ifdef HAVE_TBM
     /* Create wayland-tbm
@@ -101,8 +101,8 @@ pepper_tdm_destroy(pepper_tdm_t *tdm)
     if (tdm->wl_tbm_server)
         wayland_tbm_server_deinit(tdm->wl_tbm_server);
 
-    if (tdm->gbm_device)
-        gbm_device_destroy(tdm->gbm_device);
+    if (tdm->bufmgr)
+        tbm_bufmgr_deinit(tdm->bufmgr);
 
     if (tdm->disp)
         tdm_display_deinit(tdm->disp);
index 45bf7d1..b574ed8 100644 (file)
 #include <unistd.h>
 #include <config.h>
 #include <pixman.h>
-#include <gbm.h>
-#include <gbm/gbm_tbm.h>
 #include <tdm.h>
+#include <tbm_bufmgr.h>
+#include <tbm_surface.h>
+#include <tbm_surface_queue.h>
 #ifdef HAVE_TBM
 #include <wayland-tbm-server.h>
 #endif
@@ -57,11 +58,11 @@ struct pepper_tdm
 {
     pepper_compositor_t        *compositor;
     tdm_display                *disp;
+    tbm_bufmgr                  bufmgr;
     int                         fd;
 
     pepper_list_t               output_list;
 
-    struct gbm_device          *gbm_device;
     struct wayland_tbm_server  *wl_tbm_server;
     struct wl_event_source     *tdm_event_source;
 
@@ -76,7 +77,6 @@ struct pepper_tdm_output
     pepper_tdm_output_t    *output;
     pepper_tdm_plane_t     *primary_plane;
 
-    struct gbm_surface     *gbm_surface;
     tbm_surface_queue_h     tbm_surface_queue;
 
     tdm_render_type_t       render_type;
index 972f305..c40c640 100644 (file)
@@ -129,12 +129,11 @@ __tdm_renderer_pixman_fini(pepper_tdm_output_t *output)
     if (output->render_target)
         pepper_render_target_destroy(output->render_target);
 
-    if (output->gbm_surface)
-        gbm_surface_destroy(output->gbm_surface);
+    if (output->tbm_surface_queue)
+        tbm_surface_queue_destroy(output->tbm_surface_queue);
 
     output->renderer = NULL;
     output->render_target = NULL;
-    output->gbm_surface = NULL;
     output->tbm_surface_queue = NULL;
 }
 
@@ -153,13 +152,10 @@ __tdm_renderer_pixman_init(pepper_tdm_output_t *output)
     output->renderer = tdm->pixman_renderer;
 
     tdm_output_get_mode(output->output, &mode);
-    output->gbm_surface = gbm_surface_create(tdm->gbm_device,
-                                                mode->width, mode->height, GBM_FORMAT_XRGB8888,
-                                                GBM_BO_USE_SCANOUT | GBM_BO_USE_RENDERING);
-    PEPPER_CHECK(output->gbm_surface, goto error, "gbm_surface_create() failed.\n");
-
-    output->tbm_surface_queue = gbm_tbm_get_surface_queue(output->gbm_surface);
-    PEPPER_CHECK(output->tbm_surface_queue, goto error, "gbm_tbm_get_surface_queue() failed.\n");
+    output->tbm_surface_queue = tbm_surface_queue_create(3,
+                                        mode->width, mode->height,
+                                        TBM_FORMAT_XBGR8888, TBM_BO_SCANOUT);
+    PEPPER_CHECK(output->tbm_surface_queue, goto error, "tbm_surface_queue_create() failed.\n");
 
     pixman_region32_init(&output->previous_damage);
     output->render_type = TDM_RENDER_TYPE_PIXMAN;
@@ -195,12 +191,11 @@ __tdm_renderer_gl_fini(pepper_tdm_output_t *output)
     if (output->render_target)
         pepper_render_target_destroy(output->render_target);
 
-    if (output->gbm_surface)
-        gbm_surface_destroy(output->gbm_surface);
+    if (output->tbm_surface_queue)
+        tbm_surface_queue_destroy(output->tbm_surface_queue);
 
     output->renderer = NULL;
     output->render_target = NULL;
-    output->gbm_surface = NULL;
     output->tbm_surface_queue = NULL;
 }
 
@@ -209,27 +204,25 @@ __tdm_renderer_gl_init(pepper_tdm_output_t *output)
 {
     pepper_tdm_t    *tdm = output->tdm;
     const tdm_output_mode *mode;
-    uint32_t        native_visual_id = GBM_FORMAT_XRGB8888;
+    uint32_t        native_visual_id = TBM_FORMAT_XRGB8888;
 
     if (!tdm->gl_renderer)
     {
-        tdm->gl_renderer = pepper_gl_renderer_create(tdm->compositor, tdm->gbm_device, "gbm");
+        tdm->gl_renderer = pepper_gl_renderer_create(tdm->compositor, tdm->bufmgr, "tbm");
         PEPPER_CHECK(tdm->gl_renderer, return, "pepper_gl_renderer_create() failed.\n");
     }
 
     output->renderer = tdm->gl_renderer;
 
     tdm_output_get_mode(output->output, &mode);
-    output->gbm_surface = gbm_surface_create(tdm->gbm_device,
-                                                mode->width, mode->height, GBM_FORMAT_XRGB8888,
-                                                GBM_BO_USE_SCANOUT | GBM_BO_USE_RENDERING);
-    PEPPER_CHECK(output->gbm_surface, goto error, "gbm_surface_create() failed.\n");
-
-    output->tbm_surface_queue = gbm_tbm_get_surface_queue(output->gbm_surface);
-    PEPPER_CHECK(output->tbm_surface_queue, goto error, "gbm_tbm_get_surface_queue() failed.\n");
+    output->tbm_surface_queue = tbm_surface_queue_create(3,
+                                        mode->width, mode->height,
+                                        TBM_FORMAT_XRGB8888,
+                                        TBM_BO_SCANOUT);
+    PEPPER_CHECK(output->tbm_surface_queue, goto error, "tbm_surface_queue_create() failed.\n");
 
     output->render_target = pepper_gl_renderer_create_target(tdm->gl_renderer,
-                                                 output->gbm_surface,
+                                                 output->tbm_surface_queue,
                                                  PEPPER_FORMAT_XRGB8888,
                                                  &native_visual_id,
                                                  mode->width, mode->height);