[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