1c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez//
2c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// Copyright 2012 Francisco Jerez
3c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez//
4c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// Permission is hereby granted, free of charge, to any person obtaining a
5c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// copy of this software and associated documentation files (the "Software"),
6c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// to deal in the Software without restriction, including without limitation
7c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// the rights to use, copy, modify, merge, publish, distribute, sublicense,
8c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// and/or sell copies of the Software, and to permit persons to whom the
9c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// Software is furnished to do so, subject to the following conditions:
10c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez//
11c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// The above copyright notice and this permission notice shall be included in
12c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// all copies or substantial portions of the Software.
13c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez//
14c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
18c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
19c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// SOFTWARE.
21c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez//
22c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
23c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez#include <cstring>
24c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
25c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez#include "api/util.hpp"
26c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez#include "core/event.hpp"
27c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez#include "core/resource.hpp"
28c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
29c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezusing namespace clover;
30c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
31c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jereznamespace {
32c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   typedef resource::point point;
33c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
34c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   ///
35c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   /// Common argument checking shared by memory transfer commands.
36c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   ///
37c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   void
38c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   validate_base(cl_command_queue q, cl_uint num_deps, const cl_event *deps) {
39c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      if (!q)
40c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez         throw error(CL_INVALID_COMMAND_QUEUE);
41c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
42c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      if (bool(num_deps) != bool(deps) ||
43c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez          any_of(is_zero<cl_event>(), deps, deps + num_deps))
44c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez         throw error(CL_INVALID_EVENT_WAIT_LIST);
45c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
46c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      if (any_of([&](const cl_event ev) {
47c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez               return &ev->ctx != &q->ctx;
48c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez            }, deps, deps + num_deps))
49c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez         throw error(CL_INVALID_CONTEXT);
50c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   }
51c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
52c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   ///
53c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   /// Memory object-specific argument checking shared by most memory
54c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   /// transfer commands.
55c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   ///
56c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   void
57c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   validate_obj(cl_command_queue q, cl_mem obj) {
58c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      if (!obj)
59c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez         throw error(CL_INVALID_MEM_OBJECT);
60c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
61c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      if (&obj->ctx != &q->ctx)
62c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez         throw error(CL_INVALID_CONTEXT);
63c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   }
64c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
65c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   ///
66c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   /// Class that encapsulates the task of mapping an object of type
67c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   /// \a T.  The return value of get() should be implicitly
68c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   /// convertible to \a void *.
69c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   ///
70c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   template<typename T> struct __map;
71c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
72c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   template<> struct __map<void *> {
73c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      static void *
74c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      get(cl_command_queue q, void *obj, cl_map_flags flags,
75c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez          size_t offset, size_t size) {
76c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez         return (char *)obj + offset;
77c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      }
78c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   };
79c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
80c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   template<> struct __map<const void *> {
81c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      static const void *
82c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      get(cl_command_queue q, const void *obj, cl_map_flags flags,
83c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez          size_t offset, size_t size) {
84c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez         return (const char *)obj + offset;
85c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      }
86c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   };
87c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
88c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   template<> struct __map<memory_obj *> {
89c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      static mapping
90c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      get(cl_command_queue q, memory_obj *obj, cl_map_flags flags,
91c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez          size_t offset, size_t size) {
92c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez         return { *q, obj->resource(q), flags, true, { offset }, { size }};
93c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      }
94c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   };
95c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
96c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   ///
97c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   /// Software copy from \a src_obj to \a dst_obj.  They can be
98c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   /// either pointers or memory objects.
99c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   ///
100c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   template<typename T, typename S>
101c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   std::function<void (event &)>
102c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   soft_copy_op(cl_command_queue q,
103c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                T dst_obj, const point &dst_orig, const point &dst_pitch,
104c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                S src_obj, const point &src_orig, const point &src_pitch,
105c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                const point &region) {
106c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      return [=](event &) {
107c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez         auto dst = __map<T>::get(q, dst_obj, CL_MAP_WRITE,
108c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                                  dst_pitch(dst_orig), dst_pitch(region));
109c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez         auto src = __map<S>::get(q, src_obj, CL_MAP_READ,
110c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                                  src_pitch(src_orig), src_pitch(region));
111c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez         point p;
112c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
113c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez         for (p[2] = 0; p[2] < region[2]; ++p[2]) {
114c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez            for (p[1] = 0; p[1] < region[1]; ++p[1]) {
115c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez               std::memcpy(static_cast<char *>(dst) + dst_pitch(p),
116c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                           static_cast<const char *>(src) + src_pitch(p),
117c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                           src_pitch[0] * region[0]);
118c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez            }
119c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez         }
120c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      };
121c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   }
122c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
123c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   ///
124c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   /// Hardware copy from \a src_obj to \a dst_obj.
125c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   ///
126c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   template<typename T, typename S>
127c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   std::function<void (event &)>
128c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   hard_copy_op(cl_command_queue q, T dst_obj, const point &dst_orig,
129c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                S src_obj, const point &src_orig, const point &region) {
130c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      return [=](event &) {
131c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez         dst_obj->resource(q).copy(*q, dst_orig, region,
132c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                                   src_obj->resource(q), src_orig);
133c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      };
134c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   }
135c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez}
136c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
137c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco JerezPUBLIC cl_int
138c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco JerezclEnqueueReadBuffer(cl_command_queue q, cl_mem obj, cl_bool blocking,
139c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                    size_t offset, size_t size, void *ptr,
140c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                    cl_uint num_deps, const cl_event *deps,
141c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                    cl_event *ev) try {
142c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   validate_base(q, num_deps, deps);
143c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   validate_obj(q, obj);
144c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
145c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   if (!ptr || offset > obj->size() || offset + size > obj->size())
146c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      throw error(CL_INVALID_VALUE);
147c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
148c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   hard_event *hev = new hard_event(
149c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      *q, CL_COMMAND_READ_BUFFER, { deps, deps + num_deps },
150c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      soft_copy_op(q,
151c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                   ptr, { 0 }, { 1 },
152c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                   obj, { offset }, { 1 },
153c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                   { size, 1, 1 }));
154c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
155c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   ret_object(ev, hev);
156c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   return CL_SUCCESS;
157c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
158c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} catch (error &e) {
159c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   return e.get();
160c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez}
161c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
162c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco JerezPUBLIC cl_int
163c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco JerezclEnqueueWriteBuffer(cl_command_queue q, cl_mem obj, cl_bool blocking,
164c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                     size_t offset, size_t size, const void *ptr,
165c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                     cl_uint num_deps, const cl_event *deps,
166c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                     cl_event *ev) try {
167c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   validate_base(q, num_deps, deps);
168c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   validate_obj(q, obj);
169c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
170c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   if (!ptr || offset > obj->size() || offset + size > obj->size())
171c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      throw error(CL_INVALID_VALUE);
172c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
173c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   hard_event *hev = new hard_event(
174c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      *q, CL_COMMAND_WRITE_BUFFER, { deps, deps + num_deps },
175c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      soft_copy_op(q,
176c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                   obj, { offset }, { 1 },
177c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                   ptr, { 0 }, { 1 },
178c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                   { size, 1, 1 }));
179c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
180c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   ret_object(ev, hev);
181c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   return CL_SUCCESS;
182c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
183c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} catch (error &e) {
184c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   return e.get();
185c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez}
186c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
187c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco JerezPUBLIC cl_int
188c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco JerezclEnqueueReadBufferRect(cl_command_queue q, cl_mem obj, cl_bool blocking,
189c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                        const size_t *obj_origin, const size_t *host_origin,
190c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                        const size_t *region,
191c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                        size_t obj_row_pitch, size_t obj_slice_pitch,
192c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                        size_t host_row_pitch, size_t host_slice_pitch,
193c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                        void *ptr,
194c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                        cl_uint num_deps, const cl_event *deps,
195c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                        cl_event *ev) try {
196c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   validate_base(q, num_deps, deps);
197c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   validate_obj(q, obj);
198c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
199c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   if (!ptr)
200c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      throw error(CL_INVALID_VALUE);
201c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
202c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   hard_event *hev = new hard_event(
203c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      *q, CL_COMMAND_READ_BUFFER_RECT, { deps, deps + num_deps },
204c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      soft_copy_op(q,
205c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                   ptr, host_origin,
206c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                   { 1, host_row_pitch, host_slice_pitch },
207c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                   obj, obj_origin,
208c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                   { 1, obj_row_pitch, obj_slice_pitch },
209c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                   region));
210c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
211c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   ret_object(ev, hev);
212c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   return CL_SUCCESS;
213c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
214c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} catch (error &e) {
215c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   return e.get();
216c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez}
217c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
218c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco JerezPUBLIC cl_int
219c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco JerezclEnqueueWriteBufferRect(cl_command_queue q, cl_mem obj, cl_bool blocking,
220c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                         const size_t *obj_origin, const size_t *host_origin,
221c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                         const size_t *region,
222c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                         size_t obj_row_pitch, size_t obj_slice_pitch,
223c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                         size_t host_row_pitch, size_t host_slice_pitch,
224c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                         const void *ptr,
225c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                         cl_uint num_deps, const cl_event *deps,
226c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                         cl_event *ev) try {
227c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   validate_base(q, num_deps, deps);
228c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   validate_obj(q, obj);
229c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
230c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   if (!ptr)
231c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      throw error(CL_INVALID_VALUE);
232c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
233c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   hard_event *hev = new hard_event(
234c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      *q, CL_COMMAND_WRITE_BUFFER_RECT, { deps, deps + num_deps },
235c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      soft_copy_op(q,
236c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                   obj, obj_origin,
237c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                   { 1, obj_row_pitch, obj_slice_pitch },
238c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                   ptr, host_origin,
239c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                   { 1, host_row_pitch, host_slice_pitch },
240c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                   region));
241c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
242c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   ret_object(ev, hev);
243c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   return CL_SUCCESS;
244c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
245c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} catch (error &e) {
246c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   return e.get();
247c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez}
248c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
249c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco JerezPUBLIC cl_int
250c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco JerezclEnqueueCopyBuffer(cl_command_queue q, cl_mem src_obj, cl_mem dst_obj,
251c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                    size_t src_offset, size_t dst_offset, size_t size,
252c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                    cl_uint num_deps, const cl_event *deps,
253c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                    cl_event *ev) try {
254c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   validate_base(q, num_deps, deps);
255c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   validate_obj(q, src_obj);
256c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   validate_obj(q, dst_obj);
257c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
258c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   hard_event *hev = new hard_event(
259c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      *q, CL_COMMAND_COPY_BUFFER, { deps, deps + num_deps },
260c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      hard_copy_op(q, dst_obj, { dst_offset },
261c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                   src_obj, { src_offset },
262c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                   { size, 1, 1 }));
263c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
264c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   ret_object(ev, hev);
265c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   return CL_SUCCESS;
266c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
267c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} catch (error &e) {
268c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   return e.get();
269c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez}
270c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
271c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco JerezPUBLIC cl_int
272c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco JerezclEnqueueCopyBufferRect(cl_command_queue q, cl_mem src_obj, cl_mem dst_obj,
273c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                        const size_t *src_origin, const size_t *dst_origin,
274c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                        const size_t *region,
275c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                        size_t src_row_pitch, size_t src_slice_pitch,
276c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                        size_t dst_row_pitch, size_t dst_slice_pitch,
277c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                        cl_uint num_deps, const cl_event *deps,
278c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                        cl_event *ev) try {
279c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   validate_base(q, num_deps, deps);
280c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   validate_obj(q, src_obj);
281c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   validate_obj(q, dst_obj);
282c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
283c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   hard_event *hev = new hard_event(
284c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      *q, CL_COMMAND_COPY_BUFFER_RECT, { deps, deps + num_deps },
285c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      soft_copy_op(q,
286c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                   dst_obj, dst_origin,
287c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                   { 1, dst_row_pitch, dst_slice_pitch },
288c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                   src_obj, src_origin,
289c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                   { 1, src_row_pitch, src_slice_pitch },
290c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                   region));
291c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
292c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   ret_object(ev, hev);
293c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   return CL_SUCCESS;
294c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
295c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} catch (error &e) {
296c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   return e.get();
297c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez}
298c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
299c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco JerezPUBLIC cl_int
300c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco JerezclEnqueueReadImage(cl_command_queue q, cl_mem obj, cl_bool blocking,
301c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                   const size_t *origin, const size_t *region,
302c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                   size_t row_pitch, size_t slice_pitch, void *ptr,
303c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                   cl_uint num_deps, const cl_event *deps,
304c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                   cl_event *ev) try {
305c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   image *img = dynamic_cast<image *>(obj);
306c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
307c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   validate_base(q, num_deps, deps);
308c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   validate_obj(q, img);
309c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
310c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   if (!ptr)
311c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      throw error(CL_INVALID_VALUE);
312c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
313c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   hard_event *hev = new hard_event(
314c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      *q, CL_COMMAND_READ_IMAGE, { deps, deps + num_deps },
315c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      soft_copy_op(q,
316c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                   ptr, {},
317c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                   { 1, row_pitch, slice_pitch },
318c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                   obj, origin,
319c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                   { 1, img->row_pitch(), img->slice_pitch() },
320c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                   region));
321c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
322c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   ret_object(ev, hev);
323c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   return CL_SUCCESS;
324c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
325c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} catch (error &e) {
326c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   return e.get();
327c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez}
328c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
329c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco JerezPUBLIC cl_int
330c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco JerezclEnqueueWriteImage(cl_command_queue q, cl_mem obj, cl_bool blocking,
331c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                    const size_t *origin, const size_t *region,
332c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                    size_t row_pitch, size_t slice_pitch, const void *ptr,
333c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                    cl_uint num_deps, const cl_event *deps,
334c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                    cl_event *ev) try {
335c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   image *img = dynamic_cast<image *>(obj);
336c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
337c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   validate_base(q, num_deps, deps);
338c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   validate_obj(q, img);
339c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
340c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   if (!ptr)
341c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      throw error(CL_INVALID_VALUE);
342c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
343c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   hard_event *hev = new hard_event(
344c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      *q, CL_COMMAND_WRITE_IMAGE, { deps, deps + num_deps },
345c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      soft_copy_op(q,
346c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                   obj, origin,
347c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                   { 1, img->row_pitch(), img->slice_pitch() },
348c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                   ptr, {},
349c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                   { 1, row_pitch, slice_pitch },
350c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                   region));
351c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
352c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   ret_object(ev, hev);
353c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   return CL_SUCCESS;
354c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
355c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} catch (error &e) {
356c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   return e.get();
357c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez}
358c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
359c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco JerezPUBLIC cl_int
360c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco JerezclEnqueueCopyImage(cl_command_queue q, cl_mem src_obj, cl_mem dst_obj,
361c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                   const size_t *src_origin, const size_t *dst_origin,
362c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                   const size_t *region,
363c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                   cl_uint num_deps, const cl_event *deps,
364c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                   cl_event *ev) try {
365c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   image *src_img = dynamic_cast<image *>(src_obj);
366c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   image *dst_img = dynamic_cast<image *>(dst_obj);
367c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
368c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   validate_base(q, num_deps, deps);
369c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   validate_obj(q, src_img);
370c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   validate_obj(q, dst_img);
371c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
372c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   hard_event *hev = new hard_event(
373c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      *q, CL_COMMAND_COPY_IMAGE, { deps, deps + num_deps },
374c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      hard_copy_op(q, dst_obj, dst_origin, src_obj, src_origin, region));
375c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
376c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   ret_object(ev, hev);
377c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   return CL_SUCCESS;
378c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
379c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} catch (error &e) {
380c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   return e.get();
381c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez}
382c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
383c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco JerezPUBLIC cl_int
384c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco JerezclEnqueueCopyImageToBuffer(cl_command_queue q, cl_mem src_obj, cl_mem dst_obj,
385c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                           const size_t *src_origin, const size_t *region,
386c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                           size_t dst_offset,
387c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                           cl_uint num_deps, const cl_event *deps,
388c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                           cl_event *ev) try {
389c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   image *src_img = dynamic_cast<image *>(src_obj);
390c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
391c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   validate_base(q, num_deps, deps);
392c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   validate_obj(q, src_img);
393c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   validate_obj(q, dst_obj);
394c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
395c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   hard_event *hev = new hard_event(
396c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      *q, CL_COMMAND_COPY_IMAGE_TO_BUFFER, { deps, deps + num_deps },
397c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      soft_copy_op(q,
398c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                   dst_obj, { dst_offset },
399c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                   { 0, 0, 0 },
400c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                   src_obj, src_origin,
401c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                   { 1, src_img->row_pitch(), src_img->slice_pitch() },
402c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                   region));
403c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
404c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   ret_object(ev, hev);
405c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   return CL_SUCCESS;
406c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
407c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} catch (error &e) {
408c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   return e.get();
409c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez}
410c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
411c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco JerezPUBLIC cl_int
412c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco JerezclEnqueueCopyBufferToImage(cl_command_queue q, cl_mem src_obj, cl_mem dst_obj,
413c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                           size_t src_offset,
414c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                           const size_t *dst_origin, const size_t *region,
415c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                           cl_uint num_deps, const cl_event *deps,
416c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                           cl_event *ev) try {
417c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   image *dst_img = dynamic_cast<image *>(src_obj);
418c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
419c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   validate_base(q, num_deps, deps);
420c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   validate_obj(q, src_obj);
421c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   validate_obj(q, dst_img);
422c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
423c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   hard_event *hev = new hard_event(
424c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      *q, CL_COMMAND_COPY_BUFFER_TO_IMAGE, { deps, deps + num_deps },
425c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      soft_copy_op(q,
426c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                   dst_obj, dst_origin,
427c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                   { 1, dst_img->row_pitch(), dst_img->slice_pitch() },
428c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                   src_obj, { src_offset },
429c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                   { 0, 0, 0 },
430c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                   region));
431c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
432c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   ret_object(ev, hev);
433c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   return CL_SUCCESS;
434c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
435c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} catch (error &e) {
436c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   return e.get();
437c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez}
438c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
439c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco JerezPUBLIC void *
440c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco JerezclEnqueueMapBuffer(cl_command_queue q, cl_mem obj, cl_bool blocking,
441c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                   cl_map_flags flags, size_t offset, size_t size,
442c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                   cl_uint num_deps, const cl_event *deps,
443c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                   cl_event *ev, cl_int *errcode_ret) try {
444c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   validate_base(q, num_deps, deps);
445c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   validate_obj(q, obj);
446c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
447c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   if (offset > obj->size() || offset + size > obj->size())
448c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      throw error(CL_INVALID_VALUE);
449c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
450c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   void *map = obj->resource(q).add_map(
451c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      *q, flags, blocking, { offset }, { size });
452c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
453c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   ret_object(ev, new hard_event(*q, CL_COMMAND_MAP_BUFFER,
454c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                                 { deps, deps + num_deps }));
455c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   ret_error(errcode_ret, CL_SUCCESS);
456c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   return map;
457c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
458c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} catch (error &e) {
459c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   ret_error(errcode_ret, e);
460c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   return NULL;
461c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez}
462c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
463c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco JerezPUBLIC void *
464c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco JerezclEnqueueMapImage(cl_command_queue q, cl_mem obj, cl_bool blocking,
465c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                  cl_map_flags flags,
466c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                  const size_t *origin, const size_t *region,
467c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                  size_t *row_pitch, size_t *slice_pitch,
468c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                  cl_uint num_deps, const cl_event *deps,
469c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                  cl_event *ev, cl_int *errcode_ret) try {
470c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   image *img = dynamic_cast<image *>(obj);
471c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
472c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   validate_base(q, num_deps, deps);
473c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   validate_obj(q, img);
474c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
475c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   void *map = obj->resource(q).add_map(
476c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      *q, flags, blocking, origin, region);
477c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
478c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   ret_object(ev, new hard_event(*q, CL_COMMAND_MAP_IMAGE,
479c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                                 { deps, deps + num_deps }));
480c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   ret_error(errcode_ret, CL_SUCCESS);
481c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   return map;
482c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
483c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} catch (error &e) {
484c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   ret_error(errcode_ret, e);
485c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   return NULL;
486c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez}
487c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
488c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco JerezPUBLIC cl_int
489c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco JerezclEnqueueUnmapMemObject(cl_command_queue q, cl_mem obj, void *ptr,
490c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                        cl_uint num_deps, const cl_event *deps,
491c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                        cl_event *ev) try {
492c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   validate_base(q, num_deps, deps);
493c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   validate_obj(q, obj);
494c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
495c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   hard_event *hev = new hard_event(
496c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      *q, CL_COMMAND_UNMAP_MEM_OBJECT, { deps, deps + num_deps },
497c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      [=](event &) {
498c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez         obj->resource(q).del_map(ptr);
499c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      });
500c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
501c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   ret_object(ev, hev);
502c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   return CL_SUCCESS;
503c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
504c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} catch (error &e) {
505c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   return e.get();
506c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez}
507