[Beignet] [PATCH v2 1/2] Add extension clCreateBufferFromFdINTEL to create cl buffer by external buffer object's fd.
Yang, Rong R
rong.r.yang at intel.com
Mon Nov 9 18:30:22 PST 2015
LGTM, pushed.
> -----Original Message-----
> From: Beignet [mailto:beignet-bounces at lists.freedesktop.org] On Behalf Of
> Weng, Chuanbo
> Sent: Friday, November 6, 2015 12:02
> To: Weng, Chuanbo; beignet at lists.freedesktop.org
> Cc: Wu, Zhiwen
> Subject: Re: [Beignet] [PATCH v2 1/2] Add extension
> clCreateBufferFromFdINTEL to create cl buffer by external buffer object's fd.
>
> Ping for review, thanks!
>
> -----Original Message-----
> From: Beignet [mailto:beignet-bounces at lists.freedesktop.org] On Behalf Of
> Weng, Chuanbo
> Sent: Tuesday, October 27, 2015 10:16
> To: beignet at lists.freedesktop.org
> Cc: Wu, Zhiwen
> Subject: Re: [Beignet] [PATCH v2 1/2] Add extension
> clCreateBufferFromFdINTEL to create cl buffer by external buffer object's fd.
>
> Ping for review, thanks.
>
> -----Original Message-----
> From: Weng, Chuanbo
> Sent: Monday, September 21, 2015 16:20
> To: beignet at lists.freedesktop.org
> Cc: Wu, Zhiwen; Weng, Chuanbo
> Subject: [PATCH v2 1/2] Add extension clCreateBufferFromFdINTEL to create
> cl buffer by external buffer object's fd.
>
> Before this patch, Beignet can only create cl buffer from external bo by its
> handle using clCreateBufferFromLibvaIntel. Render node is the first choice of
> accessing gpu in currect Beignet implementation. DRM_IOCTL_GEM_OPEN is
> used by clCreateBufferFromLibvaIntel but forbidden in Render node mode.
> So it's necessary to add this extension to support buffer sharing between
> different libraries.
>
> v2:
> Seperate clCreateMemObjectFromFdIntel into two extensions:
> clCreateBufferFromFdINTEL and clCreateImageFromFdINTEL.
>
> Signed-off-by: Chuanbo Weng <chuanbo.weng at intel.com>
> ---
> include/CL/cl_intel.h | 16 ++++++++++++++++
> src/cl_api.c | 23 +++++++++++++++++++++++
> src/cl_driver.h | 3 +++
> src/cl_driver_defs.c | 1 +
> src/cl_mem.c | 30 ++++++++++++++++++++++++++++++
> src/cl_mem.h | 5 +++++
> src/intel/intel_driver.c | 34 +++++++++++++++++++++++++++++++---
> 7 files changed, 109 insertions(+), 3 deletions(-)
>
> diff --git a/include/CL/cl_intel.h b/include/CL/cl_intel.h index
> 28bcb62..01da553 100644
> --- a/include/CL/cl_intel.h
> +++ b/include/CL/cl_intel.h
> @@ -133,6 +133,22 @@ typedef CL_API_ENTRY cl_int (CL_API_CALL
> *clGetMemObjectFdIntel_fn)(
> cl_mem /* Memory Obejct */,
> int* /* returned fd */);
>
> +typedef struct _cl_import_buffer_info_intel {
> + int fd;
> + int size;
> +} cl_import_buffer_info_intel;
> +
> +/* Create memory object from external buffer object by fd */ extern
> +CL_API_ENTRY cl_mem CL_API_CALL
> +clCreateBufferFromFdINTEL(cl_context /* context */,
> + const cl_import_buffer_info_intel * /* info */,
> + cl_int * /* errcode_ret */);
> +
> +typedef CL_API_ENTRY cl_mem (CL_API_CALL
> *clCreateBufferFromFdINTEL_fn)(
> + cl_context /* context */,
> + const cl_import_buffer_info_intel * /* info */,
> + cl_int * /* errcode_ret */);
> +
> #ifdef __cplusplus
> }
> #endif
> diff --git a/src/cl_api.c b/src/cl_api.c index dbbcbb0..ba82743 100644
> --- a/src/cl_api.c
> +++ b/src/cl_api.c
> @@ -3187,6 +3187,7 @@ internal_clGetExtensionFunctionAddress(const
> char *func_name)
> EXTFUNC(clCreateBufferFromLibvaIntel)
> EXTFUNC(clCreateImageFromLibvaIntel)
> EXTFUNC(clGetMemObjectFdIntel)
> + EXTFUNC(clCreateBufferFromFdINTEL)
> return NULL;
> }
>
> @@ -3355,3 +3356,25 @@ clGetMemObjectFdIntel(cl_context context,
> error:
> return err;
> }
> +
> +cl_mem
> +clCreateBufferFromFdINTEL(cl_context context,
> + const cl_import_buffer_info_intel* info,
> + cl_int *errorcode_ret) {
> + cl_mem mem = NULL;
> + cl_int err = CL_SUCCESS;
> + CHECK_CONTEXT (context);
> +
> + if (!info) {
> + err = CL_INVALID_VALUE;
> + goto error;
> + }
> +
> + mem = cl_mem_new_buffer_from_fd(context, info->fd, info->size, &err);
> +
> +error:
> + if (errorcode_ret)
> + *errorcode_ret = err;
> + return mem;
> +}
> diff --git a/src/cl_driver.h b/src/cl_driver.h index 1ab4dff..e0991c1 100644
> --- a/src/cl_driver.h
> +++ b/src/cl_driver.h
> @@ -381,6 +381,9 @@ extern cl_buffer_get_fd_cb *cl_buffer_get_fd;
> typedef int (cl_buffer_get_tiling_align_cb)(cl_context ctx, uint32_t
> tiling_mode, uint32_t dim); extern cl_buffer_get_tiling_align_cb
> *cl_buffer_get_tiling_align;
>
> +typedef cl_buffer (cl_buffer_get_buffer_from_fd_cb)(cl_context ctx, int
> +fd, int size); extern cl_buffer_get_buffer_from_fd_cb
> +*cl_buffer_get_buffer_from_fd;
> +
> /* Get the device id */
> typedef int (cl_driver_get_device_id_cb)(void);
> extern cl_driver_get_device_id_cb *cl_driver_get_device_id; diff --git
> a/src/cl_driver_defs.c b/src/cl_driver_defs.c index b77acdc..b3e8403 100644
> --- a/src/cl_driver_defs.c
> +++ b/src/cl_driver_defs.c
> @@ -53,6 +53,7 @@ LOCAL cl_buffer_get_buffer_from_libva_cb
> *cl_buffer_get_buffer_from_libva = NULL LOCAL
> cl_buffer_get_image_from_libva_cb *cl_buffer_get_image_from_libva =
> NULL; LOCAL cl_buffer_get_fd_cb *cl_buffer_get_fd = NULL; LOCAL
> cl_buffer_get_tiling_align_cb *cl_buffer_get_tiling_align = NULL;
> +LOCAL cl_buffer_get_buffer_from_fd_cb *cl_buffer_get_buffer_from_fd
> =
> +NULL;
>
> /* cl_khr_gl_sharing */
> LOCAL cl_gl_acquire_texture_cb *cl_gl_acquire_texture = NULL; diff --git
> a/src/cl_mem.c b/src/cl_mem.c index b5671bd..b5ab764 100644
> --- a/src/cl_mem.c
> +++ b/src/cl_mem.c
> @@ -2097,3 +2097,33 @@ cl_mem_get_fd(cl_mem mem,
> err = CL_INVALID_OPERATION;
> return err;
> }
> +
> +LOCAL cl_mem cl_mem_new_buffer_from_fd(cl_context ctx,
> + int fd,
> + int buffer_sz,
> + cl_int* errcode) {
> + cl_int err = CL_SUCCESS;
> + cl_mem mem = NULL;
> +
> + mem = cl_mem_allocate(CL_MEM_BUFFER_TYPE, ctx, 0, 0, CL_FALSE,
> NULL,
> + &err); if (mem == NULL || err != CL_SUCCESS)
> + goto error;
> +
> + mem->bo = cl_buffer_get_buffer_from_fd(ctx, fd, buffer_sz); if
> + (mem->bo == NULL) {
> + err = CL_MEM_OBJECT_ALLOCATION_FAILURE;
> + goto error;
> + }
> + mem->size = buffer_sz;
> +
> +exit:
> + if (errcode)
> + *errcode = err;
> + return mem;
> +
> +error:
> + cl_mem_delete(mem);
> + mem = NULL;
> + goto exit;
> +}
> diff --git a/src/cl_mem.h b/src/cl_mem.h index e027f15..eb2ca48 100644
> --- a/src/cl_mem.h
> +++ b/src/cl_mem.h
> @@ -293,8 +293,13 @@ extern cl_mem
> cl_mem_new_libva_image(cl_context ctx,
> cl_image_format fmt,
> size_t row_pitch,
> cl_int *errcode);
> +
> extern cl_int cl_mem_get_fd(cl_mem mem, int* fd);
>
> +extern cl_mem cl_mem_new_buffer_from_fd(cl_context ctx,
> + int fd,
> + int buffer_sz,
> + cl_int* errcode);
>
> #endif /* __CL_MEM_H__ */
>
> diff --git a/src/intel/intel_driver.c b/src/intel/intel_driver.c index
> 507c910..f9268a1 100644
> --- a/src/intel/intel_driver.c
> +++ b/src/intel/intel_driver.c
> @@ -369,7 +369,7 @@ intel_driver_unlock_hardware(intel_driver_t
> *driver) }
>
> LOCAL dri_bo*
> -intel_driver_share_buffer(intel_driver_t *driver, const char *sname,
> uint32_t name)
> +intel_driver_share_buffer_from_name(intel_driver_t *driver, const char
> +*sname, uint32_t name)
> {
> dri_bo *bo = intel_bo_gem_create_from_name(driver->bufmgr,
> sname, @@ -381,6 +381,19 @@
> intel_driver_share_buffer(intel_driver_t *driver, const char *sname,
> uint32_t na
> return bo;
> }
>
> +LOCAL dri_bo*
> +intel_driver_share_buffer_from_fd(intel_driver_t *driver, int fd, int
> +size) {
> + dri_bo *bo = drm_intel_bo_gem_create_from_prime(driver->bufmgr,
> + fd,
> + size);
> + if (bo == NULL) {
> + fprintf(stderr, "drm_intel_bo_gem_create_from_prime create
> bo(size %d) from fd %d failed: %s\n", fd, size, strerror(errno));
> + return NULL;
> + }
> + return bo;
> +}
> +
> LOCAL uint32_t
> intel_driver_shared_name(intel_driver_t *driver, dri_bo *bo) { @@ -695,7
> +708,7 @@ cl_buffer intel_share_buffer_from_libva(cl_context ctx, {
> drm_intel_bo *intel_bo;
>
> - intel_bo = intel_driver_share_buffer((intel_driver_t *)ctx->drv, "shared
> from libva", bo_name);
> + intel_bo = intel_driver_share_buffer_from_name((intel_driver_t
> + *)ctx->drv, "shared from libva", bo_name);
>
> if (intel_bo == NULL)
> return NULL;
> @@ -713,7 +726,7 @@ cl_buffer intel_share_image_from_libva(cl_context
> ctx,
> drm_intel_bo *intel_bo;
> uint32_t intel_tiling, intel_swizzle_mode;
>
> - intel_bo = intel_driver_share_buffer((intel_driver_t *)ctx->drv, "shared
> from libva", bo_name);
> + intel_bo = intel_driver_share_buffer_from_name((intel_driver_t
> + *)ctx->drv, "shared from libva", bo_name);
>
> drm_intel_bo_get_tiling(intel_bo, &intel_tiling, &intel_swizzle_mode);
> image->tiling = get_cl_tiling(intel_tiling); @@ -721,6 +734,20 @@ cl_buffer
> intel_share_image_from_libva(cl_context ctx,
> return (cl_buffer)intel_bo;
> }
>
> +cl_buffer intel_share_buffer_from_fd(cl_context ctx,
> + int fd,
> + int buffer_size) {
> + drm_intel_bo *intel_bo;
> +
> + intel_bo = intel_driver_share_buffer_from_fd((intel_driver_t
> + *)ctx->drv, fd, buffer_size);
> +
> + if (intel_bo == NULL)
> + return NULL;
> +
> + return (cl_buffer)intel_bo;
> +}
> +
> static cl_buffer intel_buffer_alloc_userptr(cl_buffer_mgr bufmgr, const
> char* name, void *data,size_t size, unsigned long flags) { #ifdef
> HAS_USERPTR @@ -870,5 +897,6 @@ intel_setup_callbacks(void)
> cl_buffer_wait_rendering = (cl_buffer_wait_rendering_cb *)
> drm_intel_bo_wait_rendering;
> cl_buffer_get_fd = (cl_buffer_get_fd_cb *)
> drm_intel_bo_gem_export_to_prime;
> cl_buffer_get_tiling_align = (cl_buffer_get_tiling_align_cb
> *)intel_buffer_get_tiling_align;
> + cl_buffer_get_buffer_from_fd = (cl_buffer_get_buffer_from_fd_cb *)
> + intel_share_buffer_from_fd;
> intel_set_gpgpu_callbacks(intel_get_device_id());
> }
> --
> 1.9.1
>
> _______________________________________________
> Beignet mailing list
> Beignet at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/beignet
> _______________________________________________
> Beignet mailing list
> Beignet at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/beignet
More information about the Beignet
mailing list