diff --git a/pyopencl/c_wrapper/wrap_cl_core.h b/pyopencl/c_wrapper/wrap_cl_core.h index 1393b0e8cff954e90efced39b72f2e37b732c604..bc25d4a99e977204565cfe6a539a0adef6571d05 100644 --- a/pyopencl/c_wrapper/wrap_cl_core.h +++ b/pyopencl/c_wrapper/wrap_cl_core.h @@ -44,7 +44,7 @@ error *_create_command_queue(void **ptr_command_queue, void *ptr_context, void * error *_create_buffer(void **ptr_buffer, void *ptr_context, cl_mem_flags flags, size_t size, void *hostbuf); error *_create_program_with_source(void **ptr_program, void *ptr_context, const char *src); error *_create_program_with_binary(void **ptr_program, void *ptr_context, cl_uint num_devices, void **ptr_devices, cl_uint num_binaries, char **binaries, size_t *binary_sizes); -error *program__build(void *ptr_program, char *options, cl_uint num_devices, void **ptr_devices); +error *program__build(void *ptr_program, const char *options, cl_uint num_devices, void **ptr_devices); error *program__kind(void *ptr_program, int *kind); error *program__get_build_info(void *ptr_program, void *ptr_device, cl_program_build_info param, generic_info *out); @@ -53,7 +53,7 @@ error *_create_sampler(void **ptr_sampler, void *ptr_context, int normalized_coo error *event__get_profiling_info(void *ptr_event, cl_profiling_info param, generic_info *out); error *event__wait(void *ptr_event); -error *_create_kernel(void **ptr_kernel, void *ptr_program, char *name); +error *_create_kernel(void **ptr_kernel, void *ptr_program, const char *name); error *kernel__set_arg_null(void *ptr_kernel, cl_uint arg_index); error *kernel__set_arg_mem(void *ptr_kernel, cl_uint arg_index, void *ptr_mem); error *kernel__set_arg_sampler(void *ptr_kernel, cl_uint arg_index, void *ptr_sampler); diff --git a/pyopencl/cffi_cl.py b/pyopencl/cffi_cl.py index c82a4ae65e5591ddf516ce3a21bed3c816fdddde..0f311f640e0ffdb3b7149804375eea0c911ac6a5 100644 --- a/pyopencl/cffi_cl.py +++ b/pyopencl/cffi_cl.py @@ -38,6 +38,21 @@ from pyopencl._cffi import _ffi, _lib # are we running on pypy? _PYPY = '__pypy__' in sys.builtin_module_names +try: + _unicode = unicode +except: + _unicode = str + _bytes = bytes +else: + try: + _bytes = bytes + except: + _bytes = str + +def _convert_str(s): + if isinstance(s, _unicode): + return s.encode() + return s # {{{ wrapper tools @@ -553,7 +568,7 @@ class _Program(_Common): def _init_source(self, context, src): ptr_program = _ffi.new('void **') _handle_error(_lib._create_program_with_source( - ptr_program, context.ptr, _ffi.new('char[]', src))) + ptr_program, context.ptr, _convert_str(src))) self.ptr = ptr_program[0] def _init_binary(self, context, devices, binaries): @@ -597,7 +612,7 @@ class _Program(_Common): _handle_error( _lib.program__build(self.ptr, - _ffi.new('char[]', options), num_devices, + _convert_str(options), num_devices, _ffi.cast('void**', ptr_devices))) def get_build_info(self, device, param): @@ -616,7 +631,8 @@ class Kernel(_Common): def __init__(self, program, name): ptr_kernel = _ffi.new('void **') - _handle_error(_lib._create_kernel(ptr_kernel, program.ptr, name)) + _handle_error(_lib._create_kernel(ptr_kernel, program.ptr, + _convert_str(name))) self.ptr = ptr_kernel[0] def set_arg(self, arg_index, arg): diff --git a/src/c_wrapper/wrap_cl.cpp b/src/c_wrapper/wrap_cl.cpp index ba0cf69e0cf766a8766102246361a59ff139b081..717e94f0121069d4a81a2da53631be848e621a1b 100644 --- a/src/c_wrapper/wrap_cl.cpp +++ b/src/c_wrapper/wrap_cl.cpp @@ -2362,7 +2362,7 @@ namespace pyopencl } } - void build(char *options, cl_uint num_devices, void **ptr_devices) + void build(const char *options, cl_uint num_devices, void **ptr_devices) { // todo: this function should get a list of device instances, not raw pointers // pointers are for the cffi interface and should not be here @@ -2520,13 +2520,12 @@ namespace pyopencl PYOPENCL_CALL_GUARDED(clRetainKernel, (knl)); } - kernel(program const &prg, std::string const &kernel_name) + kernel(program const &prg, const char *kernel_name) { cl_int status_code; PYOPENCL_PRINT_CALL_TRACE("clCreateKernel"); - m_kernel = clCreateKernel(prg.data(), kernel_name.c_str(), - &status_code); + m_kernel = clCreateKernel(prg.data(), kernel_name, &status_code); if (status_code != CL_SUCCESS) throw pyopencl::error("clCreateKernel", status_code); } @@ -3027,8 +3026,8 @@ void pyopencl_free_pointer_array(void **p, uint32_t size) return 0; } -::error *program__build( - void *ptr_program, char *options, cl_uint num_devices, void **ptr_devices) +::error *program__build(void *ptr_program, const char *options, + cl_uint num_devices, void **ptr_devices) { BEGIN_C_HANDLE_ERROR @@ -3116,7 +3115,8 @@ void pyopencl_free_pointer_array(void **p, uint32_t size) // {{{ kernel -::error *_create_kernel(void **ptr_kernel, void *ptr_program, char *name) { +::error *_create_kernel(void **ptr_kernel, void *ptr_program, + const char *name) { pyopencl::program *prg = static_cast(ptr_program); BEGIN_C_HANDLE_ERROR