Get dma buf when tbm_dumb_bo is created 35/295735/3
authorChangyeon Lee <cyeon.lee@samsung.com>
Thu, 13 Jul 2023 05:23:34 +0000 (14:23 +0900)
committerChangyeon Lee <cyeon.lee@samsung.com>
Thu, 13 Jul 2023 05:57:51 +0000 (14:57 +0900)
for reference gem with dma buf when tbm_bufmgr and gbm_device
are used at the same time.

Change-Id: I0285a34ef8a41c9beea869db4b5cc6bd5f87bd63

src/tbm_backend_dumb.c

index 8939de5..2b33a35 100644 (file)
@@ -290,7 +290,6 @@ static hal_tbm_bo_handle
 _dumb_bo_handle(tbm_dumb_bo *bo_data, int device)
 {
        hal_tbm_bo_handle bo_handle;
-       struct drm_prime_handle prime_handle_arg = {0, };
        struct drm_mode_map_dumb map_dumb_arg = {0, };
        void *map = NULL;
 
@@ -306,7 +305,7 @@ _dumb_bo_handle(tbm_dumb_bo *bo_data, int device)
                        map_dumb_arg.handle = bo_data->gem;
                        if (drmIoctl(bo_data->fd, DRM_IOCTL_MODE_MAP_DUMB, &map_dumb_arg)) {
                           TBM_BACKEND_ERR("fail to DRM_IOCTL_MODE_MAP_DUMB bo_data:%p gem:%d",
-                                       bo_data->gem);
+                                       bo_data, bo_data->gem);
                           return (hal_tbm_bo_handle) NULL;
                        }
 
@@ -321,27 +320,10 @@ _dumb_bo_handle(tbm_dumb_bo *bo_data, int device)
                bo_handle.ptr = (void *)bo_data->pBase;
                break;
        case HAL_TBM_DEVICE_3D:
-               if (bo_data->dmabuf < 0) {
-                       prime_handle_arg.handle = bo_data->gem;
-                       if (drmIoctl(bo_data->fd, DRM_IOCTL_PRIME_HANDLE_TO_FD, &prime_handle_arg)) {
-                               TBM_BACKEND_ERR("fail to DRM_IOCTL_PRIME_HANDLE_TO_FD bo_data:%p gem:%d",
-                                               bo_data, bo_data->gem);
-                               return (hal_tbm_bo_handle) NULL;
-                       }
-                       bo_data->dmabuf = prime_handle_arg.fd;
-               }
-
-               bo_handle.u32 = (uint32_t)bo_data->dmabuf;
-               break;
        case HAL_TBM_DEVICE_MM:
                if (bo_data->dmabuf < 0) {
-                       prime_handle_arg.handle = bo_data->gem;
-                       if (drmIoctl(bo_data->fd, DRM_IOCTL_PRIME_HANDLE_TO_FD, &prime_handle_arg)) {
-                               TBM_BACKEND_ERR("fail to DRM_IOCTL_PRIME_HANDLE_TO_FD bo_data:%p gem:%d",
-                                               bo_data, bo_data->gem);
-                               return (hal_tbm_bo_handle) NULL;
-                       }
-                       bo_data->dmabuf = prime_handle_arg.fd;
+                       TBM_BACKEND_ERR("invalid dmabuf bo_data:%p", bo_data);
+                       return (hal_tbm_bo_handle) NULL;
                }
 
                bo_handle.u32 = (uint32_t)bo_data->dmabuf;
