[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