From 8ca06a8271c3e2c2c4fa26c38f317194d37354c0 Mon Sep 17 00:00:00 2001
From: Andreas Kloeckner <inform@tiker.net>
Date: Thu, 18 Aug 2011 05:42:49 -0500
Subject: [PATCH] Widen many of the mem object prototypes to mem object
 holders.

---
 pyopencl/__init__.py           | 104 ++++++++++++++++++---------------
 src/wrapper/wrap_cl.hpp        |  52 +++++++++--------
 src/wrapper/wrap_cl_part_1.cpp |   3 +-
 3 files changed, 89 insertions(+), 70 deletions(-)

diff --git a/pyopencl/__init__.py b/pyopencl/__init__.py
index 4b329c49..b1fcb788 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 63cdf90f..8da68400 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 b4e578b4..6e83c951 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
-- 
GitLab