diff options
-rw-r--r-- | include/CL/cl_intel.h | 11 | ||||
-rw-r--r-- | src/cl_api.c | 18 | ||||
-rw-r--r-- | src/cl_driver.h | 3 | ||||
-rw-r--r-- | src/cl_driver_defs.c | 1 | ||||
-rw-r--r-- | src/cl_mem.c | 26 | ||||
-rw-r--r-- | src/cl_mem.h | 4 | ||||
-rw-r--r-- | src/intel/intel_driver.c | 15 |
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; |