We have added extension clGetMemObjectFdIntel to export fd of memory object,so we have to added corresponding extension to close the fd.
Signed-off-by: Chuanbo Weng <[email protected]> --- include/CL/cl_intel.h | 11 ++++++++++- src/cl_api.c | 15 +++++++++++++++ src/cl_driver.h | 3 +++ src/cl_driver_defs.c | 1 + src/cl_mem.c | 32 ++++++++++++++++++++++++++++++-- src/cl_mem.h | 4 ++++ src/intel/intel_driver.c | 1 + 7 files changed, 64 insertions(+), 3 deletions(-) diff --git a/include/CL/cl_intel.h b/include/CL/cl_intel.h index 28bcb62..2ab79ad 100644 --- a/include/CL/cl_intel.h +++ b/include/CL/cl_intel.h @@ -122,7 +122,7 @@ typedef CL_API_ENTRY cl_mem (CL_API_CALL *clCreateImageFromLibvaIntel_fn)( const cl_libva_image * /* info */, cl_int * /* errcode_ret */); -/* Create buffer from libva's buffer object */ +/*Export memory object's fd*/ extern CL_API_ENTRY cl_int CL_API_CALL clGetMemObjectFdIntel(cl_context /* context */, cl_mem /* Memory Obejct */, @@ -133,6 +133,15 @@ typedef CL_API_ENTRY cl_int (CL_API_CALL *clGetMemObjectFdIntel_fn)( cl_mem /* Memory Obejct */, int* /* returned fd */); +/*Close memory object's fd*/ +extern CL_API_ENTRY cl_int CL_API_CALL +clCloseMemObjectFdIntel(cl_context /* context */, + cl_mem /* Memory Obejct */); + +typedef CL_API_ENTRY cl_int (CL_API_CALL *clCloseMemObjectFdIntel_fn)( + cl_context /* context */, + cl_mem /* Memory Obejct */); + #ifdef __cplusplus } #endif diff --git a/src/cl_api.c b/src/cl_api.c index 3e72deb..f9efac7 100644 --- a/src/cl_api.c +++ b/src/cl_api.c @@ -3180,6 +3180,7 @@ internal_clGetExtensionFunctionAddress(const char *func_name) EXTFUNC(clCreateBufferFromLibvaIntel) EXTFUNC(clCreateImageFromLibvaIntel) EXTFUNC(clGetMemObjectFdIntel) + EXTFUNC(clCloseMemObjectFdIntel) return NULL; } @@ -3348,3 +3349,17 @@ clGetMemObjectFdIntel(cl_context context, error: return err; } + +extern CL_API_ENTRY cl_int CL_API_CALL +clCloseMemObjectFdIntel(cl_context context, + cl_mem memobj) +{ + cl_int err = CL_SUCCESS; + CHECK_CONTEXT (context); + CHECK_MEM (memobj); + + err = cl_mem_close_fd(memobj); + +error: + return err; +} diff --git a/src/cl_driver.h b/src/cl_driver.h index 3f54a27..dd028c0 100644 --- a/src/cl_driver.h +++ b/src/cl_driver.h @@ -369,6 +369,9 @@ extern cl_buffer_wait_rendering_cb *cl_buffer_wait_rendering; typedef int (cl_buffer_get_fd_cb)(cl_buffer, int *fd); extern cl_buffer_get_fd_cb *cl_buffer_get_fd; +typedef int (cl_buffer_close_fd_cb)(int fd); +extern cl_buffer_close_fd_cb *cl_buffer_close_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; diff --git a/src/cl_driver_defs.c b/src/cl_driver_defs.c index 9a47210..8018747 100644 --- a/src/cl_driver_defs.c +++ b/src/cl_driver_defs.c @@ -51,6 +51,7 @@ LOCAL cl_buffer_wait_rendering_cb *cl_buffer_wait_rendering = NULL; 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_close_fd_cb *cl_buffer_close_fd = NULL; LOCAL cl_buffer_get_tiling_align_cb *cl_buffer_get_tiling_align = NULL; /* cl_khr_gl_sharing */ diff --git a/src/cl_mem.c b/src/cl_mem.c index b41ec14..08fb239 100644 --- a/src/cl_mem.c +++ b/src/cl_mem.c @@ -267,6 +267,8 @@ cl_mem_allocate(enum cl_mem_type type, mem->flags = flags; mem->is_userptr = 0; mem->offset = 0; + mem->export_ref = 0; + pthread_mutex_init(&mem->export_lock, NULL); if (sz != 0) { /* Pinning will require stricter alignment rules */ @@ -2051,7 +2053,33 @@ cl_mem_get_fd(cl_mem mem, int* fd) { cl_int err = CL_SUCCESS; - if(cl_buffer_get_fd(mem->bo, fd)) - err = CL_INVALID_OPERATION; + + pthread_mutex_lock(&mem->export_lock); + if(mem->export_ref == 0){ + if(cl_buffer_get_fd(mem->bo, fd)) + err = CL_INVALID_OPERATION; + mem->export_fd = *fd; + } + else{ + *fd = mem->export_fd; + } + mem->export_ref++; + pthread_mutex_unlock(&mem->export_lock); + + return err; +} + +LOCAL cl_int +cl_mem_close_fd(cl_mem mem) +{ + cl_int err = CL_SUCCESS; + + if(mem->export_ref == 0) + return CL_INVALID_MEM_OBJECT; + if (atomic_dec(&mem->export_ref) > 1) + return CL_SUCCESS; + if(cl_buffer_close_fd(mem->export_fd)) + err = CL_INVALID_OPERATION; + return err; } diff --git a/src/cl_mem.h b/src/cl_mem.h index e027f15..aea2ade 100644 --- a/src/cl_mem.h +++ b/src/cl_mem.h @@ -95,6 +95,9 @@ typedef struct _cl_mem { cl_mem_dstr_cb *dstr_cb; /* The destroy callback. */ uint8_t is_userptr; /* CL_MEM_USE_HOST_PTR is enabled*/ size_t offset; /* offset of host_ptr to the page beginning, only for CL_MEM_USE_HOST_PTR*/ + pthread_mutex_t export_lock; /* To export fd */ + volatile int export_ref; /* The exported count */ + int export_fd; /* The exported fd of this memory object */ } _cl_mem; struct _cl_mem_image { @@ -294,6 +297,7 @@ extern cl_mem cl_mem_new_libva_image(cl_context ctx, size_t row_pitch, cl_int *errcode); extern cl_int cl_mem_get_fd(cl_mem mem, int* fd); +extern cl_int cl_mem_close_fd(cl_mem mem); #endif /* __CL_MEM_H__ */ diff --git a/src/intel/intel_driver.c b/src/intel/intel_driver.c index 755ab6b..37fb262 100644 --- a/src/intel/intel_driver.c +++ b/src/intel/intel_driver.c @@ -840,6 +840,7 @@ intel_setup_callbacks(void) cl_buffer_get_subdata = (cl_buffer_get_subdata_cb *) drm_intel_bo_get_subdata; 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_close_fd = (cl_buffer_close_fd_cb *) close; cl_buffer_get_tiling_align = (cl_buffer_get_tiling_align_cb *)intel_buffer_get_tiling_align; intel_set_gpgpu_callbacks(intel_get_device_id()); } -- 1.9.1 _______________________________________________ Beignet mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/beignet
