summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYang Rong <rong.r.yang@intel.com>2013-10-10 11:44:27 +0800
committerZhigang Gong <zhigang.gong@linux.intel.com>2013-10-10 13:30:12 +0800
commit91389920ce4378a12f54fe6e025192e8e1e19b45 (patch)
tree8bb3939cd1b31ec7701856a0bd5fac87153cf3c8
parent6cd11d8aebbc2f1d7541cc6eec1ae242c2ad8139 (diff)
Implement api clCreateKernelsInProgram.
Signed-off-by: Yang Rong <rong.r.yang@intel.com> Reviewed-by: Zhigang Gong <zhigang.gong@linux.intel.com>
-rw-r--r--src/cl_api.c22
-rw-r--r--src/cl_program.c22
-rw-r--r--src/cl_program.h3
3 files changed, 45 insertions, 2 deletions
diff --git a/src/cl_api.c b/src/cl_api.c
index 4b3f6e25..6036a934 100644
--- a/src/cl_api.c
+++ b/src/cl_api.c
@@ -981,8 +981,26 @@ clCreateKernelsInProgram(cl_program program,
cl_kernel * kernels,
cl_uint * num_kernels_ret)
{
- NOT_IMPLEMENTED;
- return 0;
+ cl_int err = CL_SUCCESS;
+
+ CHECK_PROGRAM (program);
+ if (program->is_built == CL_FALSE) {
+ err = CL_INVALID_PROGRAM_EXECUTABLE;
+ goto error;
+ }
+ if (kernels && num_kernels < program->ker_n) {
+ err = CL_INVALID_VALUE;
+ goto error;
+ }
+
+ if(num_kernels_ret)
+ *num_kernels_ret = program->ker_n;
+
+ if(kernels)
+ err = cl_program_create_kernels_in_program(program, kernels);
+
+error:
+ return err;
}
cl_int
diff --git a/src/cl_program.c b/src/cl_program.c
index a0e01048..7ae8e8a6 100644
--- a/src/cl_program.c
+++ b/src/cl_program.c
@@ -386,3 +386,25 @@ error:
goto exit;
}
+LOCAL cl_int
+cl_program_create_kernels_in_program(cl_program p, cl_kernel* ker)
+{
+ int i = 0;
+
+ if(ker == NULL)
+ return CL_SUCCESS;
+
+ for (i = 0; i < p->ker_n; ++i) {
+ TRY_ALLOC_NO_ERR(ker[i], cl_kernel_dup(p->ker[i]));
+ }
+
+ return CL_SUCCESS;
+
+error:
+ do {
+ cl_kernel_delete(ker[i]);
+ ker[i--] = NULL;
+ } while(i > 0);
+
+ return CL_OUT_OF_HOST_MEMORY;
+}
diff --git a/src/cl_program.h b/src/cl_program.h
index de82fd5b..2cb547a0 100644
--- a/src/cl_program.h
+++ b/src/cl_program.h
@@ -68,6 +68,9 @@ extern void cl_program_add_ref(cl_program);
/* Create a kernel for the OCL user */
extern cl_kernel cl_program_create_kernel(cl_program, const char*, cl_int*);
+/* creates kernel objects for all kernel functions in program. */
+extern cl_int cl_program_create_kernels_in_program(cl_program, cl_kernel*);
+
/* Create a program from OCL source */
extern cl_program
cl_program_create_from_source(cl_context ctx,