summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/CL/cl_intel.h16
-rw-r--r--src/cl_api.c23
-rw-r--r--src/cl_driver.h3
-rw-r--r--src/cl_driver_defs.c1
-rw-r--r--src/cl_mem.c30
-rw-r--r--src/cl_mem.h5
-rw-r--r--src/intel/intel_driver.c34
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());
}