summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenis Steckelmacher <steckdenis@yahoo.fr>2011-07-11 10:43:54 +0200
committerDenis Steckelmacher <steckdenis@yahoo.fr>2011-07-11 10:43:54 +0200
commitfd9cfb6f082ba5f8c4f3bf63e710d1fd31c08909 (patch)
tree75235a1bbdf3473ba705008ccf56ea75da0b1ab9
parente1a734b1064bda51ebd910208fc5e4f6a1bef5f8 (diff)
Implement clGetKernelInfo.
-rw-r--r--src/api/api_kernel.cpp6
-rw-r--r--src/core/kernel.cpp56
-rw-r--r--src/core/kernel.h29
-rw-r--r--src/core/program.cpp2
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: