[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