diff --git a/pyopencl/__init__.py b/pyopencl/__init__.py index 4b329c49a9e1a4f7526bc2f5ec649081e75d99d2..b1fcb788f240fc8c5b21a409942d464e14f54e00 100644 --- a/pyopencl/__init__.py +++ b/pyopencl/__init__.py @@ -34,8 +34,8 @@ def _add_functionality(): (_cl.CommandQueue.get_info, _cl.command_queue_info), _cl.Event: (_cl.Event.get_info, _cl.event_info), - _cl.MemoryObject: - (MemoryObject.get_info,_cl.mem_info), + _cl.MemoryObjectHolder: + (MemoryObjectHolder.get_info,_cl.mem_info), _cl.Image: (Image.get_image_info, _cl.image_info), _cl.Kernel: @@ -565,59 +565,71 @@ if _cl.get_cl_header_version() >= (1,1): enqueue_copy_buffer_rect = _mark_copy_deprecated(_cl._enqueue_copy_buffer_rect) def enqueue_copy(queue, dest, src, **kwargs): - if isinstance(dest, Buffer): - if isinstance(src, Buffer): - if "src_origin" in kwargs: - return _cl._enqueue_copy_buffer_rect(queue, src, dest, **kwargs) + if isinstance(dest, MemoryObjectHolder): + if dest.type == mem_object_type.BUFFER: + if isinstance(src, MemoryObjectHolder): + if src.type == mem_object_type.BUFFER: + if "src_origin" in kwargs: + return _cl._enqueue_copy_buffer_rect(queue, src, dest, **kwargs) + else: + kwargs["dst_offset"] = kwargs.pop("dest_offset", 0) + return _cl._enqueue_copy_buffer(queue, src, dest, **kwargs) + elif src.type in [mem_object_type.IMAGE2D, mem_object_type.IMAGE3D]: + return _cl._enqueue_copy_image_to_buffer(queue, src, dest, **kwargs) + else: + raise ValueError("invalid src mem object type") else: - kwargs["dst_offset"] = kwargs.pop("dest_offset", 0) - return _cl._enqueue_copy_buffer(queue, src, dest, **kwargs) - elif isinstance(src, Image): - return _cl._enqueue_copy_image_to_buffer(queue, src, dest, **kwargs) - else: - # assume from-host - if "buffer_origin" in kwargs: - return _cl._enqueue_write_buffer_rect(queue, dest, src, **kwargs) + # assume from-host + if "buffer_origin" in kwargs: + return _cl._enqueue_write_buffer_rect(queue, dest, src, **kwargs) + else: + return _cl._enqueue_write_buffer(queue, dest, src, **kwargs) + + elif dest.type in [mem_object_type.IMAGE2D, mem_object_type.IMAGE3D]: + if isinstance(src, MemoryObjectHolder): + if src.type == mem_object_type.BUFFER: + return _cl._enqueue_copy_buffer_to_image(queue, src, dest, **kwargs) + elif src.type in [mem_object_type.IMAGE2D, mem_object_type.IMAGE3D]: + return _cl._enqueue_copy_image(queue, src, dest, **kwargs) + else: + raise ValueError("invalid src mem object type") else: - return _cl._enqueue_write_buffer(queue, dest, src, **kwargs) - - elif isinstance(dest, Image): - if isinstance(src, Buffer): - return _cl._enqueue_copy_buffer_to_image(queue, src, dest, **kwargs) - elif isinstance(src, Image): - return _cl._enqueue_copy_image(queue, src, dest, **kwargs) - else: - # assume from-host - origin = kwargs.pop("origin") - region = kwargs.pop("region") + # assume from-host + origin = kwargs.pop("origin") + region = kwargs.pop("region") - pitches = kwargs.pop("pitches", (0,0)) - if len(pitches) == 1: - kwargs["row_pitch"], = pitches - else: - kwargs["row_pitch"], kwargs["slice_pitch"] = pitches + pitches = kwargs.pop("pitches", (0,0)) + if len(pitches) == 1: + kwargs["row_pitch"], = pitches + else: + kwargs["row_pitch"], kwargs["slice_pitch"] = pitches - return _cl._enqueue_write_image(queue, dest, origin, region, src, **kwargs) + return _cl._enqueue_write_image(queue, dest, origin, region, src, **kwargs) + else: + raise ValueError("invalid dest mem object type") else: # assume to-host - if isinstance(src, Buffer): - if "buffer_origin" in kwargs: - return _cl._enqueue_read_buffer_rect(queue, src, dest, **kwargs) + if isinstance(src, MemoryObjectHolder): + if src.type == mem_object_type.BUFFER: + if "buffer_origin" in kwargs: + return _cl._enqueue_read_buffer_rect(queue, src, dest, **kwargs) + else: + return _cl._enqueue_read_buffer(queue, src, dest, **kwargs) + elif src.type in [mem_object_type.IMAGE2D, mem_object_type.IMAGE3D]: + origin = kwargs.pop("origin") + region = kwargs.pop("region") + + pitches = kwargs.pop("pitches", (0,0)) + if len(pitches) == 1: + kwargs["row_pitch"], = pitches + else: + kwargs["row_pitch"], kwargs["slice_pitch"] = pitches + + return _cl._enqueue_read_image(queue, src, origin, region, dest, **kwargs) else: - return _cl._enqueue_read_buffer(queue, src, dest, **kwargs) - elif isinstance(src, Image): - origin = kwargs.pop("origin") - region = kwargs.pop("region") - - pitches = kwargs.pop("pitches", (0,0)) - if len(pitches) == 1: - kwargs["row_pitch"], = pitches - else: - kwargs["row_pitch"], kwargs["slice_pitch"] = pitches - - return _cl._enqueue_read_image(queue, src, origin, region, dest, **kwargs) + raise ValueError("invalid src mem object type") else: # assume from-host raise TypeError("enqueue_copy cannot perform host-to-host transfers") diff --git a/src/wrapper/wrap_cl.hpp b/src/wrapper/wrap_cl.hpp index 63cdf90f36033677e76d103d4a4f7ab988fccfa0..8da6840076c86b95bd5ad71e4ef7d5854d3404dd 100644 --- a/src/wrapper/wrap_cl.hpp +++ b/src/wrapper/wrap_cl.hpp @@ -1193,12 +1193,18 @@ namespace pyopencl m_hostbuf = *hostbuf; } - memory_object(memory_object &src) + memory_object(memory_object const &src) : m_valid(true), m_mem(src.m_mem), m_hostbuf(src.m_hostbuf) { PYOPENCL_CALL_GUARDED(clRetainMemObject, (m_mem)); } + memory_object(memory_object_holder const &src) + : m_valid(true), m_mem(src.data()) + { + PYOPENCL_CALL_GUARDED(clRetainMemObject, (m_mem)); + } + void release() { if (!m_valid) @@ -1430,7 +1436,7 @@ namespace pyopencl inline event *enqueue_read_buffer( command_queue &cq, - memory_object &mem, + memory_object_holder &mem, py::object buffer, size_t device_offset, py::object py_wait_for, @@ -1469,7 +1475,7 @@ namespace pyopencl inline event *enqueue_write_buffer( command_queue &cq, - memory_object &mem, + memory_object_holder &mem, py::object buffer, size_t device_offset, py::object py_wait_for, @@ -1508,8 +1514,8 @@ namespace pyopencl inline event *enqueue_copy_buffer( command_queue &cq, - memory_object &src, - memory_object &dst, + memory_object_holder &src, + memory_object_holder &dst, size_t byte_count, size_t src_offset, size_t dst_offset, @@ -1544,7 +1550,7 @@ namespace pyopencl inline event *enqueue_read_buffer_rect( command_queue &cq, - memory_object &mem, + memory_object_holder &mem, py::object buffer, py::object py_buffer_origin, py::object py_host_origin, @@ -1588,7 +1594,7 @@ namespace pyopencl inline event *enqueue_write_buffer_rect( command_queue &cq, - memory_object &mem, + memory_object_holder &mem, py::object buffer, py::object py_buffer_origin, py::object py_host_origin, @@ -1632,8 +1638,8 @@ namespace pyopencl inline event *enqueue_copy_buffer_rect( command_queue &cq, - memory_object &src, - memory_object &dst, + memory_object_holder &src, + memory_object_holder &dst, py::object py_src_origin, py::object py_dst_origin, py::object py_region, @@ -2017,8 +2023,8 @@ namespace pyopencl inline event *enqueue_copy_image( command_queue &cq, - memory_object &src, - memory_object &dest, + memory_object_holder &src, + memory_object_holder &dest, py::object py_src_origin, py::object py_dest_origin, py::object py_region, @@ -2045,8 +2051,8 @@ namespace pyopencl inline event *enqueue_copy_image_to_buffer( command_queue &cq, - memory_object &src, - memory_object &dest, + memory_object_holder &src, + memory_object_holder &dest, py::object py_origin, py::object py_region, size_t offset, @@ -2072,8 +2078,8 @@ namespace pyopencl inline event *enqueue_copy_buffer_to_image( command_queue &cq, - memory_object &src, - memory_object &dest, + memory_object_holder &src, + memory_object_holder &dest, size_t offset, py::object py_origin, py::object py_region, @@ -2107,7 +2113,7 @@ namespace pyopencl void *m_ptr; public: - memory_map(command_queue &cq, memory_object &mem, void *ptr) + memory_map(command_queue &cq, memory_object const &mem, void *ptr) : m_valid(true), m_queue(cq), m_mem(mem), m_ptr(ptr) { } @@ -2143,7 +2149,7 @@ namespace pyopencl inline py::object enqueue_map_buffer( command_queue &cq, - memory_object &buf, + memory_object_holder &buf, cl_map_flags flags, size_t offset, py::object py_shape, py::object dtype, py::object order_py, @@ -2210,7 +2216,7 @@ namespace pyopencl inline py::object enqueue_map_image( command_queue &cq, - memory_object &img, + memory_object_holder &img, cl_map_flags flags, py::object py_origin, py::object py_region, @@ -2699,7 +2705,7 @@ namespace pyopencl return; } - py::extract<memory_object &> ex_mo(arg); + py::extract<memory_object_holder &> ex_mo(arg); if (ex_mo.check()) { set_arg_mem(arg_index, ex_mo()); @@ -3050,7 +3056,7 @@ namespace pyopencl inline - py::tuple get_gl_object_info(memory_object const &mem) + py::tuple get_gl_object_info(memory_object_holder const &mem) { cl_gl_object_type otype; GLuint gl_name; @@ -3069,7 +3075,7 @@ namespace pyopencl \ std::vector<cl_mem> mem_objects; \ PYTHON_FOREACH(mo, py_mem_objects) \ - mem_objects.push_back(py::extract<memory_object &>(mo)().data()); \ + mem_objects.push_back(py::extract<memory_object_holder &>(mo)().data()); \ \ cl_event evt; \ PYOPENCL_CALL_GUARDED(clEnqueue##What##GLObjects, ( \ @@ -3233,8 +3239,8 @@ namespace pyopencl py::object shape, py::object dtype, py::object order_py) { - memory_object const &mem_obj = - py::extract<memory_object const &>(mem_obj_py); + memory_object_holder const &mem_obj = + py::extract<memory_object_holder const &>(mem_obj_py); PyArray_Descr *tp_descr; if (PyArray_DescrConverter(dtype.ptr(), &tp_descr) != NPY_SUCCEED) throw py::error_already_set(); diff --git a/src/wrapper/wrap_cl_part_1.cpp b/src/wrapper/wrap_cl_part_1.cpp index b4e578b4e6fe6800585b736b6c9d062bac086805..6e83c951dd1707b2dd4773e96e53b23f1ef07d5b 100644 --- a/src/wrapper/wrap_cl_part_1.cpp +++ b/src/wrapper/wrap_cl_part_1.cpp @@ -172,6 +172,8 @@ void pyopencl_expose_part_1() ; } + // }}} + // {{{ transfers // {{{ byte-for-byte @@ -237,7 +239,6 @@ void pyopencl_expose_part_1() // }}} - // }}} } // vim: foldmethod=marker