diff options
-rw-r--r-- | backend/src/driver/cl_gen_kernel.cpp | 35 | ||||
-rw-r--r-- | include/cl_driver.h | 5 | ||||
-rw-r--r-- | libclapi/cl_kernel.c | 18 |
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) |