From a22fc37c0b988ae68efe930e376c0b59156876c9 Mon Sep 17 00:00:00 2001
From: Yichao Yu <yyc1992@gmail.com>
Date: Fri, 20 Jun 2014 21:14:15 +0800
Subject: [PATCH] Buffer.get_sub_region

---
 pyopencl/c_wrapper/wrap_cl_core.h |  2 ++
 pyopencl/cffi_cl.py               |  9 ++++++++-
 src/c_wrapper/buffer.cpp          | 17 ++++++++++++++---
 3 files changed, 24 insertions(+), 4 deletions(-)

diff --git a/pyopencl/c_wrapper/wrap_cl_core.h b/pyopencl/c_wrapper/wrap_cl_core.h
index c0037999..9d760492 100644
--- a/pyopencl/c_wrapper/wrap_cl_core.h
+++ b/pyopencl/c_wrapper/wrap_cl_core.h
@@ -76,6 +76,8 @@ error *command_queue__flush(clobj_t queue);
 // Buffer
 error *create_buffer(clobj_t *buffer, clobj_t context, cl_mem_flags flags,
                      size_t size, void *hostbuf);
+error *buffer__get_sub_region(clobj_t *_sub_buf, clobj_t _buf, size_t orig,
+                              size_t size, cl_mem_flags flags);
 // Memory Object
 error *memory_object__release(clobj_t obj);
 // Memory Map
diff --git a/pyopencl/cffi_cl.py b/pyopencl/cffi_cl.py
index 00174119..d9cf40c2 100644
--- a/pyopencl/cffi_cl.py
+++ b/pyopencl/cffi_cl.py
@@ -720,6 +720,14 @@ class Buffer(MemoryObject):
             ptr_buffer, context.ptr, flags, size, c_hostbuf))
         self.ptr = ptr_buffer[0]
 
+    def get_sub_region(self, origin, size, flags=0):
+        _sub_buf = _ffi.new('clobj_t*')
+        _handle_error(_lib.buffer__get_sub_region(_sub_buf, self.ptr, orig,
+                                                  size, flags))
+        sub_buf = self._create(_sub_buf[0])
+        MemoryObject.__init__(sub_buf, None)
+        sub_buf._handle_buf_flags(flags)
+
     # TODO __getitem__ ?
 
 # }}}
@@ -867,7 +875,6 @@ class NannyEvent(Event):
 #   UserEvent
 #   enqueue_migrate_mem_objects
 #   enqueue_migrate_mem_objects_ext
-#   create_sub_buffer
 
 # }}}
 
diff --git a/src/c_wrapper/buffer.cpp b/src/c_wrapper/buffer.cpp
index b0775d65..36d10bb0 100644
--- a/src/c_wrapper/buffer.cpp
+++ b/src/c_wrapper/buffer.cpp
@@ -151,10 +151,10 @@ enqueue_fill_buffer(clobj_t *evt, clobj_t _queue, clobj_t _mem, void *pattern,
         });
 }
 
-// {{{ rectangular transfers
-
 #if PYOPENCL_CL_VERSION >= 0x1010
 
+// {{{ rectangular transfers
+
 error*
 enqueue_read_buffer_rect(clobj_t *evt, clobj_t _queue, clobj_t _mem, void *buf,
                          const size_t *_buf_orig, size_t buf_orig_l,
@@ -233,5 +233,16 @@ enqueue_copy_buffer_rect(clobj_t *evt, clobj_t _queue, clobj_t _src,
         });
 }
 
-#endif
 // }}}
+
+error*
+buffer__get_sub_region(clobj_t *_sub_buf, clobj_t _buf, size_t orig,
+                       size_t size, cl_mem_flags flags)
+{
+    auto buf = static_cast<buffer*>(_buf);
+    return c_handle_error([&] {
+            *_sub_buf = buf->get_sub_region(orig, size, flags);
+        });
+}
+
+#endif
-- 
GitLab