LGTM, pushed.
> -----Original Message----- > From: Beignet [mailto:[email protected]] On Behalf Of > Weng, Chuanbo > Sent: Friday, November 6, 2015 12:02 > To: Weng, Chuanbo; [email protected] > 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:[email protected]] On Behalf Of > Weng, Chuanbo > Sent: Tuesday, October 27, 2015 10:16 > To: [email protected] > 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: [email protected] > 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 <[email protected]> > --- > 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 > [email protected] > http://lists.freedesktop.org/mailman/listinfo/beignet > _______________________________________________ > Beignet mailing list > [email protected] > http://lists.freedesktop.org/mailman/listinfo/beignet _______________________________________________ Beignet mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/beignet
