From: Sangjin Lee Date: Sat, 13 Feb 2016 00:45:21 +0000 (+0900) Subject: tdm: remove gbm X-Git-Tag: submit/tizen/20160229.101954~4 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=abf0ef8b3de0cca6311f09fea028f06968f1369f;p=platform%2Fcore%2Fuifw%2Fpepper.git tdm: remove gbm The tdm backend use tbm_surface_queue directly. Tizen EGL support tbm_bufmgr to eglNativeDisplay and tbm_surface_queue to eglNativeWindow. Change-Id: I8398b2d29d0231fc45b3594692c838358d35a74d --- diff --git a/configure.ac b/configure.ac index ef54ada..ca00dfa 100644 --- a/configure.ac +++ b/configure.ac @@ -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) diff --git a/packaging/pepper.spec b/packaging/pepper.spec index d112566..09c8bb3 100644 --- a/packaging/pepper.spec +++ b/packaging/pepper.spec @@ -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 diff --git a/src/lib/render/gl-renderer.c b/src/lib/render/gl-renderer.c index 91ed077..51b2460 100644 --- a/src/lib/render/gl-renderer.c +++ b/src/lib/render/gl-renderer.c @@ -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" @@ -39,6 +40,11 @@ #include #include +#ifdef HAVE_TBM +#include +#include +#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; } diff --git a/src/lib/tdm/tdm-common.c b/src/lib/tdm/tdm-common.c index 5220318..6f50aec 100644 --- a/src/lib/tdm/tdm-common.c +++ b/src/lib/tdm/tdm-common.c @@ -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); diff --git a/src/lib/tdm/tdm-internal.h b/src/lib/tdm/tdm-internal.h index 45bf7d1..b574ed8 100644 --- a/src/lib/tdm/tdm-internal.h +++ b/src/lib/tdm/tdm-internal.h @@ -32,9 +32,10 @@ #include #include #include -#include -#include #include +#include +#include +#include #ifdef HAVE_TBM #include #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; diff --git a/src/lib/tdm/tdm-output.c b/src/lib/tdm/tdm-output.c index 972f305..c40c640 100644 --- a/src/lib/tdm/tdm-output.c +++ b/src/lib/tdm/tdm-output.c @@ -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);