diff --git a/pyopencl/cffi_cl.py b/pyopencl/cffi_cl.py index f1dcf81de857300de3aab3de2808348a0bbfaabb..dbbe762a12f58b2189ae168808cf8b11b261b76d 100644 --- a/pyopencl/cffi_cl.py +++ b/pyopencl/cffi_cl.py @@ -849,6 +849,20 @@ elif sys.version_info >= (2, 7): def _c_buffer_from_obj(obj, writable=False, retain=False): # {{{ fall back to the old CPython buffer protocol API + # {{{ try the numpy array interface first + + # avoid slow ctypes-based buffer interface wrapper + + ary_intf = getattr(obj, "__array_interface__", None) + if ary_intf is not None: + buf_base, is_read_only = ary_intf["data"] + return ( + _ffi.cast('void*', buf_base + ary_intf.get("offset", 0)), + obj.nbytes, + obj) + + # }}} + from pyopencl._buffers import Py_buffer, PyBUF_ANY_CONTIGUOUS, PyBUF_WRITABLE flags = PyBUF_ANY_CONTIGUOUS