File: clCreateKernelsInProgram.c

package info (click to toggle)
pocl 6.0-7
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 25,320 kB
  • sloc: lisp: 149,513; ansic: 103,778; cpp: 54,947; python: 1,513; sh: 949; ruby: 255; pascal: 226; tcl: 180; makefile: 175; java: 72; xml: 49
file content (85 lines) | stat: -rw-r--r-- 3,131 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
/* OpenCL runtime library: clCreateKernelsInProgram 
 * 
 * Author: Kalle Raiskila 2014.
 * This file is in the public domain. 
 */

#include "pocl_cl.h"
#include "pocl_llvm.h"
#include "pocl_intfn.h"


CL_API_ENTRY cl_int CL_API_CALL
POname(clCreateKernelsInProgram)(cl_program      program ,
                         cl_uint         num_kernels ,
                         cl_kernel *     kernels ,
                         cl_uint *       num_kernels_ret ) CL_API_SUFFIX__VERSION_1_0
{
  unsigned idx;

  POCL_RETURN_ERROR_COND ((!IS_CL_OBJECT_VALID (program)), CL_INVALID_PROGRAM);

  POCL_RETURN_ERROR_ON((program->build_status == CL_BUILD_NONE),
    CL_INVALID_PROGRAM_EXECUTABLE, "You must call clBuildProgram first!"
      " (even for programs created with binaries)\n");

  POCL_RETURN_ERROR_ON((program->build_status != CL_BUILD_SUCCESS),
    CL_INVALID_PROGRAM_EXECUTABLE, "Last BuildProgram() was not successful\n");

  assert (program->num_devices != 0);

  POCL_RETURN_ERROR_ON(((kernels != NULL && num_kernels == 0)
                       || (kernels == NULL && num_kernels != 0)),
                       CL_INVALID_VALUE, "kernels & num_kernels must be "
                       "either both set, or both NULL\n");

  cl_uint real_num_kernels = (program->num_builtin_kernels > 0)
                                 ? program->num_builtin_kernels
                                 : program->num_kernels;

  POCL_RETURN_ERROR_ON ((kernels && num_kernels < real_num_kernels),
                        CL_INVALID_VALUE,
                        "kernels is not NULL and num_kernels "
                        "is less than the number of kernels in program\n");

  for (idx = 0; idx < num_kernels; idx++)
    kernels[idx] = NULL;

  if (num_kernels > real_num_kernels)
    num_kernels = real_num_kernels;

  cl_int error_ret;
  if (num_kernels > 0 && kernels != NULL)
    {
      /* Create the kernels in the 'knames' list */
      for (idx = 0; idx < num_kernels; idx++)
        {
          kernels[idx] = POname(clCreateKernel) (program,
                                                 program->kernel_meta[idx].name,
                                                 &error_ret);

          /* Check for errors, clean up & bail.
           * If we happened to pass a invalid kernel name after all
           * that should be treated as a pocl bug, not user error.
           * TODO: what happens if the program is not valid?*/
          assert(error_ret != CL_INVALID_KERNEL_NAME);
          assert(error_ret != CL_INVALID_VALUE);
          if (error_ret != CL_SUCCESS)
            {
              for (; idx>0; idx--)
                POname(clReleaseKernel) (kernels[idx-1]);
              /* If error_ret is INVALID_KERNEL_DEFINITION, returning it here
               * is against the specification. But the specs doesn't say what to
               * do in such a case, and just returning it is the sanest thing
               * to do. */
              return error_ret;
            }
        }
    }

  if (num_kernels_ret)
    *num_kernels_ret = real_num_kernels;

  return CL_SUCCESS;
}
POsym(clCreateKernelsInProgram)