From 5e2399aa47e91acab796802483fa4cd02599f2da Mon Sep 17 00:00:00 2001 From: Changyeon Lee Date: Wed, 2 Mar 2016 15:12:35 +0900 Subject: [PATCH 01/16] Don't use tbm_surface_get_num_bos Change-Id: I457641fbd9b8495a7177ae1bf6b974b6fe7ca845 --- src/tbm_bufmgr_exynos.c | 90 ++----------------------------------------------- 1 file changed, 2 insertions(+), 88 deletions(-) diff --git a/src/tbm_bufmgr_exynos.c b/src/tbm_bufmgr_exynos.c index 71d25c2..c4f1de1 100644 --- a/src/tbm_bufmgr_exynos.c +++ b/src/tbm_bufmgr_exynos.c @@ -1833,92 +1833,6 @@ tbm_exynos_surface_get_plane_data(tbm_surface_h surface, int width, int height, } int -tbm_exynos_surface_get_num_bos(tbm_format format) -{ - int num = 0; - - switch (format) { - /* 16 bpp RGB */ - case TBM_FORMAT_XRGB4444: - case TBM_FORMAT_XBGR4444: - case TBM_FORMAT_RGBX4444: - case TBM_FORMAT_BGRX4444: - case TBM_FORMAT_ARGB4444: - case TBM_FORMAT_ABGR4444: - case TBM_FORMAT_RGBA4444: - case TBM_FORMAT_BGRA4444: - case TBM_FORMAT_XRGB1555: - case TBM_FORMAT_XBGR1555: - case TBM_FORMAT_RGBX5551: - case TBM_FORMAT_BGRX5551: - case TBM_FORMAT_ARGB1555: - case TBM_FORMAT_ABGR1555: - case TBM_FORMAT_RGBA5551: - case TBM_FORMAT_BGRA5551: - case TBM_FORMAT_RGB565: - /* 24 bpp RGB */ - case TBM_FORMAT_RGB888: - case TBM_FORMAT_BGR888: - /* 32 bpp RGB */ - case TBM_FORMAT_XRGB8888: - case TBM_FORMAT_XBGR8888: - case TBM_FORMAT_RGBX8888: - case TBM_FORMAT_BGRX8888: - case TBM_FORMAT_ARGB8888: - case TBM_FORMAT_ABGR8888: - case TBM_FORMAT_RGBA8888: - case TBM_FORMAT_BGRA8888: - /* packed YCbCr */ - case TBM_FORMAT_YUYV: - case TBM_FORMAT_YVYU: - case TBM_FORMAT_UYVY: - case TBM_FORMAT_VYUY: - case TBM_FORMAT_AYUV: - /* - * 2 plane YCbCr - * index 0 = Y plane, [7:0] Y - * index 1 = Cr:Cb plane, [15:0] Cr:Cb little endian - * or - * index 1 = Cb:Cr plane, [15:0] Cb:Cr little endian - */ - case TBM_FORMAT_NV21: - case TBM_FORMAT_NV16: - case TBM_FORMAT_NV61: - /* - * 3 plane YCbCr - * index 0: Y plane, [7:0] Y - * index 1: Cb plane, [7:0] Cb - * index 2: Cr plane, [7:0] Cr - * or - * index 1: Cr plane, [7:0] Cr - * index 2: Cb plane, [7:0] Cb - */ - case TBM_FORMAT_YUV410: - case TBM_FORMAT_YVU410: - case TBM_FORMAT_YUV411: - case TBM_FORMAT_YVU411: - case TBM_FORMAT_YUV420: - case TBM_FORMAT_YVU420: - case TBM_FORMAT_YUV422: - case TBM_FORMAT_YVU422: - case TBM_FORMAT_YUV444: - case TBM_FORMAT_YVU444: - num = 1; - break; - - case TBM_FORMAT_NV12: - num = 2; - break; - - default: - num = 0; - break; - } - - return num; -} - -int tbm_exynos_bo_get_flags(tbm_bo bo) { EXYNOS_RETURN_VAL_IF_FAIL(bo != NULL, 0); @@ -2039,13 +1953,13 @@ init_tbm_bufmgr_priv(tbm_bufmgr bufmgr, int fd) bufmgr_backend->bo_unmap = tbm_exynos_bo_unmap; bufmgr_backend->surface_get_plane_data = tbm_exynos_surface_get_plane_data; bufmgr_backend->surface_supported_format = tbm_exynos_surface_supported_format; - bufmgr_backend->surface_get_num_bos = tbm_exynos_surface_get_num_bos; bufmgr_backend->bo_get_flags = tbm_exynos_bo_get_flags; bufmgr_backend->bo_lock = NULL; bufmgr_backend->bo_lock2 = tbm_exynos_bo_lock; bufmgr_backend->bo_unlock = tbm_exynos_bo_unlock; - bufmgr_backend->flags = TBM_USE_2_0_BACKEND; + bufmgr_backend->flags |= TBM_USE_2_0_BACKEND; + bufmgr_backend->flags |= TBM_LOCK_CTRL_BACKEND; if (!tbm_backend_init(bufmgr, bufmgr_backend)) { TBM_EXYNOS_LOG("error: Fail to init backend!\n"); -- 2.7.4 From d77f6a6dd24fa7bcd89f310521036d598de8cdbb Mon Sep 17 00:00:00 2001 From: Changyeon Lee Date: Wed, 2 Mar 2016 17:43:02 +0900 Subject: [PATCH 02/16] Share drm master fd with tbm backend Change-Id: If2f1a0302539b6f29e8f5e8c3d4f8c274575e92c --- src/tbm_bufmgr_exynos.c | 165 ++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 131 insertions(+), 34 deletions(-) diff --git a/src/tbm_bufmgr_exynos.c b/src/tbm_bufmgr_exynos.c index c4f1de1..20ce87b 100644 --- a/src/tbm_bufmgr_exynos.c +++ b/src/tbm_bufmgr_exynos.c @@ -50,6 +50,8 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include #include #include +#include + #include #include "tbm_bufmgr_tgl.h" @@ -58,6 +60,8 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #define USE_DMAIMPORT #define TBM_COLOR_FORMAT_COUNT 8 +#define EXYNOS_DRM_NAME "exynos" + #ifdef DEBUG #define LOG_TAG "TBM_BACKEND" #include @@ -98,7 +102,7 @@ char *target_name() } #define TBM_EXYNOS_LOG(fmt, args...) LOGE("\033[31m" "[%s]" fmt "\033[0m", target_name(), ##args) -#define DBG(fmt, args...) {if (bDebug&01) LOGE(fmt, ##args)} +#define DBG(fmt, args...) {if (bDebug&01) LOGE(fmt, ##args);} #else #define TBM_EXYNOS_LOG(...) #define DBG(...) @@ -233,8 +237,6 @@ struct _tbm_bufmgr_exynos { int use_dma_fence; int tgl_fd; - - int fd_owner; }; char *STR_DEVICE[] = { @@ -536,6 +538,96 @@ _bo_destroy_cache_state(tbm_bo bo) } static int +_tbm_exynos_open_drm() +{ + int fd = -1; + + fd = drmOpen(EXYNOS_DRM_NAME, NULL); + if (fd < 0) { + TBM_EXYNOS_LOG ("[libtbm-exynos:%d] " + "warning %s:%d fail to open drm\n", + getpid(), __FUNCTION__, __LINE__); + } + + if (fd < 0) { + struct udev *udev = NULL; + struct udev_enumerate *e = NULL; + struct udev_list_entry *entry = NULL; + struct udev_device *device = NULL, *drm_device = NULL, *device_parent = NULL; + const char *filepath; + struct stat s; + int fd = -1; + int ret; + + TBM_EXYNOS_LOG ("[libtbm-exynos:%d] " + "%s:%d search drm-device by udev\n", + getpid(), __FUNCTION__, __LINE__); + + udev = udev_new(); + if (!udev) { + TBM_EXYNOS_LOG("udev_new() failed.\n"); + return -1; + } + + e = udev_enumerate_new(udev); + udev_enumerate_add_match_subsystem(e, "drm"); + udev_enumerate_add_match_sysname(e, "card[0-9]*"); + udev_enumerate_scan_devices(e); + + udev_list_entry_foreach(entry, udev_enumerate_get_list_entry(e)) { + device = udev_device_new_from_syspath(udev_enumerate_get_udev(e), + udev_list_entry_get_name(entry)); + device_parent = udev_device_get_parent(device); + /* Not need unref device_parent. device_parent and device have same refcnt */ + if (device_parent) { + if (strcmp(udev_device_get_sysname(device_parent), "exynos-drm") == 0) { + drm_device = device; + DBG("[%s] Found render device: '%s' (%s)\n", + target_name(), + udev_device_get_syspath(drm_device), + udev_device_get_sysname(device_parent)); + break; + } + } + udev_device_unref(device); + } + + udev_enumerate_unref(e); + + /* Get device file path. */ + filepath = udev_device_get_devnode(drm_device); + if (!filepath) { + TBM_EXYNOS_LOG("udev_device_get_devnode() failed.\n"); + udev_device_unref(drm_device); + udev_unref(udev); + return -1; + } + + /* Open DRM device file and check validity. */ + fd = open(filepath, O_RDWR | O_CLOEXEC); + if (fd < 0) { + TBM_EXYNOS_LOG("open(%s, O_RDWR | O_CLOEXEC) failed.\n"); + udev_device_unref(drm_device); + udev_unref(udev); + return -1; + } + + ret = fstat(fd, &s); + if (ret) { + TBM_EXYNOS_LOG("fstat() failed %s.\n"); + udev_device_unref(drm_device); + udev_unref(udev); + return -1; + } + + udev_device_unref(drm_device); + udev_unref(udev); + } + + return fd; +} + +static int _get_render_node(void) { struct udev *udev = NULL; @@ -548,6 +640,10 @@ _get_render_node(void) int ret; udev = udev_new(); + if (!udev) { + TBM_EXYNOS_LOG("udev_new() failed.\n"); + return -1; + } e = udev_enumerate_new(udev); udev_enumerate_add_match_subsystem(e, "drm"); @@ -1041,8 +1137,7 @@ tbm_exynos_bo_import_fd(tbm_bo bo, tbm_fd key) name = _get_name(bufmgr_exynos->fd, gem); if (!name) { TBM_EXYNOS_LOG("error bo:%p Cannot get name from gem:%d, fd:%d (%s)\n", - bo, gem, key, strerror(errno)); - free(bo_exynos); + bo, gem, key, strerror(errno)); return 0; } @@ -1481,8 +1576,7 @@ tbm_exynos_bufmgr_deinit(void *priv) bufmgr_exynos->hashBos = NULL; } - if (bufmgr_exynos->fd_owner) - close(bufmgr_exynos->fd); + close(bufmgr_exynos->fd); close(bufmgr_exynos->tgl_fd); @@ -1870,27 +1964,31 @@ init_tbm_bufmgr_priv(tbm_bufmgr bufmgr, int fd) return 0; } - if (_is_drm_master(fd)) { - bufmgr_exynos->fd = fd; - bufmgr_exynos->fd_owner = 0; - DBG("[%s] Display server use drm master fd:%d\n", target_name(), fd); + if (tbm_backend_is_display_server()) { + int master_fd = -1; + + bufmgr_exynos->fd = -1; + master_fd = tbm_drm_helper_get_master_fd(); + if (master_fd < 0) { + bufmgr_exynos->fd = _tbm_exynos_open_drm(); + tbm_drm_helper_set_master_fd(bufmgr_exynos->fd); + } else { + bufmgr_exynos->fd = dup(master_fd); + } + + if (bufmgr_exynos->fd < 0) { + TBM_EXYNOS_LOG ("[libtbm-exynos:%d] error: Fail to create drm!\n", getpid()); + free (bufmgr_exynos); + return 0; + } } else { bufmgr_exynos->fd = _get_render_node(); if (bufmgr_exynos->fd < 0) { - bufmgr_exynos->fd = fd; - bufmgr_exynos->fd_owner = 0; - TBM_EXYNOS_LOG("[%s] get render node failed, use drm node:%d\n", target_name(), - fd); - } else { - bufmgr_exynos->fd_owner = 1; - DBG("[%s] Use render node:%d\n", target_name(), fd); + TBM_EXYNOS_LOG("[%s] get render node failed\n", target_name(), fd); + free (bufmgr_exynos); + return 0; } - } - - if (bufmgr_exynos->fd < 0) { - TBM_EXYNOS_LOG("error: Fail to create drm!\n"); - free(bufmgr_exynos); - return 0; + DBG("[%s] Use render node:%d\n", target_name(), bufmgr_exynos->fd); } /* open tgl fd for saving cache flush data */ @@ -1899,12 +1997,11 @@ init_tbm_bufmgr_priv(tbm_bufmgr bufmgr, int fd) if (bufmgr_exynos->tgl_fd < 0) { bufmgr_exynos->tgl_fd = open(tgl_devfile1, O_RDWR); if (bufmgr_exynos->tgl_fd < 0) { - TBM_EXYNOS_LOG("[libtbm:%d] " + TBM_EXYNOS_LOG("[libtbm-exynos:%d] " "error: Fail to open global_lock:%s\n", getpid(), tgl_devfile); - if (bufmgr_exynos->fd_owner) - close(bufmgr_exynos->fd); + close(bufmgr_exynos->fd); free(bufmgr_exynos); return 0; @@ -1912,12 +2009,12 @@ init_tbm_bufmgr_priv(tbm_bufmgr bufmgr, int fd) } if (!_tgl_init(bufmgr_exynos->tgl_fd, GLOBAL_KEY)) { - TBM_EXYNOS_LOG("[libtbm:%d] " + TBM_EXYNOS_LOG("[libtbm-exynos:%d] " "error: Fail to initialize the tgl\n", getpid()); - if (bufmgr_exynos->fd_owner) - close(bufmgr_exynos->fd); + close(bufmgr_exynos->fd); + close(bufmgr_exynos->tgl_fd); free(bufmgr_exynos); return 0; @@ -1932,8 +2029,8 @@ init_tbm_bufmgr_priv(tbm_bufmgr bufmgr, int fd) if (bufmgr_exynos->hashBos) drmHashDestroy(bufmgr_exynos->hashBos); - if (bufmgr_exynos->fd_owner) - close(bufmgr_exynos->fd); + close(bufmgr_exynos->tgl_fd); + close(bufmgr_exynos->fd); free(bufmgr_exynos); return 0; @@ -1965,8 +2062,8 @@ init_tbm_bufmgr_priv(tbm_bufmgr bufmgr, int fd) TBM_EXYNOS_LOG("error: Fail to init backend!\n"); tbm_backend_free(bufmgr_backend); - if (bufmgr_exynos->fd_owner) - close(bufmgr_exynos->fd); + close(bufmgr_exynos->tgl_fd); + close(bufmgr_exynos->fd); free(bufmgr_exynos); return 0; -- 2.7.4 From a97c74719ae664ed6454c9cd46322327a6438845 Mon Sep 17 00:00:00 2001 From: Changyeon Lee Date: Thu, 3 Mar 2016 16:04:34 +0900 Subject: [PATCH 03/16] Don't use sharing master fd code with libtdm-exynos backend Change-Id: I1d363e11258110fa619492eb00fe6f3a77775f71 --- src/tbm_bufmgr_exynos.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/tbm_bufmgr_exynos.c b/src/tbm_bufmgr_exynos.c index 20ce87b..a2093df 100644 --- a/src/tbm_bufmgr_exynos.c +++ b/src/tbm_bufmgr_exynos.c @@ -537,6 +537,7 @@ _bo_destroy_cache_state(tbm_bo bo) _tgl_destroy(bufmgr_exynos->tgl_fd, bo_exynos->name); } +#if 0 static int _tbm_exynos_open_drm() { @@ -626,6 +627,7 @@ _tbm_exynos_open_drm() return fd; } +#endif static int _get_render_node(void) @@ -1965,6 +1967,8 @@ init_tbm_bufmgr_priv(tbm_bufmgr bufmgr, int fd) } if (tbm_backend_is_display_server()) { +#if 0 + /* this code is applied with libtdm-exynos */ int master_fd = -1; bufmgr_exynos->fd = -1; @@ -1975,6 +1979,9 @@ init_tbm_bufmgr_priv(tbm_bufmgr bufmgr, int fd) } else { bufmgr_exynos->fd = dup(master_fd); } +#else + bufmgr_exynos->fd = dup(fd); +#endif if (bufmgr_exynos->fd < 0) { TBM_EXYNOS_LOG ("[libtbm-exynos:%d] error: Fail to create drm!\n", getpid()); -- 2.7.4 From ec505bc2015a06a7f342feb4ce90ad328a171330 Mon Sep 17 00:00:00 2001 From: Changyeon Lee Date: Thu, 3 Mar 2016 16:34:28 +0900 Subject: [PATCH 04/16] Package version up Change-Id: Ibe7e256534a71af425b236371da1980254754b4d --- packaging/libtbm-exynos.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/libtbm-exynos.spec b/packaging/libtbm-exynos.spec index 9f6a876..6d99100 100644 --- a/packaging/libtbm-exynos.spec +++ b/packaging/libtbm-exynos.spec @@ -1,5 +1,5 @@ Name: libtbm-exynos -Version: 1.2.1 +Version: 1.2.2 Release: 1 License: MIT Summary: Tizen Buffer Manager - exynos backend -- 2.7.4 From 0239ad92b2d92c7e551f10ece2b96eb39b56f3b1 Mon Sep 17 00:00:00 2001 From: Junkyeong Kim Date: Mon, 7 Mar 2016 20:29:49 +0900 Subject: [PATCH 05/16] fix svace error Change-Id: Ib6cdfe47453011614f1a6002decdcc2cc2979fbe Signed-off-by: Junkyeong Kim --- src/tbm_bufmgr_exynos.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/tbm_bufmgr_exynos.c b/src/tbm_bufmgr_exynos.c index a2093df..bcea640 100644 --- a/src/tbm_bufmgr_exynos.c +++ b/src/tbm_bufmgr_exynos.c @@ -695,6 +695,7 @@ _get_render_node(void) TBM_EXYNOS_LOG("fstat() failed %s.\n"); udev_device_unref(drm_device); udev_unref(udev); + close(fd); return -1; } @@ -876,7 +877,7 @@ tbm_exynos_bo_alloc(tbm_bo bo, int size, int flags) struct drm_exynos_gem_create arg = {0, }; - arg.size = size; + arg.size = (uint64_t)size; arg.flags = exynos_flags; if (drmCommandWriteRead(bufmgr_exynos->fd, DRM_EXYNOS_GEM_CREATE, &arg, sizeof(arg))) { -- 2.7.4 From 94c9bf51158b57737d3a0e616d60bf4cac8f4603 Mon Sep 17 00:00:00 2001 From: Changyeon Lee Date: Tue, 8 Mar 2016 19:45:59 +0900 Subject: [PATCH 06/16] Remove unuse function Change-Id: If83b00553c0ac680c53b4cdae9129b77894c0d29 --- src/tbm_bufmgr_exynos.c | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/tbm_bufmgr_exynos.c b/src/tbm_bufmgr_exynos.c index bcea640..687fc67 100644 --- a/src/tbm_bufmgr_exynos.c +++ b/src/tbm_bufmgr_exynos.c @@ -338,15 +338,6 @@ _tgl_get_data(int fd, unsigned int key) return arg.data1; } -static inline int -_is_drm_master(int drm_fd) -{ - drm_magic_t magic; - - return drmGetMagic(drm_fd, &magic) == 0 && - drmAuthMagic(drm_fd, magic) == 0; -} - static int _exynos_cache_flush(tbm_bo bo, int flags) { -- 2.7.4 From 232957aba089fb437f044da021f91cf75d7cdaf0 Mon Sep 17 00:00:00 2001 From: Changyeon Lee Date: Tue, 8 Mar 2016 21:38:30 +0900 Subject: [PATCH 07/16] Use drm card0 node if render node don't exist Change-Id: I5dca854c651ff9a743ca8bdf4288e7f191f63da7 --- src/tbm_bufmgr_exynos.c | 109 ++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 102 insertions(+), 7 deletions(-) diff --git a/src/tbm_bufmgr_exynos.c b/src/tbm_bufmgr_exynos.c index 687fc67..f4414f0 100644 --- a/src/tbm_bufmgr_exynos.c +++ b/src/tbm_bufmgr_exynos.c @@ -237,6 +237,9 @@ struct _tbm_bufmgr_exynos { int use_dma_fence; int tgl_fd; + + char *device_name; + void *bind_display; }; char *STR_DEVICE[] = { @@ -621,6 +624,55 @@ _tbm_exynos_open_drm() #endif static int +_check_render_node(void) +{ + struct udev *udev = NULL; + struct udev_enumerate *e = NULL; + struct udev_list_entry *entry = NULL; + struct udev_device *device = NULL, *drm_device = NULL, *device_parent = NULL; + + udev = udev_new(); + if (!udev) { + TBM_EXYNOS_LOG("udev_new() failed.\n"); + return -1; + } + + e = udev_enumerate_new(udev); + udev_enumerate_add_match_subsystem(e, "drm"); + udev_enumerate_add_match_sysname(e, "renderD[0-9]*"); + udev_enumerate_scan_devices(e); + + udev_list_entry_foreach(entry, udev_enumerate_get_list_entry(e)) { + device = udev_device_new_from_syspath(udev_enumerate_get_udev(e), + udev_list_entry_get_name(entry)); + device_parent = udev_device_get_parent(device); + /* Not need unref device_parent. device_parent and device have same refcnt */ + if (device_parent) { + if (strcmp(udev_device_get_sysname(device_parent), "exynos-drm") == 0) { + drm_device = device; + DBG("[%s] Found render device: '%s' (%s)\n", + target_name(), + udev_device_get_syspath(drm_device), + udev_device_get_sysname(device_parent)); + break; + } + } + udev_device_unref(device); + } + + udev_enumerate_unref(e); + udev_unref(udev); + + if (!drm_device) { + udev_device_unref(drm_device); + return 0; + } + + udev_device_unref(drm_device); + return 1; +} + +static int _get_render_node(void) { struct udev *udev = NULL; @@ -1574,6 +1626,9 @@ tbm_exynos_bufmgr_deinit(void *priv) close(bufmgr_exynos->tgl_fd); + if (bufmgr_exynos->device_name) + free(bufmgr_exynos->device_name); + free(bufmgr_exynos); } @@ -1933,6 +1988,25 @@ tbm_exynos_bo_get_flags(tbm_bo bo) return bo_exynos->flags_tbm; } +int +tbm_exynos_bufmgr_bind_native_display (tbm_bufmgr bufmgr, void *native_display) +{ + tbm_bufmgr_exynos bufmgr_exynos; + + bufmgr_exynos = tbm_backend_get_priv_from_bufmgr(bufmgr); + EXYNOS_RETURN_VAL_IF_FAIL(bufmgr_exynos != NULL, 0); + + if (!tbm_drm_helper_wl_auth_server_init(native_display, bufmgr_exynos->fd, + bufmgr_exynos->device_name, 0)) { + TBM_EXYNOS_LOG("[libtbm-exynos:%d] error:Fail to tbm_drm_helper_wl_server_init\n"); + return 0; + } + + bufmgr_exynos->bind_display = native_display; + + return 1; +} + MODULEINITPPROTO(init_tbm_bufmgr_priv); static TBMModuleVersionInfo ExynosVersRec = { @@ -1974,20 +2048,38 @@ init_tbm_bufmgr_priv(tbm_bufmgr bufmgr, int fd) #else bufmgr_exynos->fd = dup(fd); #endif - if (bufmgr_exynos->fd < 0) { TBM_EXYNOS_LOG ("[libtbm-exynos:%d] error: Fail to create drm!\n", getpid()); free (bufmgr_exynos); return 0; } - } else { - bufmgr_exynos->fd = _get_render_node(); - if (bufmgr_exynos->fd < 0) { - TBM_EXYNOS_LOG("[%s] get render node failed\n", target_name(), fd); + + bufmgr_exynos->device_name = drmGetDeviceNameFromFd(bufmgr_exynos->fd); + + if (!bufmgr_exynos->device_name) + { + TBM_EXYNOS_LOG ("[libtbm-exynos:%d] error: Fail to get device name!\n", getpid()); free (bufmgr_exynos); return 0; } - DBG("[%s] Use render node:%d\n", target_name(), bufmgr_exynos->fd); + + } else { + if (_check_render_node()) { + bufmgr_exynos->fd = _get_render_node(); + if (bufmgr_exynos->fd < 0) { + TBM_EXYNOS_LOG("[%s] get render node failed\n", target_name(), fd); + free (bufmgr_exynos); + return 0; + } + DBG("[%s] Use render node:%d\n", target_name(), bufmgr_exynos->fd); + } + else { + if (!tbm_drm_helper_get_auth_info(&(bufmgr_exynos->fd), &(bufmgr_exynos->device_name), NULL)) { + TBM_EXYNOS_LOG ("[libtbm-exynos:%d] error: Fail to get auth drm info!\n", getpid()); + free (bufmgr_exynos); + return 0; + } + } } /* open tgl fd for saving cache flush data */ @@ -2054,8 +2146,11 @@ init_tbm_bufmgr_priv(tbm_bufmgr bufmgr, int fd) bufmgr_backend->bo_lock2 = tbm_exynos_bo_lock; bufmgr_backend->bo_unlock = tbm_exynos_bo_unlock; + if (tbm_backend_is_display_server() && !_check_render_node()) { + bufmgr_backend->bufmgr_bind_native_display = tbm_exynos_bufmgr_bind_native_display; + } + bufmgr_backend->flags |= TBM_USE_2_0_BACKEND; - bufmgr_backend->flags |= TBM_LOCK_CTRL_BACKEND; if (!tbm_backend_init(bufmgr, bufmgr_backend)) { TBM_EXYNOS_LOG("error: Fail to init backend!\n"); -- 2.7.4 From 18e1bf22f6a947f57acbfe9ab7dcbe755d953705 Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Fri, 11 Mar 2016 13:51:46 +0900 Subject: [PATCH 08/16] use the tizen directory macros at spec file Change-Id: I3b2ef83a4296aaf95f29cff413da1bdfaba8cf35 --- packaging/libtbm-exynos.spec | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/packaging/libtbm-exynos.spec b/packaging/libtbm-exynos.spec index 6d99100..8c4bfcc 100644 --- a/packaging/libtbm-exynos.spec +++ b/packaging/libtbm-exynos.spec @@ -17,6 +17,8 @@ BuildRequires: pkgconfig(libudev) %description descriptionion: Tizen Buffer manager backend module for exynos +%global TZ_SYS_RO_SHARE %{?TZ_SYS_RO_SHARE:%TZ_SYS_RO_SHARE}%{!?TZ_SYS_RO_SHARE:/usr/share} + %prep %setup -q @@ -29,8 +31,8 @@ make %{?_smp_mflags} %install rm -rf %{buildroot} -mkdir -p %{buildroot}/usr/share/license -cp -af COPYING %{buildroot}/usr/share/license/%{name} +mkdir -p %{buildroot}/%{TZ_SYS_RO_SHARE}/license +cp -af COPYING %{buildroot}/%{TZ_SYS_RO_SHARE}/license/%{name} %make_install @@ -44,5 +46,5 @@ ln -s libtbm_exynos.so %{_libdir}/bufmgr/libtbm_default.so %files %{_libdir}/bufmgr/libtbm_*.so* -/usr/share/license/%{name} +%{TZ_SYS_RO_SHARE}/license/%{name} -- 2.7.4 From 91ea9d62b5934d2cace2f6aa0615a0152b01fe45 Mon Sep 17 00:00:00 2001 From: Junkyeong Kim Date: Thu, 17 Mar 2016 20:30:25 +0900 Subject: [PATCH 09/16] fix svace error Change-Id: I8454615682b1ac7784077d9060a6334703a2c7d9 Signed-off-by: Junkyeong Kim --- src/tbm_bufmgr_exynos.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/tbm_bufmgr_exynos.c b/src/tbm_bufmgr_exynos.c index f4414f0..ad5bfda 100644 --- a/src/tbm_bufmgr_exynos.c +++ b/src/tbm_bufmgr_exynos.c @@ -2059,6 +2059,7 @@ init_tbm_bufmgr_priv(tbm_bufmgr bufmgr, int fd) if (!bufmgr_exynos->device_name) { TBM_EXYNOS_LOG ("[libtbm-exynos:%d] error: Fail to get device name!\n", getpid()); + close(bufmgr_exynos->fd); free (bufmgr_exynos); return 0; } -- 2.7.4 From 61f27ff384097e7937eddd83e9ad32ad73d98dc8 Mon Sep 17 00:00:00 2001 From: Changyeon Lee Date: Fri, 25 Mar 2016 16:09:08 +0900 Subject: [PATCH 10/16] only use tgl if cache control enable Change-Id: I94e1f6d947b46da674ba4dff0b927b3af4915dbf --- src/tbm_bufmgr_exynos.c | 202 ++++++++++++++++++++++++++++++------------------ src/tbm_bufmgr_tgl.h | 2 + 2 files changed, 128 insertions(+), 76 deletions(-) diff --git a/src/tbm_bufmgr_exynos.c b/src/tbm_bufmgr_exynos.c index ad5bfda..3493701 100644 --- a/src/tbm_bufmgr_exynos.c +++ b/src/tbm_bufmgr_exynos.c @@ -268,6 +268,7 @@ uint32_t tbm_exynos_color_format_list[TBM_COLOR_FORMAT_COUNT] = { TBM_FORMAT_R TBM_FORMAT_YVU420 }; +#ifdef ENABLE_CACHECRTL static inline int _tgl_init(int fd, unsigned int key) { @@ -342,23 +343,14 @@ _tgl_get_data(int fd, unsigned int key) } static int -_exynos_cache_flush(tbm_bo bo, int flags) +_exynos_cache_flush(tbm_bufmgr_exynos bufmgr_exynos, tbm_bo_exynos bo_exynos, int flags) { -#ifdef ENABLE_CACHECRTL - tbm_bufmgr_exynos bufmgr_exynos = (tbm_bufmgr_exynos) - tbm_backend_get_bufmgr_priv(bo); - EXYNOS_RETURN_VAL_IF_FAIL(bufmgr_exynos != NULL, 0); /* cache flush is managed by kernel side when using dma-fence. */ if (bufmgr_exynos->use_dma_fence) return 1; - EXYNOS_RETURN_VAL_IF_FAIL(bo != NULL, 0); - - tbm_bo_exynos bo_exynos; - - bo_exynos = (tbm_bo_exynos)tbm_backend_get_bo_priv(bo); EXYNOS_RETURN_VAL_IF_FAIL(bo_exynos != NULL, 0); struct drm_exynos_gem_cache_op cache_op = {0, }; @@ -399,44 +391,49 @@ _exynos_cache_flush(tbm_bo bo, int flags) TBM_EXYNOS_LOG("error fail to flush the cache.\n"); return 0; } -#else - TBM_EXYNOS_LOG("warning fail to enable the cache flush.\n"); -#endif + return 1; } +#endif static int -_bo_init_cache_state(tbm_bufmgr_exynos bufmgr_exynos, tbm_bo_exynos bo_exynos) +_bo_init_cache_state(tbm_bufmgr_exynos bufmgr_exynos, tbm_bo_exynos bo_exynos, int flag) { +#ifdef ENABLE_CACHECRTL EXYNOS_RETURN_VAL_IF_FAIL(bufmgr_exynos != NULL, 0); EXYNOS_RETURN_VAL_IF_FAIL(bo_exynos != NULL, 0); + if (bufmgr_exynos->use_dma_fence) + return 1; + tbm_bo_cache_state cache_state; _tgl_init(bufmgr_exynos->tgl_fd, bo_exynos->name); - cache_state.data.isDirtied = DEVICE_NONE; - cache_state.data.isCached = 0; - cache_state.data.cntFlush = 0; + if (flag == 0) { + cache_state.data.isDirtied = DEVICE_NONE; + cache_state.data.isCached = 0; + cache_state.data.cntFlush = 0; - _tgl_set_data(bufmgr_exynos->tgl_fd, bo_exynos->name, cache_state.val); + _tgl_set_data(bufmgr_exynos->tgl_fd, bo_exynos->name, cache_state.val); + } +#endif return 1; } static int -_bo_set_cache_state(tbm_bo bo, int device, int opt) +_bo_set_cache_state(tbm_bufmgr_exynos bufmgr_exynos, tbm_bo_exynos bo_exynos, int device, int opt) { - tbm_bo_exynos bo_exynos; - tbm_bufmgr_exynos bufmgr_exynos; - char need_flush = 0; - unsigned short cntFlush = 0; - - bo_exynos = (tbm_bo_exynos)tbm_backend_get_bo_priv(bo); +#ifdef ENABLE_CACHECRTL + EXYNOS_RETURN_VAL_IF_FAIL(bufmgr_exynos != NULL, 0); EXYNOS_RETURN_VAL_IF_FAIL(bo_exynos != NULL, 0); - bufmgr_exynos = (tbm_bufmgr_exynos)tbm_backend_get_bufmgr_priv(bo); - EXYNOS_RETURN_VAL_IF_FAIL(bufmgr_exynos != NULL, 0); + if (bufmgr_exynos->use_dma_fence) + return 1; + + char need_flush = 0; + unsigned short cntFlush = 0; if (bo_exynos->flags_exynos & EXYNOS_BO_NONCACHABLE) return 1; @@ -479,7 +476,7 @@ _bo_set_cache_state(tbm_bo bo, int device, int opt) _tgl_set_data(bufmgr_exynos->tgl_fd, GLOBAL_KEY, (unsigned int)(++cntFlush)); /* call cache flush */ - _exynos_cache_flush(bo, need_flush); + _exynos_cache_flush(bufmgr_exynos, bo_exynos, need_flush); DBG("[libtbm:%d] \tcache(%d,%d)....flush:0x%x, cntFlush(%d)\n", getpid(), @@ -488,22 +485,22 @@ _bo_set_cache_state(tbm_bo bo, int device, int opt) need_flush, cntFlush); } +#endif return 1; } static int -_bo_save_cache_state(tbm_bo bo) +_bo_save_cache_state(tbm_bufmgr_exynos bufmgr_exynos, tbm_bo_exynos bo_exynos) { - unsigned short cntFlush = 0; - tbm_bo_exynos bo_exynos; - tbm_bufmgr_exynos bufmgr_exynos; - - bo_exynos = (tbm_bo_exynos)tbm_backend_get_bo_priv(bo); +#ifdef ENABLE_CACHECRTL + EXYNOS_RETURN_VAL_IF_FAIL(bufmgr_exynos != NULL, 0); EXYNOS_RETURN_VAL_IF_FAIL(bo_exynos != NULL, 0); - bufmgr_exynos = (tbm_bufmgr_exynos)tbm_backend_get_bufmgr_priv(bo); - EXYNOS_RETURN_VAL_IF_FAIL(bufmgr_exynos != NULL, 0); + if (bufmgr_exynos->use_dma_fence) + return 1; + + unsigned short cntFlush = 0; /* get global cache flush count */ cntFlush = (unsigned short)_tgl_get_data(bufmgr_exynos->tgl_fd, GLOBAL_KEY); @@ -512,23 +509,74 @@ _bo_save_cache_state(tbm_bo bo) bo_exynos->cache_state.data.cntFlush = cntFlush; _tgl_set_data(bufmgr_exynos->tgl_fd, bo_exynos->name, bo_exynos->cache_state.val); +#endif return 1; } static void -_bo_destroy_cache_state(tbm_bo bo) +_bo_destroy_cache_state(tbm_bufmgr_exynos bufmgr_exynos, tbm_bo_exynos bo_exynos) { - tbm_bo_exynos bo_exynos; - tbm_bufmgr_exynos bufmgr_exynos; - - bo_exynos = (tbm_bo_exynos)tbm_backend_get_bo_priv(bo); +#ifdef ENABLE_CACHECRTL + EXYNOS_RETURN_IF_FAIL(bufmgr_exynos != NULL); EXYNOS_RETURN_IF_FAIL(bo_exynos != NULL); - bufmgr_exynos = (tbm_bufmgr_exynos)tbm_backend_get_bufmgr_priv(bo); - EXYNOS_RETURN_IF_FAIL(bufmgr_exynos != NULL); + if (bufmgr_exynos->use_dma_fence) + return ; _tgl_destroy(bufmgr_exynos->tgl_fd, bo_exynos->name); +#endif +} + +static int +_bufmgr_init_cache_state(tbm_bufmgr_exynos bufmgr_exynos) +{ +#ifdef ENABLE_CACHECRTL + EXYNOS_RETURN_IF_FAIL(bufmgr_exynos != NULL); + + if (bufmgr_exynos->use_dma_fence) + return 1; + + /* open tgl fd for saving cache flush data */ + bufmgr_exynos->tgl_fd = open(tgl_devfile, O_RDWR); + + if (bufmgr_exynos->tgl_fd < 0) { + bufmgr_exynos->tgl_fd = open(tgl_devfile1, O_RDWR); + if (bufmgr_exynos->tgl_fd < 0) { + TBM_EXYNOS_LOG("[libtbm-exynos:%d] " + "error: Fail to open global_lock:%s\n", + getpid(), tgl_devfile); + + close(bufmgr_exynos->tgl_fd); + return 0; + } + } + + if (!_tgl_init(bufmgr_exynos->tgl_fd, GLOBAL_KEY)) { + TBM_EXYNOS_LOG("[libtbm-exynos:%d] " + "error: Fail to initialize the tgl\n", + getpid()); + + close(bufmgr_exynos->tgl_fd); + return 0; + } +#endif + + return 1; +} + +static void +_bufmgr_deinit_cache_state(tbm_bufmgr_exynos bufmgr_exynos) +{ +#ifdef ENABLE_CACHECRTL + EXYNOS_RETURN_IF_FAIL(bufmgr_exynos != NULL); + + if (bufmgr_exynos->use_dma_fence) + return; + + if (bufmgr_exynos->tgl_fd >= 0) + close(bufmgr_exynos->tgl_fd); +#endif } #if 0 @@ -937,7 +985,7 @@ tbm_exynos_bo_alloc(tbm_bo bo, int size, int flags) bo_exynos->flags_exynos = exynos_flags; bo_exynos->name = _get_name(bo_exynos->fd, bo_exynos->gem); - if (!_bo_init_cache_state(bufmgr_exynos, bo_exynos)) { + if (!_bo_init_cache_state(bufmgr_exynos, bo_exynos, 0)) { TBM_EXYNOS_LOG("error fail init cache state(%d)\n", bo_exynos->name); free(bo_exynos); return 0; @@ -1038,7 +1086,7 @@ tbm_exynos_bo_free(tbm_bo bo) ret); } - _bo_destroy_cache_state(bo); + _bo_destroy_cache_state(bufmgr_exynos, bo_exynos); /* Free gem handle */ struct drm_gem_close arg = {0, }; @@ -1104,8 +1152,8 @@ tbm_exynos_bo_import(tbm_bo bo, unsigned int key) bo_exynos->name = key; bo_exynos->flags_tbm = _get_tbm_flag_from_exynos(bo_exynos->flags_exynos); - if (!_tgl_init(bufmgr_exynos->tgl_fd, bo_exynos->name)) { - TBM_EXYNOS_LOG("error fail tgl init(%d)\n", bo_exynos->name); + if (!_bo_init_cache_state(bufmgr_exynos, bo_exynos, 1)) { + TBM_EXYNOS_LOG("error fail init cache state(%d)\n", bo_exynos->name); free(bo_exynos); return 0; } @@ -1232,8 +1280,8 @@ tbm_exynos_bo_import_fd(tbm_bo bo, tbm_fd key) bo_exynos->flags_tbm = _get_tbm_flag_from_exynos(bo_exynos->flags_exynos); bo_exynos->name = name; - if (!_tgl_init(bufmgr_exynos->tgl_fd, bo_exynos->name)) { - TBM_EXYNOS_LOG("error fail tgl init(%d)\n", bo_exynos->name); + if (!_bo_init_cache_state(bufmgr_exynos, bo_exynos, 1)) { + TBM_EXYNOS_LOG("error fail init cache state(%d)\n", bo_exynos->name); free(bo_exynos); return 0; } @@ -1376,6 +1424,10 @@ tbm_exynos_bo_map(tbm_bo bo, int device, int opt) tbm_bo_handle bo_handle; tbm_bo_exynos bo_exynos; + tbm_bufmgr_exynos bufmgr_exynos; + + bufmgr_exynos = (tbm_bufmgr_exynos)tbm_backend_get_bufmgr_priv(bo); + EXYNOS_RETURN_VAL_IF_FAIL(bufmgr_exynos != NULL, (tbm_bo_handle)NULL); bo_exynos = (tbm_bo_exynos)tbm_backend_get_bo_priv(bo); EXYNOS_RETURN_VAL_IF_FAIL(bo_exynos != NULL, (tbm_bo_handle) NULL); @@ -1401,7 +1453,7 @@ tbm_exynos_bo_map(tbm_bo bo, int device, int opt) } if (bo_exynos->map_cnt == 0) - _bo_set_cache_state(bo, device, opt); + _bo_set_cache_state(bufmgr_exynos, bo_exynos, device, opt); bo_exynos->map_cnt++; @@ -1414,6 +1466,10 @@ tbm_exynos_bo_unmap(tbm_bo bo) EXYNOS_RETURN_VAL_IF_FAIL(bo != NULL, 0); tbm_bo_exynos bo_exynos; + tbm_bufmgr_exynos bufmgr_exynos; + + bufmgr_exynos = (tbm_bufmgr_exynos)tbm_backend_get_bufmgr_priv(bo); + EXYNOS_RETURN_VAL_IF_FAIL(bufmgr_exynos != NULL, 0); bo_exynos = (tbm_bo_exynos)tbm_backend_get_bo_priv(bo); EXYNOS_RETURN_VAL_IF_FAIL(bo_exynos != NULL, 0); @@ -1424,7 +1480,7 @@ tbm_exynos_bo_unmap(tbm_bo bo) bo_exynos->map_cnt--; if (bo_exynos->map_cnt == 0) - _bo_save_cache_state(bo); + _bo_save_cache_state(bufmgr_exynos, bo_exynos); DBG(" [%s] bo:%p, gem:%d(%d), fd:%d\n", target_name(), bo, @@ -1622,9 +1678,9 @@ tbm_exynos_bufmgr_deinit(void *priv) bufmgr_exynos->hashBos = NULL; } - close(bufmgr_exynos->fd); + _bufmgr_deinit_cache_state(bufmgr_exynos); - close(bufmgr_exynos->tgl_fd); + close(bufmgr_exynos->fd); if (bufmgr_exynos->device_name) free(bufmgr_exynos->device_name); @@ -2083,30 +2139,22 @@ init_tbm_bufmgr_priv(tbm_bufmgr bufmgr, int fd) } } - /* open tgl fd for saving cache flush data */ - bufmgr_exynos->tgl_fd = open(tgl_devfile, O_RDWR); + //Check if the tbm manager supports dma fence or not. + int fp = open("/sys/module/dmabuf_sync/parameters/enabled", O_RDONLY); + int length; + char buf[1]; + if (fp != -1) { + length = read(fp, buf, 1); + if (length == 1 && buf[0] == '1') + bufmgr_exynos->use_dma_fence = 1; + + close(fp); + } - if (bufmgr_exynos->tgl_fd < 0) { - bufmgr_exynos->tgl_fd = open(tgl_devfile1, O_RDWR); - if (bufmgr_exynos->tgl_fd < 0) { - TBM_EXYNOS_LOG("[libtbm-exynos:%d] " - "error: Fail to open global_lock:%s\n", - getpid(), tgl_devfile); - - close(bufmgr_exynos->fd); - - free(bufmgr_exynos); - return 0; - } - } - - if (!_tgl_init(bufmgr_exynos->tgl_fd, GLOBAL_KEY)) { - TBM_EXYNOS_LOG("[libtbm-exynos:%d] " - "error: Fail to initialize the tgl\n", - getpid()); + if (!_bufmgr_init_cache_state(bufmgr_exynos)) { + TBM_EXYNOS_LOG ("[libtbm-exynos:%d] error: init bufmgr cache state failed!\n", getpid()); close(bufmgr_exynos->fd); - close(bufmgr_exynos->tgl_fd); free(bufmgr_exynos); return 0; @@ -2121,7 +2169,8 @@ init_tbm_bufmgr_priv(tbm_bufmgr bufmgr, int fd) if (bufmgr_exynos->hashBos) drmHashDestroy(bufmgr_exynos->hashBos); - close(bufmgr_exynos->tgl_fd); + _bufmgr_deinit_cache_state(bufmgr_exynos); + close(bufmgr_exynos->fd); free(bufmgr_exynos); @@ -2157,7 +2206,8 @@ init_tbm_bufmgr_priv(tbm_bufmgr bufmgr, int fd) TBM_EXYNOS_LOG("error: Fail to init backend!\n"); tbm_backend_free(bufmgr_backend); - close(bufmgr_exynos->tgl_fd); + _bufmgr_deinit_cache_state(bufmgr_exynos); + close(bufmgr_exynos->fd); free(bufmgr_exynos); diff --git a/src/tbm_bufmgr_tgl.h b/src/tbm_bufmgr_tgl.h index 2279cac..fee35d5 100644 --- a/src/tbm_bufmgr_tgl.h +++ b/src/tbm_bufmgr_tgl.h @@ -34,8 +34,10 @@ #include +#ifdef ENABLE_CACHECRTL static char tgl_devfile[] = "/dev/slp_global_lock"; static char tgl_devfile1[] = "/dev/tgl"; +#endif #define TGL_IOC_BASE 0x32 -- 2.7.4 From f7e67c937e4919c23dbe7fea8087baefb48c9149 Mon Sep 17 00:00:00 2001 From: Changyeon Lee Date: Mon, 28 Mar 2016 11:09:19 +0900 Subject: [PATCH 11/16] Fix name type and build break Change-Id: Iebf60455ca7ac3a28d25837b47a0b5bba4a77a46 --- src/tbm_bufmgr_exynos.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/tbm_bufmgr_exynos.c b/src/tbm_bufmgr_exynos.c index 3493701..575bb1e 100644 --- a/src/tbm_bufmgr_exynos.c +++ b/src/tbm_bufmgr_exynos.c @@ -472,7 +472,7 @@ _bo_set_cache_state(tbm_bufmgr_exynos bufmgr_exynos, tbm_bo_exynos bo_exynos, in } if (need_flush) { - if (need_flush & TBM_CACHE_ALL) + if (need_flush & TBM_EXYNOS_CACHE_ALL) _tgl_set_data(bufmgr_exynos->tgl_fd, GLOBAL_KEY, (unsigned int)(++cntFlush)); /* call cache flush */ @@ -1209,7 +1209,7 @@ tbm_exynos_bo_import_fd(tbm_bo bo, tbm_fd key) tbm_bufmgr_exynos bufmgr_exynos; tbm_bo_exynos bo_exynos; PrivGem *privGem = NULL; - int name; + unsigned int name; int ret; bufmgr_exynos = (tbm_bufmgr_exynos)tbm_backend_get_bufmgr_priv(bo); @@ -1231,7 +1231,7 @@ tbm_exynos_bo_import_fd(tbm_bo bo, tbm_fd key) name = _get_name(bufmgr_exynos->fd, gem); if (!name) { TBM_EXYNOS_LOG("error bo:%p Cannot get name from gem:%d, fd:%d (%s)\n", - bo, gem, key, strerror(errno)); + bo, gem, key, strerror(errno)); return 0; } -- 2.7.4 From 4b796a23e5948903ae6118fddc245c15de573ab1 Mon Sep 17 00:00:00 2001 From: Changyeon Lee Date: Mon, 28 Mar 2016 20:30:18 +0900 Subject: [PATCH 12/16] deinit auth server Change-Id: Iadc7b45edd3653bc1f689199e1e22e88ffa4abfb --- src/tbm_bufmgr_exynos.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/tbm_bufmgr_exynos.c b/src/tbm_bufmgr_exynos.c index 575bb1e..69d8f3f 100644 --- a/src/tbm_bufmgr_exynos.c +++ b/src/tbm_bufmgr_exynos.c @@ -1680,11 +1680,14 @@ tbm_exynos_bufmgr_deinit(void *priv) _bufmgr_deinit_cache_state(bufmgr_exynos); - close(bufmgr_exynos->fd); + if (bufmgr_exynos->bind_display) + tbm_drm_helper_wl_auth_server_deinit(); if (bufmgr_exynos->device_name) free(bufmgr_exynos->device_name); + close(bufmgr_exynos->fd); + free(bufmgr_exynos); } -- 2.7.4 From bacc1826e276f8938884184ba7aba0ee77cb596a Mon Sep 17 00:00:00 2001 From: Changyeon Lee Date: Wed, 30 Mar 2016 15:50:04 +0900 Subject: [PATCH 13/16] fix memory leak Change-Id: Ia9f95ec3e26e4ce8bef6319f0e09ed511cdcb322 --- src/tbm_bufmgr_exynos.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/tbm_bufmgr_exynos.c b/src/tbm_bufmgr_exynos.c index 69d8f3f..894b3e5 100644 --- a/src/tbm_bufmgr_exynos.c +++ b/src/tbm_bufmgr_exynos.c @@ -1117,7 +1117,6 @@ tbm_exynos_bo_import(tbm_bo bo, unsigned int key) ret = drmHashLookup(bufmgr_exynos->hashBos, key, (void **)&privGem); if (ret == 0) { - privGem->ref_count++; return privGem->bo_priv; } @@ -1238,7 +1237,6 @@ tbm_exynos_bo_import_fd(tbm_bo bo, tbm_fd key) ret = drmHashLookup(bufmgr_exynos->hashBos, name, (void **)&privGem); if (ret == 0) { if (gem == privGem->bo_priv->gem) { - privGem->ref_count++; return privGem->bo_priv; } } -- 2.7.4 From 233b93c85170e8bb16bf82f4525bea67dba3718c Mon Sep 17 00:00:00 2001 From: Changyeon Lee Date: Wed, 30 Mar 2016 19:32:24 +0900 Subject: [PATCH 14/16] Change parameter name Change-Id: I072798f479a970b2ff6933e65dcf6581704859f9 --- src/tbm_bufmgr_exynos.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/tbm_bufmgr_exynos.c b/src/tbm_bufmgr_exynos.c index 894b3e5..3017946 100644 --- a/src/tbm_bufmgr_exynos.c +++ b/src/tbm_bufmgr_exynos.c @@ -397,7 +397,7 @@ _exynos_cache_flush(tbm_bufmgr_exynos bufmgr_exynos, tbm_bo_exynos bo_exynos, in #endif static int -_bo_init_cache_state(tbm_bufmgr_exynos bufmgr_exynos, tbm_bo_exynos bo_exynos, int flag) +_bo_init_cache_state(tbm_bufmgr_exynos bufmgr_exynos, tbm_bo_exynos bo_exynos, int import) { #ifdef ENABLE_CACHECRTL EXYNOS_RETURN_VAL_IF_FAIL(bufmgr_exynos != NULL, 0); @@ -410,7 +410,7 @@ _bo_init_cache_state(tbm_bufmgr_exynos bufmgr_exynos, tbm_bo_exynos bo_exynos, i _tgl_init(bufmgr_exynos->tgl_fd, bo_exynos->name); - if (flag == 0) { + if (import == 0) { cache_state.data.isDirtied = DEVICE_NONE; cache_state.data.isCached = 0; cache_state.data.cntFlush = 0; -- 2.7.4 From 1b0ce445572ef2bbf7cb65096d748f8a4d51f896 Mon Sep 17 00:00:00 2001 From: Changyeon Lee Date: Wed, 30 Mar 2016 20:22:47 +0900 Subject: [PATCH 15/16] Share drm master fd with tdm backend Change-Id: Ibfb85ecc69571df43640d2ab00fb618f616e2449 --- src/tbm_bufmgr_exynos.c | 65 ++++++++++++++++++++++++++----------------------- 1 file changed, 34 insertions(+), 31 deletions(-) diff --git a/src/tbm_bufmgr_exynos.c b/src/tbm_bufmgr_exynos.c index 3017946..79d409f 100644 --- a/src/tbm_bufmgr_exynos.c +++ b/src/tbm_bufmgr_exynos.c @@ -579,7 +579,6 @@ _bufmgr_deinit_cache_state(tbm_bufmgr_exynos bufmgr_exynos) #endif } -#if 0 static int _tbm_exynos_open_drm() { @@ -669,7 +668,6 @@ _tbm_exynos_open_drm() return fd; } -#endif static int _check_render_node(void) @@ -1684,6 +1682,9 @@ tbm_exynos_bufmgr_deinit(void *priv) if (bufmgr_exynos->device_name) free(bufmgr_exynos->device_name); + if (tbm_backend_is_display_server()) + tbm_drm_helper_unset_tbm_master_fd(); + close(bufmgr_exynos->fd); free(bufmgr_exynos); @@ -1766,7 +1767,6 @@ _new_calc_uvplane_nv12(int width, int height) /** * @brief get the plane data of the surface. - * @param[in] surface : the surface * @param[in] width : the width of the surface * @param[in] height : the height of the surface * @param[in] format : the format of the surface @@ -1778,7 +1778,7 @@ _new_calc_uvplane_nv12(int width, int height) * @return 1 if this function succeeds, otherwise 0. */ int -tbm_exynos_surface_get_plane_data(tbm_surface_h surface, int width, int height, +tbm_exynos_surface_get_plane_data(int width, int height, tbm_format format, int plane_idx, uint32_t *size, uint32_t *offset, uint32_t *pitch, int *bo_idx) { @@ -2090,32 +2090,28 @@ init_tbm_bufmgr_priv(tbm_bufmgr bufmgr, int fd) } if (tbm_backend_is_display_server()) { -#if 0 - /* this code is applied with libtdm-exynos */ - int master_fd = -1; - bufmgr_exynos->fd = -1; - master_fd = tbm_drm_helper_get_master_fd(); - if (master_fd < 0) { + + bufmgr_exynos->fd = tbm_drm_helper_get_master_fd(); + if (bufmgr_exynos->fd < 0) { bufmgr_exynos->fd = _tbm_exynos_open_drm(); - tbm_drm_helper_set_master_fd(bufmgr_exynos->fd); - } else { - bufmgr_exynos->fd = dup(master_fd); } -#else - bufmgr_exynos->fd = dup(fd); -#endif + if (bufmgr_exynos->fd < 0) { TBM_EXYNOS_LOG ("[libtbm-exynos:%d] error: Fail to create drm!\n", getpid()); free (bufmgr_exynos); return 0; } + tbm_drm_helper_set_tbm_master_fd(bufmgr_exynos->fd); + bufmgr_exynos->device_name = drmGetDeviceNameFromFd(bufmgr_exynos->fd); if (!bufmgr_exynos->device_name) { TBM_EXYNOS_LOG ("[libtbm-exynos:%d] error: Fail to get device name!\n", getpid()); + + tbm_drm_helper_unset_tbm_master_fd(); close(bufmgr_exynos->fd); free (bufmgr_exynos); return 0; @@ -2140,21 +2136,25 @@ init_tbm_bufmgr_priv(tbm_bufmgr bufmgr, int fd) } } - //Check if the tbm manager supports dma fence or not. - int fp = open("/sys/module/dmabuf_sync/parameters/enabled", O_RDONLY); - int length; - char buf[1]; - if (fp != -1) { - length = read(fp, buf, 1); - if (length == 1 && buf[0] == '1') - bufmgr_exynos->use_dma_fence = 1; - - close(fp); - } + //Check if the tbm manager supports dma fence or not. + int fp = open("/sys/module/dmabuf_sync/parameters/enabled", O_RDONLY); + int length; + char buf[1]; + if (fp != -1) { + length = read(fp, buf, 1); + + if (length == 1 && buf[0] == '1') + bufmgr_exynos->use_dma_fence = 1; + + close(fp); + } if (!_bufmgr_init_cache_state(bufmgr_exynos)) { TBM_EXYNOS_LOG ("[libtbm-exynos:%d] error: init bufmgr cache state failed!\n", getpid()); + if (tbm_backend_is_display_server()) + tbm_drm_helper_unset_tbm_master_fd(); + close(bufmgr_exynos->fd); free(bufmgr_exynos); @@ -2172,6 +2172,9 @@ init_tbm_bufmgr_priv(tbm_bufmgr bufmgr, int fd) _bufmgr_deinit_cache_state(bufmgr_exynos); + if (tbm_backend_is_display_server()) + tbm_drm_helper_unset_tbm_master_fd(); + close(bufmgr_exynos->fd); free(bufmgr_exynos); @@ -2193,22 +2196,22 @@ init_tbm_bufmgr_priv(tbm_bufmgr bufmgr, int fd) bufmgr_backend->surface_get_plane_data = tbm_exynos_surface_get_plane_data; bufmgr_backend->surface_supported_format = tbm_exynos_surface_supported_format; bufmgr_backend->bo_get_flags = tbm_exynos_bo_get_flags; - bufmgr_backend->bo_lock = NULL; - bufmgr_backend->bo_lock2 = tbm_exynos_bo_lock; + bufmgr_backend->bo_lock = tbm_exynos_bo_lock; bufmgr_backend->bo_unlock = tbm_exynos_bo_unlock; if (tbm_backend_is_display_server() && !_check_render_node()) { bufmgr_backend->bufmgr_bind_native_display = tbm_exynos_bufmgr_bind_native_display; } - bufmgr_backend->flags |= TBM_USE_2_0_BACKEND; - if (!tbm_backend_init(bufmgr, bufmgr_backend)) { TBM_EXYNOS_LOG("error: Fail to init backend!\n"); tbm_backend_free(bufmgr_backend); _bufmgr_deinit_cache_state(bufmgr_exynos); + if (tbm_backend_is_display_server()) + tbm_drm_helper_unset_tbm_master_fd(); + close(bufmgr_exynos->fd); free(bufmgr_exynos); -- 2.7.4 From 7554728549da2234fbbf3de4bf1dc1ea18b0b603 Mon Sep 17 00:00:00 2001 From: Changyeon Lee Date: Mon, 11 Apr 2016 20:12:17 +0900 Subject: [PATCH 16/16] Use surface align 8 in circle target Change-Id: I6e0e2f92b7db456994e6afac65448063df68bd0e --- configure.ac | 12 ++++++++++++ packaging/libtbm-exynos.spec | 3 +++ src/tbm_bufmgr_exynos.c | 8 +++++++- 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 3c07765..d064c86 100644 --- a/configure.ac +++ b/configure.ac @@ -60,6 +60,18 @@ if test "x$BACKEND_CTRL" = xyes; then AC_DEFINE(ALWAYS_BACKEND_CTRL, 1, [Enable always backend ctrl]) fi +AC_ARG_ENABLE([align-eight], + [AC_HELP_STRING([--enable-align-eight], [Enable surface align eight])], + [], [enable_align_eight=no]) + +if test "x$enable_align_eight" = "xyes"; then + AC_DEFINE(ALIGN_EIGHT, 1, [Enable surface align eight]) +fi + +if test "x$BACKEND_CTRL" = xyes; then + AC_DEFINE(ALWAYS_BACKEND_CTRL, 1, [Enable always backend ctrl]) +fi + LIBTBM_EXYNOS_CFLAGS="$LIBDRM_CFLAGS $LIBDRM_EXYNOS_CFLAGS $LIBTBM_CFLAGS $DLOG_CFLAGS $LIBUDEV_CFLAGS" LIBTBM_EXYNOS_LIBS="$LIBDRM_LIBS $LIBDRM_EXYNOS_LIBS $LIBTBM_LIBS $DLOG_LIBS $LIBUDEV_LIBS" AC_SUBST(LIBTBM_EXYNOS_CFLAGS) diff --git a/packaging/libtbm-exynos.spec b/packaging/libtbm-exynos.spec index 8c4bfcc..1446210 100644 --- a/packaging/libtbm-exynos.spec +++ b/packaging/libtbm-exynos.spec @@ -25,6 +25,9 @@ descriptionion: Tizen Buffer manager backend module for exynos %build %reconfigure --prefix=%{_prefix} --libdir=%{_libdir}/bufmgr --disable-cachectrl \ +%if "%_repository" == "target-circle" + --enable-align-eight \ +%endif CFLAGS="${CFLAGS} -Wall -Werror" LDFLAGS="${LDFLAGS} -Wl,--hash-style=both -Wl,--as-needed" make %{?_smp_mflags} diff --git a/src/tbm_bufmgr_exynos.c b/src/tbm_bufmgr_exynos.c index 79d409f..14d82ab 100644 --- a/src/tbm_bufmgr_exynos.c +++ b/src/tbm_bufmgr_exynos.c @@ -112,9 +112,15 @@ char *target_name() #define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d)) #define MAX(a, b) ((a) > (b) ? (a) : (b)) +#ifdef ALIGN_EIGHT +#define TBM_SURFACE_ALIGNMENT_PLANE (8) +#define TBM_SURFACE_ALIGNMENT_PITCH_RGB (8) +#else #define TBM_SURFACE_ALIGNMENT_PLANE (64) -#define TBM_SURFACE_ALIGNMENT_PLANE_NV12 (4096) #define TBM_SURFACE_ALIGNMENT_PITCH_RGB (64) +#endif + +#define TBM_SURFACE_ALIGNMENT_PLANE_NV12 (4096) #define TBM_SURFACE_ALIGNMENT_PITCH_YUV (16) #define SZ_1M 0x00100000 -- 2.7.4