[Beignet] [PATCH v2 1/3] Add extension clCloseMemObjectFdIntel().
Yuan, Feng
feng.yuan at intel.com
Mon Mar 30 19:00:53 PDT 2015
Looks good to me.
>-----Original Message-----
>From: Weng, Chuanbo
>Sent: Saturday, March 28, 2015 12:34 AM
>To: beignet at lists.freedesktop.org
>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 <chuanbo.weng at intel.com>
>---
> 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
More information about the Beignet
mailing list