[Beignet] [PATCH V2 2/3] enable CL_DEVICE_HOST_UNIFIED_MEMORY when userptr is supported

Guo Yejun yejun.guo at intel.com
Fri Nov 7 00:19:46 PST 2014


userptr is firstly checked at compile time with libdrm version, but
it does not ensure the system has such capability (for exmaple, with
old linux kernel), so also take a check at run time for the device info.

V2: add runtime check to see if userptr is really supported
Signed-off-by: Guo Yejun <yejun.guo at intel.com>
---
 src/cl_device_id.c | 18 ++++++++++++++++++
 src/cl_gt_device.h |  4 ++++
 2 files changed, 22 insertions(+)

diff --git a/src/cl_device_id.c b/src/cl_device_id.c
index c911c23..8ab1651 100644
--- a/src/cl_device_id.c
+++ b/src/cl_device_id.c
@@ -36,6 +36,8 @@
 #define CL_DEVICE_BUILT_IN_KERNELS 0x103F
 #endif
 
+void *aligned_alloc(size_t alignment, size_t size);
+
 static struct _cl_device_id intel_ivb_gt2_device = {
   INIT_ICD(dispatch)
   .max_compute_unit = 16,
@@ -401,6 +403,22 @@ brw_gt3_break:
     }
   }
 
+#ifdef HAS_USERPTR
+  cl_driver dummy = cl_driver_new(NULL);
+  cl_buffer_mgr bufmgr = cl_driver_get_bufmgr(dummy);
+
+  const size_t sz = 4096;
+  char* host_ptr = (char*)aligned_alloc(4096, sz);
+  cl_buffer bo = cl_buffer_alloc_userptr(bufmgr, "CL memory object", host_ptr, sz, 0);
+  if (bo == NULL)
+    ret->host_unified_memory = CL_FALSE;
+  else
+    cl_buffer_unreference(bo);
+
+  free(host_ptr);
+  cl_driver_delete(dummy);
+#endif
+
   return ret;
 }
 
diff --git a/src/cl_gt_device.h b/src/cl_gt_device.h
index 3cd54eb..c9caa1d 100644
--- a/src/cl_gt_device.h
+++ b/src/cl_gt_device.h
@@ -60,7 +60,11 @@
 .max_constant_buffer_size = 512 << 10,
 .max_constant_args = 8,
 .error_correction_support = CL_FALSE,
+#ifdef HAS_USERPTR
+.host_unified_memory = CL_TRUE,
+#else
 .host_unified_memory = CL_FALSE,
+#endif
 .profiling_timer_resolution = 80, /* ns */
 .endian_little = CL_TRUE,
 .available = CL_TRUE,
-- 
2.1.0



More information about the Beignet mailing list