diff --git a/pyopencl/_cffi.py b/pyopencl/_cffi.py index 977376fab8b0e0399768f4c75edec19197b10f49..d72c05388f4645998b05b3d3cb35683c162cb669 100644 --- a/pyopencl/_cffi.py +++ b/pyopencl/_cffi.py @@ -90,15 +90,16 @@ typedef struct _cl_buffer_region { """ -def _get_wrap_header(): +def _get_wrap_header(filename): from pkg_resources import Requirement, resource_filename header_name = resource_filename( - Requirement.parse("pyopencl"), "pyopencl/c_wrapper/wrap_cl_core.h") + Requirement.parse("pyopencl"), "pyopencl/c_wrapper/"+filename) with open(header_name, "rt") as f: return f.read() -_ffi.cdef(_cl_header + "\n" + _get_wrap_header()) +_ffi.cdef(_cl_header) +_ffi.cdef(_get_wrap_header("wrap_cl_core.h")) def _get_wrapcl_so_name(): @@ -109,3 +110,6 @@ def _get_wrapcl_so_name(): return os.path.join(current_directory, "_wrapcl.so") _lib = _ffi.dlopen(_get_wrapcl_so_name()) + +if _lib.pyopencl_have_gl(): + _ffi.cdef(_get_wrap_header("wrap_cl_gl_core.h")) diff --git a/pyopencl/c_wrapper/wrap_cl_core.h b/pyopencl/c_wrapper/wrap_cl_core.h index 0ad5c337a08fea5cc4f526ebba6194b85baadb37..a3b6f54e5a4c434d907fec472f5c2b1b2fe62529 100644 --- a/pyopencl/c_wrapper/wrap_cl_core.h +++ b/pyopencl/c_wrapper/wrap_cl_core.h @@ -1,3 +1,6 @@ +// Everything in here should have a 'pyopencl_' prefix to avoid clashing with +// other libraries imported via CFFI. + typedef enum { KND_UNKNOWN, KND_SOURCE, KND_BINARY } program_kind_type; typedef struct { @@ -32,7 +35,8 @@ typedef struct { } generic_info; -int get_cl_version(void); +int pyopencl_get_cl_version(void); + error *get_platforms(void **ptr_platforms, uint32_t *num_platforms); error *platform__get_devices(void *ptr_platform, void **ptr_devices, uint32_t *num_devices, cl_device_type devtype); error *_create_context(void **ptr_ctx, cl_context_properties *properties, cl_uint num_devices, void **ptr_devices); @@ -76,16 +80,8 @@ intptr_t _int_ptr(void*, class_t); void* _from_int_ptr(void **ptr_out, intptr_t int_ptr_value, class_t); error *_get_info(void *ptr, class_t class_, cl_uint param, generic_info *out); void _delete(void *ptr, class_t class_); -void free_pointer(void*); -void free_pointer_array(void**, uint32_t size); - -unsigned bitlog2(unsigned long v); - -/* gl interop */ +void pyopencl_free_pointer(void*); +void pyopencl_free_pointer_array(void**, uint32_t size); -int have_gl(); -error *_create_from_gl_buffer(void **ptr, void *ptr_context, cl_mem_flags flags, GLuint bufobj); -error *_create_from_gl_renderbuffer(void **ptr, void *ptr_context, cl_mem_flags flags, GLuint bufobj); -error *_enqueue_acquire_gl_objects(void **ptr_event, void *ptr_command_queue, void **ptr_mem_objects, uint32_t num_mem_objects, void **wait_for, uint32_t num_wait_for); -error *_enqueue_release_gl_objects(void **ptr_event, void *ptr_command_queue, void **ptr_mem_objects, uint32_t num_mem_objects, void **wait_for, uint32_t num_wait_for); +int pyopencl_have_gl(); diff --git a/pyopencl/c_wrapper/wrap_cl_gl_core.h b/pyopencl/c_wrapper/wrap_cl_gl_core.h new file mode 100644 index 0000000000000000000000000000000000000000..c362cca1233c2775a088b2022ca2cc869c60e8e4 --- /dev/null +++ b/pyopencl/c_wrapper/wrap_cl_gl_core.h @@ -0,0 +1,7 @@ +// Everything in here should have a 'pyopencl_' prefix to avoid clashing with +// other libraries imported via CFFI. + +error *_create_from_gl_buffer(void **ptr, void *ptr_context, cl_mem_flags flags, GLuint bufobj); +error *_create_from_gl_renderbuffer(void **ptr, void *ptr_context, cl_mem_flags flags, GLuint bufobj); +error *_enqueue_acquire_gl_objects(void **ptr_event, void *ptr_command_queue, void **ptr_mem_objects, uint32_t num_mem_objects, void **wait_for, uint32_t num_wait_for); +error *_enqueue_release_gl_objects(void **ptr_event, void *ptr_command_queue, void **ptr_mem_objects, uint32_t num_mem_objects, void **wait_for, uint32_t num_wait_for); diff --git a/pyopencl/cffi_cl.py b/pyopencl/cffi_cl.py index 094f3e7881f8b0b3262742794e9c432e182b1d35..1502af600f58d84d84cc5cdba9d5255bd4e8f755 100644 --- a/pyopencl/cffi_cl.py +++ b/pyopencl/cffi_cl.py @@ -50,7 +50,7 @@ class _CArray(object): def __del__(self): if self.ptr != _ffi.NULL: - _lib.free_pointer(self.ptr[0]) + _lib.pyopencl_free_pointer(self.ptr[0]) def __getitem__(self, key): return self.ptr[0].__getitem__(key) @@ -62,7 +62,8 @@ class _CArray(object): class _CArrays(_CArray): def __del__(self): - _lib.free_pointer_array(_ffi.cast('void**', self.ptr[0]), self.size[0]) + _lib.pyopencl_free_pointer_array( + _ffi.cast('void**', self.ptr[0]), self.size[0]) super(_CArrays, self).__del__() # }}} @@ -95,7 +96,7 @@ def _generic_info_to_python(info): if type_.endswith(']'): ret = map(ci, value) - _lib.free_pointer(info.value) + _lib.pyopencl_free_pointer(info.value) return ret else: return ci(value) @@ -103,7 +104,7 @@ def _generic_info_to_python(info): ret = _ffi.string(value) elif type_.startswith('char*['): ret = map(_ffi.string, value) - _lib.free_pointer_array(info.value, len(value)) + _lib.pyopencl_free_pointer_array(info.value, len(value)) elif type_.endswith(']'): if type_.startswith('char['): ret = ''.join(a[0] for a in value) @@ -120,7 +121,7 @@ def _generic_info_to_python(info): else: ret = value[0] if info.dontfree == 0: - _lib.free_pointer(info.value) + _lib.pyopencl_free_pointer(info.value) return ret # }}} @@ -179,7 +180,7 @@ class _Common(object): def get_cl_header_version(): - v = _lib.get_cl_version() + v = _lib.pyopencl_get_cl_version() return (v >> (3*4), (v >> (1*4)) & 0xff) @@ -269,8 +270,8 @@ def _handle_error(error): # non-pyopencl exceptions are handled here import exceptions e = exceptions.RuntimeError(_ffi.string(error.msg)) - _lib.free_pointer(error.msg) - _lib.free_pointer(error) + _lib.pyopencl_free_pointer(error.msg) + _lib.pyopencl_free_pointer(error) raise e if error.code == status_code.MEM_OBJECT_ALLOCATION_FAILURE: klass = MemoryError @@ -282,9 +283,9 @@ def _handle_error(error): klass = Error e = klass(routine=_ffi.string(error.routine), code=error.code, msg=_ffi.string(error.msg)) - _lib.free_pointer(error.routine) - _lib.free_pointer(error.msg) - _lib.free_pointer(error) + _lib.pyopencl_free_pointer(error.routine) + _lib.pyopencl_free_pointer(error.msg) + _lib.pyopencl_free_pointer(error) raise e # }}} @@ -790,7 +791,7 @@ def _enqueue_read_image(queue, mem, origin, region, # {{{ gl interop def have_gl(): - return bool(_lib.have_gl()) + return bool(_lib.pyopencl_have_gl()) class GLBuffer(MemoryObject): diff --git a/src/c_wrapper/wrap_cl.cpp b/src/c_wrapper/wrap_cl.cpp index 4d976d86a89de003422c16235bd4329fd5d7a09f..ba2ba1207dad8314feda53637c7ebe4f46a3a3cd 100644 --- a/src/c_wrapper/wrap_cl.cpp +++ b/src/c_wrapper/wrap_cl.cpp @@ -2823,15 +2823,15 @@ namespace pyopencl // {{{ c wrapper -void free_pointer(void *p) +void pyopencl_free_pointer(void *p) { free(p); } -void free_pointer_array(void **p, uint32_t size) +void pyopencl_free_pointer_array(void **p, uint32_t size) { for(uint32_t i = 0; i < size; ++i) - free_pointer(p[i]); + pyopencl_free_pointer(p[i]); } @@ -3336,13 +3336,13 @@ void _delete(void *ptr, class_t class_) { } -int get_cl_version(void) { +int pyopencl_get_cl_version(void) { return PYOPENCL_CL_VERSION; } // {{{ gl interop -int have_gl() { +int pyopencl_have_gl() { #ifdef HAVE_GL return 1; #else diff --git a/src/c_wrapper/wrap_cl.h b/src/c_wrapper/wrap_cl.h index ce039d14b3e8ef3fe30e063d7fdb472bd0a3d968..f15e3deb3e829ddeb63a0ca0eb0d97f2ab2e4ea8 100644 --- a/src/c_wrapper/wrap_cl.h +++ b/src/c_wrapper/wrap_cl.h @@ -64,7 +64,11 @@ extern "C" { #endif #include "wrap_cl_core.h" - + +#ifdef HAVE_GL +#include "wrap_cl_gl_core.h" +#endif + #ifdef __cplusplus } #endif