summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLu Guanqun <guanqun.lu@intel.com>2013-10-17 13:11:01 +0800
committerZhigang Gong <zhigang.gong@intel.com>2013-10-18 12:17:54 +0800
commitb65be48cbd96334c097ddf4afeee70539e7c5e6b (patch)
treec76a3ae626d2aa8713b7ef0eaab472678c6cdb37
parent7137485c0418b9f8ca4c1e4d4a158b7ff0454089 (diff)
downloadbeignet-b65be48cbd96334c097ddf4afeee70539e7c5e6b.tar.gz
add clCreateBufferFromLibvaIntel() api
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@intel.com> Reviewed-by: Zhigang Gong <zhigang.gong@linux.intel.com>
-rw-r--r--include/CL/cl_intel.h11
-rw-r--r--src/cl_api.c18
-rw-r--r--src/cl_driver.h3
-rw-r--r--src/cl_driver_defs.c1
-rw-r--r--src/cl_mem.c26
-rw-r--r--src/cl_mem.h4
-rw-r--r--src/intel/intel_driver.c15
7 files changed, 78 insertions, 0 deletions
diff --git a/include/CL/cl_intel.h b/include/CL/cl_intel.h
index 135e3403..d0cb492e 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 6d48e153..b94b3729 100644
--- a/src/cl_api.c
+++ b/src/cl_api.c
@@ -2538,6 +2538,7 @@ clGetExtensionFunctionAddress(const char *func_name)
EXTFUNC(clPinBufferIntel)
EXTFUNC(clUnpinBufferIntel)
EXTFUNC(clReportUnfreedIntel)
+ EXTFUNC(clCreateBufferFromLibvaIntel)
return NULL;
}
@@ -2635,3 +2636,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 5ed4fb12..54974019 100644
--- a/src/cl_driver.h
+++ b/src/cl_driver.h
@@ -226,6 +226,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 fe38ba26..86bcafd0 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 7b1370ba..e8a8f784 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 77a92efc..8e7259d3 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 cc339144..dc194fe0 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;