summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--backend/src/driver/cl_gen_kernel.cpp35
-rw-r--r--include/cl_driver.h5
-rw-r--r--libclapi/cl_kernel.c18
3 files changed, 40 insertions, 18 deletions
diff --git a/backend/src/driver/cl_gen_kernel.cpp b/backend/src/driver/cl_gen_kernel.cpp
index 094109f4..989c53bd 100644
--- a/backend/src/driver/cl_gen_kernel.cpp
+++ b/backend/src/driver/cl_gen_kernel.cpp
@@ -167,9 +167,9 @@ cl_int GenGetArgName(cl_kernel kernel, const cl_device_id device, cl_uint index,
}
extern "C"
-cl_int GenGetArgInfo(cl_kernel kernel, const cl_device_id device, cl_uint index,
+cl_int GenGetArgInfo(cl_kernel kernel, const cl_device_id device, cl_uint index, cl_kernel_arg_type *type,
cl_kernel_arg_address_qualifier *qualifier, cl_kernel_arg_access_qualifier *access,
- cl_kernel_arg_type_qualifier *type)
+ cl_kernel_arg_type_qualifier *type_qualifier)
{
Kernel* ker = reinterpret_cast<Kernel*>(getGenKernelPrivate(kernel, device));
if (ker == NULL)
@@ -178,6 +178,21 @@ cl_int GenGetArgInfo(cl_kernel kernel, const cl_device_id device, cl_uint index,
if (index >= ker->getArgNum())
return CL_INVALID_VALUE;
+ gbe_arg_type gbeType = ker->getArgType(index);
+ if (gbeType) {
+ if (gbeType == GBE_ARG_GLOBAL_PTR || gbeType == GBE_ARG_CONSTANT_PTR
+ || gbeType == GBE_ARG_LOCAL_PTR) {
+ *type = CL_KERNEL_ARG_PTR;
+ } else if (gbeType == GBE_ARG_VALUE) {
+ *type = CL_KERNEL_ARG_VALUE;
+ } else if (gbeType == GBE_ARG_IMAGE) {
+ *type = CL_KERNEL_ARG_IMAGE;
+ } else if (gbeType == GBE_ARG_SAMPLER) {
+ *type = CL_KERNEL_ARG_SAMPLER;
+ } else
+ GBE_ASSERT(0);
+ }
+
KernelArgument::ArgInfo* info = ker->getArgInfo(index);
if (info == NULL)
return CL_INVALID_VALUE;
@@ -210,18 +225,18 @@ cl_int GenGetArgInfo(cl_kernel kernel, const cl_device_id device, cl_uint index,
}
}
- if (type) {
+ if (type_qualifier) {
cl_kernel_arg_type_qualifier type_qual = CL_KERNEL_ARG_TYPE_NONE;
- if (strstr((char*)ret_info, "const") &&
- (arg_type == GBE_ARG_GLOBAL_PTR ||
- arg_type == GBE_ARG_CONSTANT_PTR ||
- arg_type == GBE_ARG_LOCAL_PTR))
+ if (strstr(info->typeQual.c_str(), "const") &&
+ (gbeType == GBE_ARG_GLOBAL_PTR ||
+ gbeType == GBE_ARG_CONSTANT_PTR ||
+ gbeType == GBE_ARG_LOCAL_PTR))
type_qual = type_qual | CL_KERNEL_ARG_TYPE_CONST;
- if (strstr((char*)ret_info, "volatile"))
+ if (strstr(info->typeQual.c_str(), "volatile"))
type_qual = type_qual | CL_KERNEL_ARG_TYPE_VOLATILE;
- if (strstr((char*)ret_info, "restrict"))
+ if (strstr(info->typeQual.c_str(), "restrict"))
type_qual = type_qual | CL_KERNEL_ARG_TYPE_RESTRICT;
- *(cl_kernel_arg_type_qualifier *)param_value = type_qual;
+ *type_qualifier = type_qual;
}
return CL_SUCCESS;
diff --git a/include/cl_driver.h b/include/cl_driver.h
index 4c71c913..83e2593f 100644
--- a/include/cl_driver.h
+++ b/include/cl_driver.h
@@ -19,6 +19,7 @@
#define __CL_DRIVER_H__
#include "CL/cl.h"
+#include "cl_kernel.h"
/* We put a header to identify each object. This will make the programmer life
* easy if objects are wrongly used in the API
@@ -54,8 +55,8 @@ typedef struct _cl_driver {
cl_int (*get_arg_name)(cl_kernel kernel, const cl_device_id device, cl_uint index,
char *name, cl_uint name_sz, cl_uint* ret_sz);
cl_int (*get_arg_info)(cl_kernel kernel, const cl_device_id device, cl_uint index,
- cl_kernel_arg_address_qualifier *qualifier, cl_kernel_arg_access_qualifier *access,
- cl_kernel_arg_type_qualifier *type);
+ cl_kernel_arg_type *type, cl_kernel_arg_address_qualifier *qualifier,
+ cl_kernel_arg_access_qualifier *access, cl_kernel_arg_type_qualifier *type_qualifier);
diff --git a/libclapi/cl_kernel.c b/libclapi/cl_kernel.c
index 229a00a0..a99f8bca 100644
--- a/libclapi/cl_kernel.c
+++ b/libclapi/cl_kernel.c
@@ -29,9 +29,10 @@
#include "cl_device_id.h"
static cl_argument cl_argument_new(cl_kernel kernel, cl_uint index, const char* name,
+ cl_kernel_arg_type type,
cl_kernel_arg_address_qualifier qualifier,
cl_kernel_arg_access_qualifier access,
- cl_kernel_arg_type_qualifier type)
+ cl_kernel_arg_type_qualifier type_qualifier)
{
cl_argument arg = NULL;
arg = CALLOC(struct _cl_argument);
@@ -47,6 +48,7 @@ static cl_argument cl_argument_new(cl_kernel kernel, cl_uint index, const char*
arg->qualifier = qualifier;
arg->access = access;
arg->type = type;
+ arg->type_qualifier = type_qualifier;
arg->index = index;
strcpy(arg->name, name);
kernel->args[index] = arg;
@@ -210,9 +212,10 @@ LOCAL cl_kernel cl_create_kernel(cl_program p, const char* kernel_name, cl_int*
cl_uint i, j;
char *name = NULL;
cl_uint name_sz = 0;
+ cl_kernel_arg_type type;
cl_kernel_arg_address_qualifier qualifier;
cl_kernel_arg_access_qualifier access;
- cl_kernel_arg_type_qualifier type;
+ cl_kernel_arg_type_qualifier type_qualifier;
k = cl_kernel_new(p, kernel_name);
if (UNLIKELY(k == NULL)) {
@@ -265,9 +268,10 @@ LOCAL cl_kernel cl_create_kernel(cl_program p, const char* kernel_name, cl_int*
for (j = 0; j < k->arg_num; k++) {
for (i = 0; i < p->ctx->device_num; i++) {
+ cl_kernel_arg_type ty;
cl_kernel_arg_address_qualifier ql;
cl_kernel_arg_access_qualifier ac;
- cl_kernel_arg_type_qualifier ty;
+ cl_kernel_arg_type_qualifier tyq;
if (p->valid[i] == 0) // We do not build for that device.
continue;
@@ -298,19 +302,20 @@ LOCAL cl_kernel cl_create_kernel(cl_program p, const char* kernel_name, cl_int*
}
}
- err = p->ctx->devices[i]->driver->get_arg_info(k, p->ctx->devices[i], j, &ql, &ac, &ty);
+ err = p->ctx->devices[i]->driver->get_arg_info(k, p->ctx->devices[i], j, &ty, &ql, &ac, &tyq);
if (err != CL_SUCCESS) {
err = CL_INVALID_PROGRAM_EXECUTABLE;
goto error;
}
if ((qualifier && qualifier != ql)
|| (access && access != ac)
- || (type && type != ty)) {
+ || (type && type != ty)
+ || (type_qualifier && type_qualifier != tyq)) {
err = CL_INVALID_PROGRAM_EXECUTABLE;
goto error;
}
- if (cl_argument_new(k, j, name, qualifier, access, type) == NULL) {
+ if (cl_argument_new(k, j, name, type, qualifier, access, type_qualifier) == NULL) {
err = CL_OUT_OF_HOST_MEMORY;
goto error;
}
@@ -322,6 +327,7 @@ LOCAL cl_kernel cl_create_kernel(cl_program p, const char* kernel_name, cl_int*
qualifier= 0;
access = 0;
type = 0;
+ type_qualifier = 0;
}
if (name)