diff options
-rw-r--r-- | include/CL/cl_intel.h | 16 | ||||
-rw-r--r-- | src/cl_api.c | 23 | ||||
-rw-r--r-- | src/cl_driver.h | 3 | ||||
-rw-r--r-- | src/cl_driver_defs.c | 1 | ||||
-rw-r--r-- | src/cl_mem.c | 30 | ||||
-rw-r--r-- | src/cl_mem.h | 5 | ||||
-rw-r--r-- | src/intel/intel_driver.c | 34 |
7 files changed, 109 insertions, 3 deletions
diff --git a/include/CL/cl_intel.h b/include/CL/cl_intel.h index 28bcb62b..01da5533 100644 --- a/include/CL/cl_intel.h +++ b/include/CL/cl_intel.h @@ -133,6 +133,22 @@ typedef CL_API_ENTRY cl_int (CL_API_CALL *clGetMemObjectFdIntel_fn)( cl_mem /* Memory Obejct */, int* /* returned fd */); +typedef struct _cl_import_buffer_info_intel { + int fd; + int size; +} cl_import_buffer_info_intel; + +/* Create memory object from external buffer object by fd */ +extern CL_API_ENTRY cl_mem CL_API_CALL +clCreateBufferFromFdINTEL(cl_context /* context */, + const cl_import_buffer_info_intel * /* info */, + cl_int * /* errcode_ret */); + +typedef CL_API_ENTRY cl_mem (CL_API_CALL *clCreateBufferFromFdINTEL_fn)( + cl_context /* context */, + const cl_import_buffer_info_intel * /* info */, + cl_int * /* errcode_ret */); + #ifdef __cplusplus } #endif diff --git a/src/cl_api.c b/src/cl_api.c index a18bc998..7a75ca3a 100644 --- a/src/cl_api.c +++ b/src/cl_api.c @@ -3190,6 +3190,7 @@ internal_clGetExtensionFunctionAddress(const char *func_name) EXTFUNC(clCreateBufferFromLibvaIntel) EXTFUNC(clCreateImageFromLibvaIntel) EXTFUNC(clGetMemObjectFdIntel) + EXTFUNC(clCreateBufferFromFdINTEL) return NULL; } @@ -3358,3 +3359,25 @@ clGetMemObjectFdIntel(cl_context context, error: return err; } + +cl_mem +clCreateBufferFromFdINTEL(cl_context context, + const cl_import_buffer_info_intel* info, + cl_int *errorcode_ret) +{ + cl_mem mem = NULL; + cl_int err = CL_SUCCESS; + CHECK_CONTEXT (context); + + if (!info) { + err = CL_INVALID_VALUE; + goto error; + } + + mem = cl_mem_new_buffer_from_fd(context, info->fd, info->size, &err); + +error: + if (errorcode_ret) + *errorcode_ret = err; + return mem; +} diff --git a/src/cl_driver.h b/src/cl_driver.h index 4ffca09a..13cd6ba2 100644 --- a/src/cl_driver.h +++ b/src/cl_driver.h @@ -381,6 +381,9 @@ extern cl_buffer_get_fd_cb *cl_buffer_get_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; +typedef cl_buffer (cl_buffer_get_buffer_from_fd_cb)(cl_context ctx, int fd, int size); +extern cl_buffer_get_buffer_from_fd_cb *cl_buffer_get_buffer_from_fd; + /* Get the device id */ typedef int (cl_driver_get_device_id_cb)(void); extern cl_driver_get_device_id_cb *cl_driver_get_device_id; diff --git a/src/cl_driver_defs.c b/src/cl_driver_defs.c index b77acdc4..b3e8403d 100644 --- a/src/cl_driver_defs.c +++ b/src/cl_driver_defs.c @@ -53,6 +53,7 @@ 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_get_tiling_align_cb *cl_buffer_get_tiling_align = NULL; +LOCAL cl_buffer_get_buffer_from_fd_cb *cl_buffer_get_buffer_from_fd = 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 be64abe4..6bbd27ab 100644 --- a/src/cl_mem.c +++ b/src/cl_mem.c @@ -2206,3 +2206,33 @@ cl_mem_get_fd(cl_mem mem, err = CL_INVALID_OPERATION; return err; } + +LOCAL cl_mem cl_mem_new_buffer_from_fd(cl_context ctx, + int fd, + int buffer_sz, + 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, NULL, NULL, &err); + if (mem == NULL || err != CL_SUCCESS) + goto error; + + mem->bo = cl_buffer_get_buffer_from_fd(ctx, fd, buffer_sz); + if (mem->bo == NULL) { + err = CL_MEM_OBJECT_ALLOCATION_FAILURE; + goto error; + } + mem->size = buffer_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 4970a755..91c109b7 100644 --- a/src/cl_mem.h +++ b/src/cl_mem.h @@ -295,8 +295,13 @@ extern cl_mem cl_mem_new_libva_image(cl_context ctx, cl_image_format fmt, size_t row_pitch, cl_int *errcode); + extern cl_int cl_mem_get_fd(cl_mem mem, int* fd); +extern cl_mem cl_mem_new_buffer_from_fd(cl_context ctx, + int fd, + int buffer_sz, + cl_int* errcode); #endif /* __CL_MEM_H__ */ diff --git a/src/intel/intel_driver.c b/src/intel/intel_driver.c index 782a2deb..a9c147a9 100644 --- a/src/intel/intel_driver.c +++ b/src/intel/intel_driver.c @@ -371,7 +371,7 @@ intel_driver_unlock_hardware(intel_driver_t *driver) } LOCAL dri_bo* -intel_driver_share_buffer(intel_driver_t *driver, const char *sname, uint32_t name) +intel_driver_share_buffer_from_name(intel_driver_t *driver, const char *sname, uint32_t name) { dri_bo *bo = intel_bo_gem_create_from_name(driver->bufmgr, sname, @@ -383,6 +383,19 @@ intel_driver_share_buffer(intel_driver_t *driver, const char *sname, uint32_t na return bo; } +LOCAL dri_bo* +intel_driver_share_buffer_from_fd(intel_driver_t *driver, int fd, int size) +{ + dri_bo *bo = drm_intel_bo_gem_create_from_prime(driver->bufmgr, + fd, + size); + if (bo == NULL) { + fprintf(stderr, "drm_intel_bo_gem_create_from_prime create bo(size %d) from fd %d failed: %s\n", fd, size, strerror(errno)); + return NULL; + } + return bo; +} + LOCAL uint32_t intel_driver_shared_name(intel_driver_t *driver, dri_bo *bo) { @@ -697,7 +710,7 @@ cl_buffer intel_share_buffer_from_libva(cl_context ctx, { drm_intel_bo *intel_bo; - intel_bo = intel_driver_share_buffer((intel_driver_t *)ctx->drv, "shared from libva", bo_name); + intel_bo = intel_driver_share_buffer_from_name((intel_driver_t *)ctx->drv, "shared from libva", bo_name); if (intel_bo == NULL) return NULL; @@ -715,7 +728,7 @@ cl_buffer intel_share_image_from_libva(cl_context ctx, drm_intel_bo *intel_bo; uint32_t intel_tiling, intel_swizzle_mode; - intel_bo = intel_driver_share_buffer((intel_driver_t *)ctx->drv, "shared from libva", bo_name); + intel_bo = intel_driver_share_buffer_from_name((intel_driver_t *)ctx->drv, "shared from libva", bo_name); drm_intel_bo_get_tiling(intel_bo, &intel_tiling, &intel_swizzle_mode); image->tiling = get_cl_tiling(intel_tiling); @@ -723,6 +736,20 @@ cl_buffer intel_share_image_from_libva(cl_context ctx, return (cl_buffer)intel_bo; } +cl_buffer intel_share_buffer_from_fd(cl_context ctx, + int fd, + int buffer_size) +{ + drm_intel_bo *intel_bo; + + intel_bo = intel_driver_share_buffer_from_fd((intel_driver_t *)ctx->drv, fd, buffer_size); + + if (intel_bo == NULL) + return NULL; + + return (cl_buffer)intel_bo; +} + static cl_buffer intel_buffer_alloc_userptr(cl_buffer_mgr bufmgr, const char* name, void *data,size_t size, unsigned long flags) { #ifdef HAS_USERPTR @@ -877,5 +904,6 @@ intel_setup_callbacks(void) 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_get_tiling_align = (cl_buffer_get_tiling_align_cb *)intel_buffer_get_tiling_align; + cl_buffer_get_buffer_from_fd = (cl_buffer_get_buffer_from_fd_cb *) intel_share_buffer_from_fd; intel_set_gpgpu_callbacks(intel_get_device_id()); } |