[Beignet] [PATCH 1/3] Implement clGetContextInfo

Ruiling Song ruiling.song at intel.com
Sun Jun 30 22:46:19 PDT 2013


Signed-off-by: Ruiling Song <ruiling.song at intel.com>
---
 src/cl_api.c     |   41 +++++++++++++++++++++++------------------
 src/cl_context.c |   14 +++++++++++---
 src/cl_context.h |    2 ++
 3 files changed, 36 insertions(+), 21 deletions(-)

diff --git a/src/cl_api.c b/src/cl_api.c
index 9467a48..b3d8f71 100644
--- a/src/cl_api.c
+++ b/src/cl_api.c
@@ -279,25 +279,30 @@ clGetContextInfo(cl_context      context,
                  void *          param_value,
                  size_t *        param_value_size_ret)
 {
-  switch (param_name) {
-    case CL_CONTEXT_DEVICES:
-      if (param_value) {
-        if (param_value_size < sizeof(cl_device_id))
-          return CL_INVALID_VALUE;
-          cl_device_id *device_list = (cl_device_id*)param_value;
-          device_list[0] = context->device;
-          if (param_value_size_ret)
-            *param_value_size_ret = sizeof(cl_device_id);
-          return CL_SUCCESS;
-        }
-        if (param_value_size_ret) {
-          *param_value_size_ret = sizeof(cl_device_id);
-          return CL_SUCCESS;
-        }
-    default:
-      NOT_IMPLEMENTED;
+  cl_int err = CL_SUCCESS;
+  CHECK_CONTEXT (context);
+
+  if (param_name == CL_CONTEXT_DEVICES) {
+    FILL_GETINFO_RET (cl_device_id, 1, &context->device, CL_SUCCESS);
+  } else if (param_name == CL_CONTEXT_NUM_DEVICES) {
+    cl_uint n = 1;
+    FILL_GETINFO_RET (cl_uint, 1, &n, CL_SUCCESS);
+  } else if (param_name == CL_CONTEXT_REFERENCE_COUNT) {
+    cl_uint ref = context->ref_n;
+    FILL_GETINFO_RET (cl_uint, 1, &ref, CL_SUCCESS);
+  } else if (param_name == CL_CONTEXT_PROPERTIES) {
+    if(context->prop_len > 0) {
+      FILL_GETINFO_RET (cl_context_properties, context->prop_len, context->prop_user, CL_SUCCESS);
+    } else {
+      cl_context_properties n = 0;
+      FILL_GETINFO_RET (cl_context_properties, 1, &n, CL_SUCCESS);
+    }
+  } else {
+    return CL_INVALID_VALUE;
   }
-  return 0;
+
+error:
+  return err;
 }
 
 cl_command_queue
diff --git a/src/cl_context.c b/src/cl_context.c
index 0331151..338706b 100644
--- a/src/cl_context.c
+++ b/src/cl_context.c
@@ -34,10 +34,11 @@
 #include <stdlib.h>
 #include <stdint.h>
 #include <assert.h>
+#include <string.h>
 
 static cl_int
 cl_context_properties_process(const cl_context_properties *prop,
-                              struct _cl_context_prop *cl_props)
+                              struct _cl_context_prop *cl_props, cl_uint * prop_len)
 {
   cl_int err = CL_SUCCESS;
 
@@ -81,6 +82,7 @@ cl_context_properties_process(const cl_context_properties *prop,
       goto error;
     }
     prop += 2;
+    *prop_len += 2;
   }
 exit:
 error:
@@ -101,13 +103,13 @@ cl_create_context(const cl_context_properties *  properties,
   struct _cl_context_prop props;
   cl_context ctx = NULL;
   cl_int err = CL_SUCCESS;
-
+  cl_uint prop_len = 0;
   /* XXX */
   FATAL_IF (pfn_notify != NULL || user_data != NULL, "Unsupported call back");
   FATAL_IF (num_devices != 1, "Only one device is supported");
 
   /* Check that we are getting the right platform */
-  if (UNLIKELY(((err = cl_context_properties_process(properties, &props)) != CL_SUCCESS)))
+  if (UNLIKELY(((err = cl_context_properties_process(properties, &props, &prop_len)) != CL_SUCCESS)))
     goto error;
 
   /* We are good */
@@ -116,6 +118,11 @@ cl_create_context(const cl_context_properties *  properties,
     goto error;
   }
 
+  if(properties != NULL && prop_len > 0) {
+    TRY_ALLOC (ctx->prop_user, CALLOC_ARRAY(cl_context_properties, prop_len));
+    memcpy(ctx->prop_user, properties, sizeof(cl_context_properties)*prop_len);
+  }
+  ctx->prop_len = prop_len;
   /* Attach the device to the context */
   ctx->device = *devices;
 
@@ -171,6 +178,7 @@ cl_context_delete(cl_context ctx)
   assert(ctx->programs == NULL);
   assert(ctx->buffers == NULL);
   assert(ctx->drv);
+  cl_free(ctx->prop_user);
   cl_driver_delete(ctx->drv);
   ctx->magic = CL_MAGIC_DEAD_HEADER; /* For safety */
   cl_free(ctx);
diff --git a/src/cl_context.h b/src/cl_context.h
index 5dff2ef..80bf777 100644
--- a/src/cl_context.h
+++ b/src/cl_context.h
@@ -68,6 +68,8 @@ struct _cl_context {
   pthread_mutex_t sampler_lock;     /* To allocate and deallocate samplers */
   uint32_t ver;                     /* Gen version */
   struct _cl_context_prop props;
+  cl_context_properties * prop_user; /* a copy of user passed context properties when create context */
+  cl_uint                 prop_len;  /* count of the properties */
 };
 
 /* Implement OpenCL function */
-- 
1.7.9.5



More information about the Beignet mailing list