[Beignet] [PATCH v3 1/2] add clCreateBufferFromLibvaIntel() api

Lu Guanqun guanqun.lu at intel.com
Wed Oct 16 22:11:01 PDT 2013


We can pass in libva's buffer object name and then create the cl buffer from
it, thus we can share the buffer between libva and our opencl.

Signed-off-by: Lu Guanqun <guanqun.lu at intel.com>
---
 include/CL/cl_intel.h    |   11 +++++++++++
 src/cl_api.c             |   18 ++++++++++++++++++
 src/cl_driver.h          |    3 +++
 src/cl_driver_defs.c     |    1 +
 src/cl_mem.c             |   26 ++++++++++++++++++++++++++
 src/cl_mem.h             |    4 ++++
 src/intel/intel_driver.c |   15 +++++++++++++++
 7 files changed, 78 insertions(+)

diff --git a/include/CL/cl_intel.h b/include/CL/cl_intel.h
index 135e340..d0cb492 100644
--- a/include/CL/cl_intel.h
+++ b/include/CL/cl_intel.h
@@ -90,6 +90,17 @@ typedef CL_API_ENTRY cl_program (CL_API_CALL *clCreateProgramWithLLVMIntel_fn)(
                                  const char *            /* file */,
                                  cl_int *                /* errcode_ret */);
 
+/* Create buffer from libva's buffer object */
+extern CL_API_ENTRY cl_mem CL_API_CALL
+clCreateBufferFromLibvaIntel(cl_context      /* context */,
+                             unsigned int    /* bo_name */,
+                             cl_int *        /* errcode_ret */);
+
+typedef CL_API_ENTRY cl_mem (CL_API_CALL *clCreateBufferFromLibvaIntel_fn)(
+                             cl_context     /* context */,
+                             unsigned int   /* bo_name */,
+                             cl_int *       /* errcode_ret */);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/src/cl_api.c b/src/cl_api.c
index 5de7f6b..bf63eda 100644
--- a/src/cl_api.c
+++ b/src/cl_api.c
@@ -2509,6 +2509,7 @@ clGetExtensionFunctionAddress(const char *func_name)
   EXTFUNC(clPinBufferIntel)
   EXTFUNC(clUnpinBufferIntel)
   EXTFUNC(clReportUnfreedIntel)
+  EXTFUNC(clCreateBufferFromLibvaIntel)
   return NULL;
 }
 
@@ -2606,3 +2607,20 @@ clCreateProgramWithLLVMIntel(cl_context              context,
                                      errcode_ret);
 }
 
+cl_mem
+clCreateBufferFromLibvaIntel(cl_context  context,
+                             unsigned int bo_name,
+                             cl_int *errorcode_ret)
+{
+  cl_mem mem = NULL;
+  cl_int err = CL_SUCCESS;
+  CHECK_CONTEXT (context);
+
+  mem = cl_mem_new_libva_buffer(context, bo_name, &err);
+
+error:
+  if (errorcode_ret)
+    *errorcode_ret = err;
+  return mem;
+}
+
diff --git a/src/cl_driver.h b/src/cl_driver.h
index 100b38d..88dea58 100644
--- a/src/cl_driver.h
+++ b/src/cl_driver.h
@@ -223,6 +223,9 @@ extern cl_buffer_alloc_from_texture_cb *cl_buffer_alloc_from_texture;
 typedef void (cl_buffer_release_from_texture_cb)(cl_context, unsigned int, int, unsigned int);
 extern cl_buffer_release_from_texture_cb *cl_buffer_release_from_texture;
 
+typedef cl_buffer (cl_buffer_get_buffer_from_libva_cb)(cl_context ctx, unsigned int bo_name, size_t *sz);
+extern cl_buffer_get_buffer_from_libva_cb *cl_buffer_get_buffer_from_libva;
+
 /* Unref a buffer and destroy it if no more ref */
 typedef int (cl_buffer_unreference_cb)(cl_buffer);
 extern cl_buffer_unreference_cb *cl_buffer_unreference;
diff --git a/src/cl_driver_defs.c b/src/cl_driver_defs.c
index ac4ff7a..f67697e 100644
--- a/src/cl_driver_defs.c
+++ b/src/cl_driver_defs.c
@@ -45,6 +45,7 @@ LOCAL cl_buffer_pin_cb *cl_buffer_pin = NULL;
 LOCAL cl_buffer_unpin_cb *cl_buffer_unpin = NULL;
 LOCAL cl_buffer_subdata_cb *cl_buffer_subdata = NULL;
 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;
 
 /* 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 7b1370b..e8a8f78 100644
--- a/src/cl_mem.c
+++ b/src/cl_mem.c
@@ -1116,3 +1116,29 @@ cl_mem_unpin(cl_mem mem)
   cl_buffer_unpin(mem->bo);
   return CL_SUCCESS;
 }
+
+LOCAL cl_mem cl_mem_new_libva_buffer(cl_context ctx,
+                                     unsigned int bo_name,
+                                     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, &err);
+  if (mem == NULL || err != CL_SUCCESS)
+    goto error;
+
+  size_t sz = 0;
+  mem->bo = cl_buffer_get_buffer_from_libva(ctx, bo_name, &sz);
+  mem->size = 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 77a92ef..8e7259d 100644
--- a/src/cl_mem.h
+++ b/src/cl_mem.h
@@ -248,5 +248,9 @@ cl_mem_copy_image_region(const size_t *origin, const size_t *region,
                          const void *src, size_t src_row_pitch, size_t src_slice_pitch,
                          const struct _cl_mem_image *image);
 
+extern cl_mem cl_mem_new_libva_buffer(cl_context ctx,
+                                      unsigned int bo_name,
+                                      cl_int *errcode);
+
 #endif /* __CL_MEM_H__ */
 
diff --git a/src/intel/intel_driver.c b/src/intel/intel_driver.c
index cc33914..dc194fe 100644
--- a/src/intel/intel_driver.c
+++ b/src/intel/intel_driver.c
@@ -583,6 +583,20 @@ intel_release_buffer_from_texture(cl_context ctx, unsigned int target,
 }
 #endif
 
+cl_buffer intel_share_buffer_from_libva(cl_context ctx,
+                                        unsigned int bo_name,
+                                        size_t *sz)
+{
+  drm_intel_bo *intel_bo;
+
+  intel_bo = intel_driver_share_buffer((intel_driver_t *)ctx->drv, "shared from libva", bo_name);
+
+  if (sz)
+    *sz = intel_bo->size;
+
+  return (cl_buffer)intel_bo;
+}
+
 static int32_t get_intel_tiling(cl_int tiling, uint32_t *intel_tiling)
 {
   switch (tiling) {
@@ -630,6 +644,7 @@ intel_setup_callbacks(void)
   cl_buffer_release_from_texture = (cl_buffer_release_from_texture_cb *) intel_release_buffer_from_texture;
   intel_set_cl_gl_callbacks();
 #endif
+  cl_buffer_get_buffer_from_libva = (cl_buffer_get_buffer_from_libva_cb *) intel_share_buffer_from_libva;
   cl_buffer_reference = (cl_buffer_reference_cb *) drm_intel_bo_reference;
   cl_buffer_unreference = (cl_buffer_unreference_cb *) drm_intel_bo_unreference;
   cl_buffer_map = (cl_buffer_map_cb *) drm_intel_bo_map;



More information about the Beignet mailing list