@@ -644,6 +626,8 @@ tbm_dumb_bufmgr_alloc_bo(hal_tbm_bufmgr *bufmgr, unsigned int size,
        tbm_dumb_bo *bo_data;
        unsigned int dumb_flags;
        struct drm_mode_create_dumb create_dumb_arg = {0, };
+       struct drm_prime_handle prime_handle_arg = {0, };
+       struct drm_gem_close close_arg = {0, };
 
        if (bufmgr_data == NULL) {
                TBM_BACKEND_ERR("bufmgr_data is null");
@@ -652,15 +636,6 @@ tbm_dumb_bufmgr_alloc_bo(hal_tbm_bufmgr *bufmgr, unsigned int size,
                return NULL;
        }
 
-       bo_data = calloc(1, sizeof(struct _tbm_dumb_bo));
-       if (!bo_data) {
-               TBM_BACKEND_ERR("fail to allocate the bo_data private");
-               if (error)
-                       *error = HAL_TBM_ERROR_OUT_OF_MEMORY;
-               return NULL;
-       }
-       bo_data->bufmgr_data = bufmgr_data;
-
        dumb_flags = _get_dumb_flag_from_tbm(flags);
 
        //as we know only size for new bo set height=1 and bpp=8 and in this case
@@ -672,16 +647,36 @@ tbm_dumb_bufmgr_alloc_bo(hal_tbm_bufmgr *bufmgr, unsigned int size,
        if (drmIoctl(bufmgr_data->fd, DRM_IOCTL_MODE_CREATE_DUMB, &create_dumb_arg)) {
                TBM_BACKEND_ERR("fail to DRM_IOCTL_MODE_CREATE_DUMB flag:%x size:%d",
                                create_dumb_arg.flags, (unsigned int)size);
-               free(bo_data);
                if (error)
                        *error = HAL_TBM_ERROR_INVALID_OPERATION;
                return NULL;
        }
 
+       prime_handle_arg.handle = create_dumb_arg.handle;
+       if (drmIoctl(bufmgr_data->fd, DRM_IOCTL_PRIME_HANDLE_TO_FD, &prime_handle_arg)) {
+               TBM_BACKEND_ERR("fail to DRM_IOCTL_PRIME_HANDLE_TO_FD gem:%d",
+                               create_dumb_arg.handle);
+               close_arg.handle = create_dumb_arg.handle;
+               drmIoctl(bufmgr_data->fd, DRM_IOCTL_GEM_CLOSE, &close_arg);
+
+               if (error)
+                       *error = HAL_TBM_ERROR_INVALID_OPERATION;
+               return NULL;
+       }
+
+       bo_data = calloc(1, sizeof(struct _tbm_dumb_bo));
+       if (!bo_data) {
+               TBM_BACKEND_ERR("fail to allocate the bo_data private");
+               if (error)
+                       *error = HAL_TBM_ERROR_OUT_OF_MEMORY;
+               return NULL;
+       }
+
+       bo_data->bufmgr_data = bufmgr_data;
        bo_data->fd = bufmgr_data->fd;
        bo_data->gem = create_dumb_arg.handle;
        bo_data->size = create_dumb_arg.size;
-       bo_data->dmabuf = -1;
+       bo_data->dmabuf = prime_handle_arg.fd;
        bo_data->flags_tbm = flags;
        bo_data->flags_dumb = dumb_flags;
        bo_data->name = _get_name(bo_data->fd, bo_data->gem);
@@ -790,12 +785,12 @@ tbm_dumb_bufmgr_import_fd(hal_tbm_bufmgr *bufmgr, hal_tbm_fd key, hal_tbm_error
                        *error = HAL_TBM_ERROR_OUT_OF_MEMORY;
                return NULL;
        }
-       bo_data->bufmgr_data = bufmgr_data;
 
+       bo_data->bufmgr_data = bufmgr_data;
        bo_data->fd = bufmgr_data->fd;
        bo_data->gem = gem;
        bo_data->size = real_size;
-       bo_data->dmabuf = -1;
+       bo_data->dmabuf = dup(key);
        bo_data->flags_dumb = 0;
        bo_data->flags_tbm = _get_tbm_flag_from_dumb(bo_data->flags_dumb);
        bo_data->name = name;
@@ -825,6 +820,8 @@ tbm_dumb_bufmgr_import_key(hal_tbm_bufmgr *bufmgr, hal_tbm_key key, hal_tbm_erro
        tbm_dumb_bufmgr *bufmgr_data = (tbm_dumb_bufmgr *)bufmgr;
        tbm_dumb_bo *bo_data;
        struct drm_gem_open open_arg = {0, };
+       struct drm_prime_handle prime_handle_arg = {0, };
+       struct drm_gem_close close_arg = {0, };
        int ret;
 
        if (bufmgr_data == NULL) {
@@ -849,6 +846,18 @@ tbm_dumb_bufmgr_import_key(hal_tbm_bufmgr *bufmgr, hal_tbm_key key, hal_tbm_erro
                return NULL;
        }
 
+       prime_handle_arg.handle = open_arg.handle;
+       if (drmIoctl(bufmgr_data->fd, DRM_IOCTL_PRIME_HANDLE_TO_FD, &prime_handle_arg)) {
+               TBM_BACKEND_ERR("fail to DRM_IOCTL_PRIME_HANDLE_TO_FD gem:%d",
+                               open_arg.handle);
+               close_arg.handle = open_arg.handle;
+               drmIoctl(bufmgr_data->fd, DRM_IOCTL_GEM_CLOSE, &close_arg);
+
+               if (error)
+                       *error = HAL_TBM_ERROR_INVALID_OPERATION;
+               return NULL;
+       }
+
        bo_data = calloc(1, sizeof(struct _tbm_dumb_bo));
        if (!bo_data) {
                TBM_BACKEND_ERR("fail to allocate the bo_data private");
@@ -856,12 +865,12 @@ tbm_dumb_bufmgr_import_key(hal_tbm_bufmgr *bufmgr, hal_tbm_key key, hal_tbm_erro
                        *error = HAL_TBM_ERROR_OUT_OF_MEMORY;
                return NULL;
        }
-       bo_data->bufmgr_data = bufmgr_data;
 
+       bo_data->bufmgr_data = bufmgr_data;
        bo_data->fd = bufmgr_data->fd;
        bo_data->gem = open_arg.handle;
        bo_data->size = open_arg.size;
-       bo_data->dmabuf = -1;
+       bo_data->dmabuf = prime_handle_arg.fd;
        bo_data->flags_dumb = 0;
        bo_data->name = key;
        bo_data->flags_tbm = _get_tbm_flag_from_dumb(bo_data->flags_dumb);