diff options
author | Denis Steckelmacher <steckdenis@yahoo.fr> | 2011-07-11 10:43:54 +0200 |
---|---|---|
committer | Denis Steckelmacher <steckdenis@yahoo.fr> | 2011-07-11 10:43:54 +0200 |
commit | fd9cfb6f082ba5f8c4f3bf63e710d1fd31c08909 (patch) | |
tree | 75235a1bbdf3473ba705008ccf56ea75da0b1ab9 | |
parent | e1a734b1064bda51ebd910208fc5e4f6a1bef5f8 (diff) |
Implement clGetKernelInfo.
-rw-r--r-- | src/api/api_kernel.cpp | 6 | ||||
-rw-r--r-- | src/core/kernel.cpp | 56 | ||||
-rw-r--r-- | src/core/kernel.h | 29 | ||||
-rw-r--r-- | src/core/program.cpp | 2 |
4 files changed, 80 insertions, 13 deletions
diff --git a/src/api/api_kernel.cpp b/src/api/api_kernel.cpp index 94f6ea3..f07d927 100644 --- a/src/api/api_kernel.cpp +++ b/src/api/api_kernel.cpp @@ -148,7 +148,11 @@ clGetKernelInfo(cl_kernel kernel, void * param_value, size_t * param_value_size_ret) { - return 0; + if (!kernel) + return CL_INVALID_KERNEL; + + return kernel->info(param_name, param_value_size, param_value, + param_value_size_ret); } cl_int diff --git a/src/core/kernel.cpp b/src/core/kernel.cpp index f9fcf35..8e5f0af 100644 --- a/src/core/kernel.cpp +++ b/src/core/kernel.cpp @@ -1,4 +1,6 @@ #include "kernel.h" +#include "propertylist.h" +#include "program.h" #include <string> #include <iostream> @@ -57,6 +59,8 @@ Kernel::DeviceDependent &Kernel::deviceDependent(DeviceInterface *device) cl_int Kernel::addFunction(DeviceInterface *device, llvm::Function *function, llvm::Module *module) { + p_name = function->getNameStr(); + // Add a device dependent DeviceDependent dep; @@ -263,3 +267,55 @@ Program *Kernel::program() const { return p_program; } + +cl_int Kernel::info(cl_context_info param_name, + size_t param_value_size, + void *param_value, + size_t *param_value_size_ret) +{ + void *value = 0; + size_t value_length = 0; + + union { + cl_uint cl_uint_var; + cl_program cl_program_var; + cl_context cl_context_var; + }; + + switch (param_name) + { + case CL_KERNEL_FUNCTION_NAME: + MEM_ASSIGN(p_name.size() + 1, p_name.c_str()); + break; + + case CL_KERNEL_NUM_ARGS: + SIMPLE_ASSIGN(cl_uint, p_args.size()); + break; + + case CL_KERNEL_REFERENCE_COUNT: + SIMPLE_ASSIGN(cl_uint, p_references); + break; + + case CL_KERNEL_CONTEXT: + SIMPLE_ASSIGN(cl_context, p_program->context()); + break; + + case CL_KERNEL_PROGRAM: + SIMPLE_ASSIGN(cl_program, p_program); + break; + + default: + return CL_INVALID_VALUE; + } + + if (param_value && param_value_size < value_length) + return CL_INVALID_VALUE; + + if (param_value_size_ret) + *param_value_size_ret = value_length; + + if (param_value) + std::memcpy(param_value, value, value_length); + + return CL_SUCCESS; +} diff --git a/src/core/kernel.h b/src/core/kernel.h index accc8a5..219fc15 100644 --- a/src/core/kernel.h +++ b/src/core/kernel.h @@ -4,6 +4,7 @@ #include <CL/cl.h> #include <vector> +#include <string> namespace llvm { @@ -33,6 +34,23 @@ class Kernel Program *program() const; + cl_int info(cl_context_info param_name, + size_t param_value_size, + void *param_value, + size_t *param_value_size_ret); + + private: + Program *p_program; + unsigned int p_references; + std::string p_name; + + struct DeviceDependent + { + DeviceInterface *device; + llvm::Function *function; + llvm::Module *module; + }; + struct Arg { unsigned short vec_dim; @@ -82,17 +100,6 @@ class Kernel size_t valueSize() const; }; - private: - Program *p_program; - unsigned int p_references; - - struct DeviceDependent - { - DeviceInterface *device; - llvm::Function *function; - llvm::Module *module; - }; - std::vector<DeviceDependent> p_device_dependent; std::vector<Arg> p_args; const DeviceDependent &deviceDependent(DeviceInterface *device) const; diff --git a/src/core/program.cpp b/src/core/program.cpp index 1d154dc..a9e0128 100644 --- a/src/core/program.cpp +++ b/src/core/program.cpp @@ -447,7 +447,7 @@ cl_int Program::info(cl_context_info param_name, break; case CL_PROGRAM_SOURCE: - MEM_ASSIGN(p_source.size(), p_source.data()); + MEM_ASSIGN(p_source.size() + 1, p_source.c_str()); break; case CL_PROGRAM_BINARY_SIZES: |