Looks good to me. >-----Original Message----- >From: Weng, Chuanbo >Sent: Saturday, March 28, 2015 12:34 AM >To: [email protected] >Cc: Yuan, Feng; Weng, Chuanbo >Subject: [PATCH v2 1/3] Add extension clCloseMemObjectFdIntel(). > >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
