diff --git a/TODOs b/TODOs index b34b882c6356d10137f6cfe6b6a5970fb3e11533..9c826a551a705d83f46a6d2b80314fd2a24be33f 100644 --- a/TODOs +++ b/TODOs @@ -5,7 +5,6 @@ - enqueue_nd_range_kernel size/offset mess - CommandQueue.set_property -- _Program.create_with_built_in_kernels - _Program.compile - _Program.link - _Program.all_kernels diff --git a/pyopencl/c_wrapper/wrap_cl_core.h b/pyopencl/c_wrapper/wrap_cl_core.h index b50ab024e5b715e48e75301bc85db4a69e75db9a..396014b9873e5d15a21fb185862a7109f8b74465 100644 --- a/pyopencl/c_wrapper/wrap_cl_core.h +++ b/pyopencl/c_wrapper/wrap_cl_core.h @@ -109,6 +109,10 @@ error *program__build(clobj_t program, const char *options, error *program__kind(clobj_t program, int *kind); error *program__get_build_info(clobj_t program, clobj_t device, cl_program_build_info param, generic_info *out); +error *program__create_with_builtin_kernels(clobj_t *_prg, clobj_t _ctx, + const clobj_t *_devs, + uint32_t num_devs, + const char *names); // Sampler error *create_sampler(clobj_t *sampler, clobj_t context, int norm_coords, cl_addressing_mode am, cl_filter_mode fm); diff --git a/pyopencl/cffi_cl.py b/pyopencl/cffi_cl.py index f7043b8ba4b96299df7b96047405d7debd2d14d7..422fad543e16767c63f5eff118f493bca2d25d24 100644 --- a/pyopencl/cffi_cl.py +++ b/pyopencl/cffi_cl.py @@ -881,6 +881,14 @@ class _Program(_Common): self.ptr, device.ptr, param, info)) return _generic_info_to_python(info) + @classmethod + def create_with_builtin_kernels(cls, context, devices, kernel_names): + _devs, num_devs = _clobj_list(devices) + _prg = _ffi.new('clobj_t*') + _handle_error(_lib.program__create_with_builtin_kernels( + _prg, context.ptr, _devs, num_devs, _to_cstring(kernel_names))) + return cls._create(_prg[0]) + # }}} diff --git a/src/c_wrapper/program.cpp b/src/c_wrapper/program.cpp index 87611fb4f805ce372692d9c724b23f3231541190..286649cc30d6d6e29c59b2df1d5d2f8e624d018e 100644 --- a/src/c_wrapper/program.cpp +++ b/src/c_wrapper/program.cpp @@ -169,3 +169,19 @@ program__get_build_info(clobj_t _prog, clobj_t _dev, *out = prog->get_build_info(dev, param); }); } + +#if PYOPENCL_CL_VERSION >= 0x1020 +error* +program__create_with_builtin_kernels(clobj_t *_prg, clobj_t _ctx, + const clobj_t *_devs, uint32_t num_devs, + const char *names) +{ + const auto devs = buf_from_class(_devs, num_devs); + auto ctx = static_cast(_ctx); + return c_handle_error([&] { + auto prg = pyopencl_call_guarded(clCreateProgramWithBuiltInKernels, + ctx, devs, names); + *_prg = new_program(prg); + }); +} +#endif