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
17f0cb66b69904b0a3e4083aa8874af63cf1c14321Kenneth Graunke// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
18f0cb66b69904b0a3e4083aa8874af63cf1c14321Kenneth Graunke// OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19f0cb66b69904b0a3e4083aa8874af63cf1c14321Kenneth Graunke// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20f0cb66b69904b0a3e4083aa8874af63cf1c14321Kenneth Graunke// OTHER DEALINGS IN THE SOFTWARE.
21c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez//
22c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
23c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez#include <cstring>
24c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
25c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez#include "api/util.hpp"
26c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez#include "core/event.hpp"
27c4578d2277155c50c8680849763850cddb8e8ec2Francisco Jerez#include "core/memory.hpp"
28c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
29c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezusing namespace clover;
30c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
31c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jereznamespace {
327d61769e447e47022bea5e9fd415344b45a5a050Francisco Jerez   typedef resource::vector vector_t;
337d61769e447e47022bea5e9fd415344b45a5a050Francisco Jerez
347d61769e447e47022bea5e9fd415344b45a5a050Francisco Jerez   vector_t
357d61769e447e47022bea5e9fd415344b45a5a050Francisco Jerez   vector(const size_t *p) {
367d61769e447e47022bea5e9fd415344b45a5a050Francisco Jerez      return range(p, 3);
377d61769e447e47022bea5e9fd415344b45a5a050Francisco Jerez   }
38c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
39e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   vector_t
40e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   pitch(const vector_t &region, vector_t pitch) {
41e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez      for (auto x : zip(tail(pitch),
42e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez                        map(multiplies(), region, pitch))) {
43e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez         // The spec defines a value of zero as the natural pitch,
44e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez         // i.e. the unaligned size of the previous dimension.
45e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez         if (std::get<0>(x) == 0)
46e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez            std::get<0>(x) = std::get<1>(x);
47e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez      }
48e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez
49e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez      return pitch;
50e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   }
51e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez
52c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   ///
53d70ad1a4f9110d206b079398dc1c3be43894f3e5Francisco Jerez   /// Size of a region in bytes.
54d70ad1a4f9110d206b079398dc1c3be43894f3e5Francisco Jerez   ///
55d70ad1a4f9110d206b079398dc1c3be43894f3e5Francisco Jerez   size_t
56d70ad1a4f9110d206b079398dc1c3be43894f3e5Francisco Jerez   size(const vector_t &pitch, const vector_t &region) {
57d70ad1a4f9110d206b079398dc1c3be43894f3e5Francisco Jerez      if (any_of(is_zero(), region))
58d70ad1a4f9110d206b079398dc1c3be43894f3e5Francisco Jerez         return 0;
59d70ad1a4f9110d206b079398dc1c3be43894f3e5Francisco Jerez      else
60d70ad1a4f9110d206b079398dc1c3be43894f3e5Francisco Jerez         return dot(pitch, region - vector_t{ 0, 1, 1 });
61d70ad1a4f9110d206b079398dc1c3be43894f3e5Francisco Jerez   }
62d70ad1a4f9110d206b079398dc1c3be43894f3e5Francisco Jerez
63d70ad1a4f9110d206b079398dc1c3be43894f3e5Francisco Jerez   ///
64c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   /// Common argument checking shared by memory transfer commands.
65c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   ///
66c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   void
67d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez   validate_common(command_queue &q,
68d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez                   const ref_vector<event> &deps) {
69d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez      if (any_of([&](const event &ev) {
70c4578d2277155c50c8680849763850cddb8e8ec2Francisco Jerez               return ev.context() != q.context();
71d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez            }, deps))
72c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez         throw error(CL_INVALID_CONTEXT);
73e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   }
74c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
75e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   ///
76e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   /// Common error checking for a buffer object argument.
77e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   ///
78e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   void
79e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   validate_object(command_queue &q, buffer &mem, const vector_t &origin,
80e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez                   const vector_t &pitch, const vector_t &region) {
81c4578d2277155c50c8680849763850cddb8e8ec2Francisco Jerez      if (mem.context() != q.context())
82c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez         throw error(CL_INVALID_CONTEXT);
83e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez
84e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez      // The region must fit within the specified pitch,
85e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez      if (any_of(greater(), map(multiplies(), pitch, region), tail(pitch)))
86e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez         throw error(CL_INVALID_VALUE);
87e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez
88e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez      // ...and within the specified object.
898d8d0cb09eb8735a04fc36cc4d0e2dc9f9d460ebTom Stellard      if (dot(pitch, origin) + size(pitch, region) > mem.size())
90e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez         throw error(CL_INVALID_VALUE);
91e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez
92e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez      if (any_of(is_zero(), region))
93e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez         throw error(CL_INVALID_VALUE);
94e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   }
95e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez
96e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   ///
97e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   /// Common error checking for an image argument.
98e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   ///
99e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   void
100e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   validate_object(command_queue &q, image &img,
101e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez                   const vector_t &orig, const vector_t &region) {
102e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez      vector_t size = { img.width(), img.height(), img.depth() };
103e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez
1043d636b47859ba084799a4caa34d22e622487f89eTom Stellard      if (!q.device().image_support())
1053d636b47859ba084799a4caa34d22e622487f89eTom Stellard         throw error(CL_INVALID_OPERATION);
1063d636b47859ba084799a4caa34d22e622487f89eTom Stellard
107c4578d2277155c50c8680849763850cddb8e8ec2Francisco Jerez      if (img.context() != q.context())
108e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez         throw error(CL_INVALID_CONTEXT);
109e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez
110e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez      if (any_of(greater(), orig + region, size))
111e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez         throw error(CL_INVALID_VALUE);
112e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez
113e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez      if (any_of(is_zero(), region))
114e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez         throw error(CL_INVALID_VALUE);
115e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   }
116e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez
117e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   ///
118e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   /// Common error checking for a host pointer argument.
119e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   ///
120e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   void
121e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   validate_object(command_queue &q, const void *ptr, const vector_t &orig,
122e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez                   const vector_t &pitch, const vector_t &region) {
123e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez      if (!ptr)
124e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez         throw error(CL_INVALID_VALUE);
125e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez
126e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez      // The region must fit within the specified pitch.
127e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez      if (any_of(greater(), map(multiplies(), pitch, region), tail(pitch)))
128e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez         throw error(CL_INVALID_VALUE);
129e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   }
130e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez
131e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   ///
132e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   /// Common argument checking for a copy between two buffer objects.
133e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   ///
134e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   void
135e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   validate_copy(command_queue &q, buffer &dst_mem,
136e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez                 const vector_t &dst_orig, const vector_t &dst_pitch,
137e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez                 buffer &src_mem,
138e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez                 const vector_t &src_orig, const vector_t &src_pitch,
139e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez                 const vector_t &region) {
140e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez      if (dst_mem == src_mem) {
141e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez         auto dst_offset = dot(dst_pitch, dst_orig);
142e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez         auto src_offset = dot(src_pitch, src_orig);
143e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez
144e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez         if (interval_overlaps()(
145d70ad1a4f9110d206b079398dc1c3be43894f3e5Francisco Jerez                dst_offset, dst_offset + size(dst_pitch, region),
146d70ad1a4f9110d206b079398dc1c3be43894f3e5Francisco Jerez                src_offset, src_offset + size(src_pitch, region)))
147e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez            throw error(CL_MEM_COPY_OVERLAP);
148e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez      }
149e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   }
150e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez
151e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   ///
152e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   /// Common argument checking for a copy between two image objects.
153e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   ///
154e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   void
155e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   validate_copy(command_queue &q,
156e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez                 image &dst_img, const vector_t &dst_orig,
157e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez                 image &src_img, const vector_t &src_orig,
158e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez                 const vector_t &region) {
159e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez      if (dst_img.format() != src_img.format())
160e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez         throw error(CL_IMAGE_FORMAT_MISMATCH);
161e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez
162e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez      if (dst_img == src_img) {
163e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez         if (all_of(interval_overlaps(),
164e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez                    dst_orig, dst_orig + region,
165e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez                    src_orig, src_orig + region))
166e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez            throw error(CL_MEM_COPY_OVERLAP);
167e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez      }
168c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   }
169c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
170c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   ///
1710e8460a52882ec58743991fec431f85300bea209Serge Martin   /// Checks that the host access flags of the memory object are
1720e8460a52882ec58743991fec431f85300bea209Serge Martin   /// within the allowed set \a flags.
1730e8460a52882ec58743991fec431f85300bea209Serge Martin   ///
1740e8460a52882ec58743991fec431f85300bea209Serge Martin   void
1750e8460a52882ec58743991fec431f85300bea209Serge Martin   validate_object_access(const memory_obj &mem, const cl_mem_flags flags) {
1760e8460a52882ec58743991fec431f85300bea209Serge Martin      if (mem.flags() & ~flags &
1770e8460a52882ec58743991fec431f85300bea209Serge Martin          (CL_MEM_HOST_READ_ONLY | CL_MEM_HOST_WRITE_ONLY |
1780e8460a52882ec58743991fec431f85300bea209Serge Martin           CL_MEM_HOST_NO_ACCESS))
1790e8460a52882ec58743991fec431f85300bea209Serge Martin         throw error(CL_INVALID_OPERATION);
1800e8460a52882ec58743991fec431f85300bea209Serge Martin   }
1810e8460a52882ec58743991fec431f85300bea209Serge Martin
1820e8460a52882ec58743991fec431f85300bea209Serge Martin   ///
183ec73778f1fd6e14623422d62605fc69dc8fb7aa4Bruno Jiménez   /// Checks that the mapping flags are correct.
184ec73778f1fd6e14623422d62605fc69dc8fb7aa4Bruno Jiménez   ///
185ec73778f1fd6e14623422d62605fc69dc8fb7aa4Bruno Jiménez   void
1860e8460a52882ec58743991fec431f85300bea209Serge Martin   validate_map_flags(const memory_obj &mem, const cl_map_flags flags) {
187ec73778f1fd6e14623422d62605fc69dc8fb7aa4Bruno Jiménez      if ((flags & (CL_MAP_WRITE | CL_MAP_READ)) &&
188ec73778f1fd6e14623422d62605fc69dc8fb7aa4Bruno Jiménez          (flags & CL_MAP_WRITE_INVALIDATE_REGION))
189ec73778f1fd6e14623422d62605fc69dc8fb7aa4Bruno Jiménez         throw error(CL_INVALID_VALUE);
1900e8460a52882ec58743991fec431f85300bea209Serge Martin
1910e8460a52882ec58743991fec431f85300bea209Serge Martin      if (flags & CL_MAP_READ)
1920e8460a52882ec58743991fec431f85300bea209Serge Martin         validate_object_access(mem, CL_MEM_HOST_READ_ONLY);
1930e8460a52882ec58743991fec431f85300bea209Serge Martin
1940e8460a52882ec58743991fec431f85300bea209Serge Martin      if (flags & (CL_MAP_WRITE | CL_MAP_WRITE_INVALIDATE_REGION))
1950e8460a52882ec58743991fec431f85300bea209Serge Martin         validate_object_access(mem, CL_MEM_HOST_WRITE_ONLY);
196ec73778f1fd6e14623422d62605fc69dc8fb7aa4Bruno Jiménez   }
197ec73778f1fd6e14623422d62605fc69dc8fb7aa4Bruno Jiménez
198ec73778f1fd6e14623422d62605fc69dc8fb7aa4Bruno Jiménez   ///
199c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   /// Class that encapsulates the task of mapping an object of type
200c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   /// \a T.  The return value of get() should be implicitly
201c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   /// convertible to \a void *.
202c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   ///
203d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez   template<typename T>
204d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez   struct _map {
205d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez      static mapping
206d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez      get(command_queue &q, T obj, cl_map_flags flags,
207d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez          size_t offset, size_t size) {
208d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez         return { q, obj->resource(q), flags, true,
209d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez                  {{ offset }}, {{ size, 1, 1 }} };
210d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez      }
211d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez   };
212c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
213d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez   template<>
214d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez   struct _map<void *> {
215c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      static void *
216d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez      get(command_queue &q, void *obj, cl_map_flags flags,
217c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez          size_t offset, size_t size) {
218c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez         return (char *)obj + offset;
219c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      }
220c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   };
221c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
222d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez   template<>
223d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez   struct _map<const void *> {
224c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      static const void *
225d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez      get(command_queue &q, const void *obj, cl_map_flags flags,
226c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez          size_t offset, size_t size) {
227c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez         return (const char *)obj + offset;
228c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      }
229c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   };
230c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
231c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   ///
232c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   /// Software copy from \a src_obj to \a dst_obj.  They can be
233c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   /// either pointers or memory objects.
234c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   ///
235c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   template<typename T, typename S>
236c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   std::function<void (event &)>
237d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez   soft_copy_op(command_queue &q,
2387d61769e447e47022bea5e9fd415344b45a5a050Francisco Jerez                T dst_obj, const vector_t &dst_orig, const vector_t &dst_pitch,
2397d61769e447e47022bea5e9fd415344b45a5a050Francisco Jerez                S src_obj, const vector_t &src_orig, const vector_t &src_pitch,
2407d61769e447e47022bea5e9fd415344b45a5a050Francisco Jerez                const vector_t &region) {
241d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez      return [=, &q](event &) {
2428e14b82fd2c561cac3e0d5f84d5f67815ad53867Francisco Jerez         auto dst = _map<T>::get(q, dst_obj, CL_MAP_WRITE,
2437d61769e447e47022bea5e9fd415344b45a5a050Francisco Jerez                                 dot(dst_pitch, dst_orig),
244d70ad1a4f9110d206b079398dc1c3be43894f3e5Francisco Jerez                                 size(dst_pitch, region));
2458e14b82fd2c561cac3e0d5f84d5f67815ad53867Francisco Jerez         auto src = _map<S>::get(q, src_obj, CL_MAP_READ,
2467d61769e447e47022bea5e9fd415344b45a5a050Francisco Jerez                                 dot(src_pitch, src_orig),
247d70ad1a4f9110d206b079398dc1c3be43894f3e5Francisco Jerez                                 size(src_pitch, region));
2487d61769e447e47022bea5e9fd415344b45a5a050Francisco Jerez         vector_t v = {};
2497d61769e447e47022bea5e9fd415344b45a5a050Francisco Jerez
2507d61769e447e47022bea5e9fd415344b45a5a050Francisco Jerez         for (v[2] = 0; v[2] < region[2]; ++v[2]) {
2517d61769e447e47022bea5e9fd415344b45a5a050Francisco Jerez            for (v[1] = 0; v[1] < region[1]; ++v[1]) {
2527d61769e447e47022bea5e9fd415344b45a5a050Francisco Jerez               std::memcpy(
2537d61769e447e47022bea5e9fd415344b45a5a050Francisco Jerez                  static_cast<char *>(dst) + dot(dst_pitch, v),
2547d61769e447e47022bea5e9fd415344b45a5a050Francisco Jerez                  static_cast<const char *>(src) + dot(src_pitch, v),
2557d61769e447e47022bea5e9fd415344b45a5a050Francisco Jerez                  src_pitch[0] * region[0]);
256c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez            }
257c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez         }
258c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      };
259c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   }
260c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
261c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   ///
262c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   /// Hardware copy from \a src_obj to \a dst_obj.
263c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   ///
264c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   template<typename T, typename S>
265c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   std::function<void (event &)>
2669968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez   hard_copy_op(command_queue &q, T dst_obj, const vector_t &dst_orig,
2677d61769e447e47022bea5e9fd415344b45a5a050Francisco Jerez                S src_obj, const vector_t &src_orig, const vector_t &region) {
2689968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez      return [=, &q](event &) {
2699968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez         dst_obj->resource(q).copy(q, dst_orig, region,
270c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                                   src_obj->resource(q), src_orig);
271c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      };
272c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   }
273c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez}
274c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
2756230f77232a4703c9f98f569104ac03430a5fb95Francisco JerezCLOVER_API cl_int
276d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco JerezclEnqueueReadBuffer(cl_command_queue d_q, cl_mem d_mem, cl_bool blocking,
277c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                    size_t offset, size_t size, void *ptr,
278257781f243476863591965f22787ff390edd8ba0Francisco Jerez                    cl_uint num_deps, const cl_event *d_deps,
2799968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez                    cl_event *rd_ev) try {
2809968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez   auto &q = obj(d_q);
281e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   auto &mem = obj<buffer>(d_mem);
282257781f243476863591965f22787ff390edd8ba0Francisco Jerez   auto deps = objs<wait_list_tag>(d_deps, num_deps);
283e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   vector_t region = { size, 1, 1 };
284e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   vector_t obj_origin = { offset };
285e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   auto obj_pitch = pitch(region, {{ 1 }});
286257781f243476863591965f22787ff390edd8ba0Francisco Jerez
287e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   validate_common(q, deps);
288e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   validate_object(q, ptr, {}, obj_pitch, region);
289e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   validate_object(q, mem, obj_origin, obj_pitch, region);
2900e8460a52882ec58743991fec431f85300bea209Serge Martin   validate_object_access(mem, CL_MEM_HOST_READ_ONLY);
291c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
292a0d99937a0b4e778cc0b2e93886c814dd8819f6dFrancisco Jerez   auto hev = create<hard_event>(
2939968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez      q, CL_COMMAND_READ_BUFFER, deps,
294e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez      soft_copy_op(q, ptr, {}, obj_pitch,
295e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez                   &mem, obj_origin, obj_pitch,
296e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez                   region));
297c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
2989968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez   ret_object(rd_ev, hev);
299c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   return CL_SUCCESS;
300c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
301c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} catch (error &e) {
302c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   return e.get();
303c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez}
304c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
3056230f77232a4703c9f98f569104ac03430a5fb95Francisco JerezCLOVER_API cl_int
306d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco JerezclEnqueueWriteBuffer(cl_command_queue d_q, cl_mem d_mem, cl_bool blocking,
307c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                     size_t offset, size_t size, const void *ptr,
308257781f243476863591965f22787ff390edd8ba0Francisco Jerez                     cl_uint num_deps, const cl_event *d_deps,
3099968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez                     cl_event *rd_ev) try {
3109968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez   auto &q = obj(d_q);
311e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   auto &mem = obj<buffer>(d_mem);
312257781f243476863591965f22787ff390edd8ba0Francisco Jerez   auto deps = objs<wait_list_tag>(d_deps, num_deps);
313e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   vector_t region = { size, 1, 1 };
314e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   vector_t obj_origin = { offset };
315e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   auto obj_pitch = pitch(region, {{ 1 }});
316257781f243476863591965f22787ff390edd8ba0Francisco Jerez
317e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   validate_common(q, deps);
318e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   validate_object(q, mem, obj_origin, obj_pitch, region);
319e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   validate_object(q, ptr, {}, obj_pitch, region);
3200e8460a52882ec58743991fec431f85300bea209Serge Martin   validate_object_access(mem, CL_MEM_HOST_WRITE_ONLY);
321c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
322a0d99937a0b4e778cc0b2e93886c814dd8819f6dFrancisco Jerez   auto hev = create<hard_event>(
3239968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez      q, CL_COMMAND_WRITE_BUFFER, deps,
324e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez      soft_copy_op(q, &mem, obj_origin, obj_pitch,
325e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez                   ptr, {}, obj_pitch,
326e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez                   region));
327c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
3289968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez   ret_object(rd_ev, hev);
329c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   return CL_SUCCESS;
330c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
331c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} catch (error &e) {
332c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   return e.get();
333c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez}
334c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
3356230f77232a4703c9f98f569104ac03430a5fb95Francisco JerezCLOVER_API cl_int
336d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco JerezclEnqueueReadBufferRect(cl_command_queue d_q, cl_mem d_mem, cl_bool blocking,
337e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez                        const size_t *p_obj_origin,
338e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez                        const size_t *p_host_origin,
339e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez                        const size_t *p_region,
340c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                        size_t obj_row_pitch, size_t obj_slice_pitch,
341c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                        size_t host_row_pitch, size_t host_slice_pitch,
342c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                        void *ptr,
343257781f243476863591965f22787ff390edd8ba0Francisco Jerez                        cl_uint num_deps, const cl_event *d_deps,
3449968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez                        cl_event *rd_ev) try {
3459968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez   auto &q = obj(d_q);
346e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   auto &mem = obj<buffer>(d_mem);
347257781f243476863591965f22787ff390edd8ba0Francisco Jerez   auto deps = objs<wait_list_tag>(d_deps, num_deps);
348e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   auto region = vector(p_region);
349e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   auto obj_origin = vector(p_obj_origin);
350e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   auto obj_pitch = pitch(region, {{ 1, obj_row_pitch, obj_slice_pitch }});
351e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   auto host_origin = vector(p_host_origin);
352e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   auto host_pitch = pitch(region, {{ 1, host_row_pitch, host_slice_pitch }});
353257781f243476863591965f22787ff390edd8ba0Francisco Jerez
354e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   validate_common(q, deps);
355e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   validate_object(q, ptr, host_origin, host_pitch, region);
356e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   validate_object(q, mem, obj_origin, obj_pitch, region);
3570e8460a52882ec58743991fec431f85300bea209Serge Martin   validate_object_access(mem, CL_MEM_HOST_READ_ONLY);
358c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
359a0d99937a0b4e778cc0b2e93886c814dd8819f6dFrancisco Jerez   auto hev = create<hard_event>(
3609968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez      q, CL_COMMAND_READ_BUFFER_RECT, deps,
361e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez      soft_copy_op(q, ptr, host_origin, host_pitch,
362e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez                   &mem, obj_origin, obj_pitch,
363e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez                   region));
364c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
3659968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez   ret_object(rd_ev, hev);
366c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   return CL_SUCCESS;
367c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
368c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} catch (error &e) {
369c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   return e.get();
370c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez}
371c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
3726230f77232a4703c9f98f569104ac03430a5fb95Francisco JerezCLOVER_API cl_int
373d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco JerezclEnqueueWriteBufferRect(cl_command_queue d_q, cl_mem d_mem, cl_bool blocking,
374e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez                         const size_t *p_obj_origin,
375e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez                         const size_t *p_host_origin,
376e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez                         const size_t *p_region,
377c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                         size_t obj_row_pitch, size_t obj_slice_pitch,
378c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                         size_t host_row_pitch, size_t host_slice_pitch,
379c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                         const void *ptr,
380257781f243476863591965f22787ff390edd8ba0Francisco Jerez                         cl_uint num_deps, const cl_event *d_deps,
3819968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez                         cl_event *rd_ev) try {
3829968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez   auto &q = obj(d_q);
383e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   auto &mem = obj<buffer>(d_mem);
384257781f243476863591965f22787ff390edd8ba0Francisco Jerez   auto deps = objs<wait_list_tag>(d_deps, num_deps);
385e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   auto region = vector(p_region);
386e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   auto obj_origin = vector(p_obj_origin);
387e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   auto obj_pitch = pitch(region, {{ 1, obj_row_pitch, obj_slice_pitch }});
388e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   auto host_origin = vector(p_host_origin);
389e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   auto host_pitch = pitch(region, {{ 1, host_row_pitch, host_slice_pitch }});
390257781f243476863591965f22787ff390edd8ba0Francisco Jerez
391e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   validate_common(q, deps);
392e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   validate_object(q, mem, obj_origin, obj_pitch, region);
393e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   validate_object(q, ptr, host_origin, host_pitch, region);
3940e8460a52882ec58743991fec431f85300bea209Serge Martin   validate_object_access(mem, CL_MEM_HOST_WRITE_ONLY);
395c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
396a0d99937a0b4e778cc0b2e93886c814dd8819f6dFrancisco Jerez   auto hev = create<hard_event>(
3979968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez      q, CL_COMMAND_WRITE_BUFFER_RECT, deps,
398e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez      soft_copy_op(q, &mem, obj_origin, obj_pitch,
399e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez                   ptr, host_origin, host_pitch,
400e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez                   region));
401c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
4029968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez   ret_object(rd_ev, hev);
403c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   return CL_SUCCESS;
404c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
405c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} catch (error &e) {
406c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   return e.get();
407c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez}
408c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
4096230f77232a4703c9f98f569104ac03430a5fb95Francisco JerezCLOVER_API cl_int
410d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco JerezclEnqueueCopyBuffer(cl_command_queue d_q, cl_mem d_src_mem, cl_mem d_dst_mem,
411c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                    size_t src_offset, size_t dst_offset, size_t size,
412257781f243476863591965f22787ff390edd8ba0Francisco Jerez                    cl_uint num_deps, const cl_event *d_deps,
4139968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez                    cl_event *rd_ev) try {
4149968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez   auto &q = obj(d_q);
415e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   auto &src_mem = obj<buffer>(d_src_mem);
416e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   auto &dst_mem = obj<buffer>(d_dst_mem);
417257781f243476863591965f22787ff390edd8ba0Francisco Jerez   auto deps = objs<wait_list_tag>(d_deps, num_deps);
418e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   vector_t region = { size, 1, 1 };
419e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   vector_t dst_origin = { dst_offset };
420e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   auto dst_pitch = pitch(region, {{ 1 }});
421e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   vector_t src_origin = { src_offset };
422e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   auto src_pitch = pitch(region, {{ 1 }});
423e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez
424e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   validate_common(q, deps);
425e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   validate_object(q, dst_mem, dst_origin, dst_pitch, region);
426e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   validate_object(q, src_mem, src_origin, src_pitch, region);
427e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   validate_copy(q, dst_mem, dst_origin, dst_pitch,
428e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez                 src_mem, src_origin, src_pitch, region);
429c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
430a0d99937a0b4e778cc0b2e93886c814dd8819f6dFrancisco Jerez   auto hev = create<hard_event>(
4319968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez      q, CL_COMMAND_COPY_BUFFER, deps,
432e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez      hard_copy_op(q, &dst_mem, dst_origin,
433e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez                   &src_mem, src_origin, region));
434c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
4359968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez   ret_object(rd_ev, hev);
436c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   return CL_SUCCESS;
437c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
438c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} catch (error &e) {
439c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   return e.get();
440c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez}
441c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
4426230f77232a4703c9f98f569104ac03430a5fb95Francisco JerezCLOVER_API cl_int
443d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco JerezclEnqueueCopyBufferRect(cl_command_queue d_q, cl_mem d_src_mem,
444d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez                        cl_mem d_dst_mem,
445e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez                        const size_t *p_src_origin, const size_t *p_dst_origin,
446e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez                        const size_t *p_region,
447c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                        size_t src_row_pitch, size_t src_slice_pitch,
448c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                        size_t dst_row_pitch, size_t dst_slice_pitch,
449257781f243476863591965f22787ff390edd8ba0Francisco Jerez                        cl_uint num_deps, const cl_event *d_deps,
4509968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez                        cl_event *rd_ev) try {
4519968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez   auto &q = obj(d_q);
452e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   auto &src_mem = obj<buffer>(d_src_mem);
453e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   auto &dst_mem = obj<buffer>(d_dst_mem);
454257781f243476863591965f22787ff390edd8ba0Francisco Jerez   auto deps = objs<wait_list_tag>(d_deps, num_deps);
455e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   auto region = vector(p_region);
456e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   auto dst_origin = vector(p_dst_origin);
457e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   auto dst_pitch = pitch(region, {{ 1, dst_row_pitch, dst_slice_pitch }});
458e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   auto src_origin = vector(p_src_origin);
459e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   auto src_pitch = pitch(region, {{ 1, src_row_pitch, src_slice_pitch }});
460e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez
461e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   validate_common(q, deps);
462e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   validate_object(q, dst_mem, dst_origin, dst_pitch, region);
463e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   validate_object(q, src_mem, src_origin, src_pitch, region);
464e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   validate_copy(q, dst_mem, dst_origin, dst_pitch,
465e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez                 src_mem, src_origin, src_pitch, region);
466c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
467a0d99937a0b4e778cc0b2e93886c814dd8819f6dFrancisco Jerez   auto hev = create<hard_event>(
4689968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez      q, CL_COMMAND_COPY_BUFFER_RECT, deps,
469e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez      soft_copy_op(q, &dst_mem, dst_origin, dst_pitch,
470e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez                   &src_mem, src_origin, src_pitch,
471e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez                   region));
472c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
4739968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez   ret_object(rd_ev, hev);
474c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   return CL_SUCCESS;
475c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
476c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} catch (error &e) {
477c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   return e.get();
478c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez}
479c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
4806230f77232a4703c9f98f569104ac03430a5fb95Francisco JerezCLOVER_API cl_int
481d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco JerezclEnqueueReadImage(cl_command_queue d_q, cl_mem d_mem, cl_bool blocking,
482e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez                   const size_t *p_origin, const size_t *p_region,
483c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                   size_t row_pitch, size_t slice_pitch, void *ptr,
484257781f243476863591965f22787ff390edd8ba0Francisco Jerez                   cl_uint num_deps, const cl_event *d_deps,
4859968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez                   cl_event *rd_ev) try {
4869968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez   auto &q = obj(d_q);
487d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez   auto &img = obj<image>(d_mem);
488257781f243476863591965f22787ff390edd8ba0Francisco Jerez   auto deps = objs<wait_list_tag>(d_deps, num_deps);
489e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   auto region = vector(p_region);
490e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   auto dst_pitch = pitch(region, {{ img.pixel_size(),
491e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez                                     row_pitch, slice_pitch }});
492e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   auto src_origin = vector(p_origin);
493e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   auto src_pitch = pitch(region, {{ img.pixel_size(),
494e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez                                     img.row_pitch(), img.slice_pitch() }});
495c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
496e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   validate_common(q, deps);
497e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   validate_object(q, ptr, {}, dst_pitch, region);
498e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   validate_object(q, img, src_origin, region);
4990e8460a52882ec58743991fec431f85300bea209Serge Martin   validate_object_access(img, CL_MEM_HOST_READ_ONLY);
500c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
501a0d99937a0b4e778cc0b2e93886c814dd8819f6dFrancisco Jerez   auto hev = create<hard_event>(
5029968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez      q, CL_COMMAND_READ_IMAGE, deps,
503e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez      soft_copy_op(q, ptr, {}, dst_pitch,
504e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez                   &img, src_origin, src_pitch,
505e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez                   region));
506c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
5079968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez   ret_object(rd_ev, hev);
508c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   return CL_SUCCESS;
509c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
510c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} catch (error &e) {
511c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   return e.get();
512c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez}
513c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
5146230f77232a4703c9f98f569104ac03430a5fb95Francisco JerezCLOVER_API cl_int
515d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco JerezclEnqueueWriteImage(cl_command_queue d_q, cl_mem d_mem, cl_bool blocking,
516e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez                    const size_t *p_origin, const size_t *p_region,
517c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                    size_t row_pitch, size_t slice_pitch, const void *ptr,
518257781f243476863591965f22787ff390edd8ba0Francisco Jerez                    cl_uint num_deps, const cl_event *d_deps,
5199968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez                    cl_event *rd_ev) try {
5209968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez   auto &q = obj(d_q);
521d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez   auto &img = obj<image>(d_mem);
522257781f243476863591965f22787ff390edd8ba0Francisco Jerez   auto deps = objs<wait_list_tag>(d_deps, num_deps);
523e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   auto region = vector(p_region);
524e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   auto dst_origin = vector(p_origin);
525e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   auto dst_pitch = pitch(region, {{ img.pixel_size(),
526e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez                                     img.row_pitch(), img.slice_pitch() }});
527e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   auto src_pitch = pitch(region, {{ img.pixel_size(),
528e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez                                     row_pitch, slice_pitch }});
529c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
530e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   validate_common(q, deps);
531e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   validate_object(q, img, dst_origin, region);
532e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   validate_object(q, ptr, {}, src_pitch, region);
5330e8460a52882ec58743991fec431f85300bea209Serge Martin   validate_object_access(img, CL_MEM_HOST_WRITE_ONLY);
534c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
535a0d99937a0b4e778cc0b2e93886c814dd8819f6dFrancisco Jerez   auto hev = create<hard_event>(
5369968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez      q, CL_COMMAND_WRITE_IMAGE, deps,
537e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez      soft_copy_op(q, &img, dst_origin, dst_pitch,
538e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez                   ptr, {}, src_pitch,
539e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez                   region));
540c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
5419968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez   ret_object(rd_ev, hev);
542c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   return CL_SUCCESS;
543c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
544c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} catch (error &e) {
545c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   return e.get();
546c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez}
547c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
5486230f77232a4703c9f98f569104ac03430a5fb95Francisco JerezCLOVER_API cl_int
549d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco JerezclEnqueueCopyImage(cl_command_queue d_q, cl_mem d_src_mem, cl_mem d_dst_mem,
550e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez                   const size_t *p_src_origin, const size_t *p_dst_origin,
551e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez                   const size_t *p_region,
552257781f243476863591965f22787ff390edd8ba0Francisco Jerez                   cl_uint num_deps, const cl_event *d_deps,
5539968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez                   cl_event *rd_ev) try {
5549968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez   auto &q = obj(d_q);
555d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez   auto &src_img = obj<image>(d_src_mem);
556d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez   auto &dst_img = obj<image>(d_dst_mem);
557257781f243476863591965f22787ff390edd8ba0Francisco Jerez   auto deps = objs<wait_list_tag>(d_deps, num_deps);
558e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   auto region = vector(p_region);
559e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   auto dst_origin = vector(p_dst_origin);
560e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   auto src_origin = vector(p_src_origin);
561c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
562e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   validate_common(q, deps);
563e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   validate_object(q, dst_img, dst_origin, region);
564e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   validate_object(q, src_img, src_origin, region);
565e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   validate_copy(q, dst_img, dst_origin, src_img, src_origin, region);
566c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
567a0d99937a0b4e778cc0b2e93886c814dd8819f6dFrancisco Jerez   auto hev = create<hard_event>(
5689968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez      q, CL_COMMAND_COPY_IMAGE, deps,
569e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez      hard_copy_op(q, &dst_img, dst_origin,
570e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez                   &src_img, src_origin,
571e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez                   region));
572c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
5739968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez   ret_object(rd_ev, hev);
574c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   return CL_SUCCESS;
575c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
576c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} catch (error &e) {
577c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   return e.get();
578c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez}
579c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
5806230f77232a4703c9f98f569104ac03430a5fb95Francisco JerezCLOVER_API cl_int
5819968d9daf264b726ee50bbc97937daac4e9c1811Francisco JerezclEnqueueCopyImageToBuffer(cl_command_queue d_q,
582d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez                           cl_mem d_src_mem, cl_mem d_dst_mem,
583e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez                           const size_t *p_src_origin, const size_t *p_region,
584c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                           size_t dst_offset,
585257781f243476863591965f22787ff390edd8ba0Francisco Jerez                           cl_uint num_deps, const cl_event *d_deps,
5869968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez                           cl_event *rd_ev) try {
5879968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez   auto &q = obj(d_q);
588d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez   auto &src_img = obj<image>(d_src_mem);
589e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   auto &dst_mem = obj<buffer>(d_dst_mem);
590257781f243476863591965f22787ff390edd8ba0Francisco Jerez   auto deps = objs<wait_list_tag>(d_deps, num_deps);
591e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   auto region = vector(p_region);
592e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   vector_t dst_origin = { dst_offset };
593e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   auto dst_pitch = pitch(region, {{ src_img.pixel_size() }});
594e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   auto src_origin = vector(p_src_origin);
595e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   auto src_pitch = pitch(region, {{ src_img.pixel_size(),
596e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez                                     src_img.row_pitch(),
597e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez                                     src_img.slice_pitch() }});
598e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez
599e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   validate_common(q, deps);
600e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   validate_object(q, dst_mem, dst_origin, dst_pitch, region);
601e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   validate_object(q, src_img, src_origin, region);
602c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
603a0d99937a0b4e778cc0b2e93886c814dd8819f6dFrancisco Jerez   auto hev = create<hard_event>(
6049968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez      q, CL_COMMAND_COPY_IMAGE_TO_BUFFER, deps,
605e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez      soft_copy_op(q, &dst_mem, dst_origin, dst_pitch,
606e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez                   &src_img, src_origin, src_pitch,
607e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez                   region));
608c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
6099968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez   ret_object(rd_ev, hev);
610c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   return CL_SUCCESS;
611c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
612c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} catch (error &e) {
613c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   return e.get();
614c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez}
615c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
6166230f77232a4703c9f98f569104ac03430a5fb95Francisco JerezCLOVER_API cl_int
6179968d9daf264b726ee50bbc97937daac4e9c1811Francisco JerezclEnqueueCopyBufferToImage(cl_command_queue d_q,
618d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez                           cl_mem d_src_mem, cl_mem d_dst_mem,
619c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                           size_t src_offset,
620e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez                           const size_t *p_dst_origin, const size_t *p_region,
621257781f243476863591965f22787ff390edd8ba0Francisco Jerez                           cl_uint num_deps, const cl_event *d_deps,
6229968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez                           cl_event *rd_ev) try {
6239968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez   auto &q = obj(d_q);
624e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   auto &src_mem = obj<buffer>(d_src_mem);
625d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez   auto &dst_img = obj<image>(d_dst_mem);
626257781f243476863591965f22787ff390edd8ba0Francisco Jerez   auto deps = objs<wait_list_tag>(d_deps, num_deps);
627e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   auto region = vector(p_region);
628e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   auto dst_origin = vector(p_dst_origin);
629e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   auto dst_pitch = pitch(region, {{ dst_img.pixel_size(),
630e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez                                     dst_img.row_pitch(),
631e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez                                     dst_img.slice_pitch() }});
632e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   vector_t src_origin = { src_offset };
633e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   auto src_pitch = pitch(region, {{ dst_img.pixel_size() }});
634e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez
635e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   validate_common(q, deps);
636e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   validate_object(q, dst_img, dst_origin, region);
637e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   validate_object(q, src_mem, src_origin, src_pitch, region);
638c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
639a0d99937a0b4e778cc0b2e93886c814dd8819f6dFrancisco Jerez   auto hev = create<hard_event>(
6409968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez      q, CL_COMMAND_COPY_BUFFER_TO_IMAGE, deps,
641e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez      soft_copy_op(q, &dst_img, dst_origin, dst_pitch,
642e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez                   &src_mem, src_origin, src_pitch,
643e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez                   region));
644c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
6459968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez   ret_object(rd_ev, hev);
646c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   return CL_SUCCESS;
647c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
648c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} catch (error &e) {
649c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   return e.get();
650c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez}
651c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
6526230f77232a4703c9f98f569104ac03430a5fb95Francisco JerezCLOVER_API void *
653d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco JerezclEnqueueMapBuffer(cl_command_queue d_q, cl_mem d_mem, cl_bool blocking,
654c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                   cl_map_flags flags, size_t offset, size_t size,
655257781f243476863591965f22787ff390edd8ba0Francisco Jerez                   cl_uint num_deps, const cl_event *d_deps,
6569968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez                   cl_event *rd_ev, cl_int *r_errcode) try {
6579968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez   auto &q = obj(d_q);
658e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   auto &mem = obj<buffer>(d_mem);
659257781f243476863591965f22787ff390edd8ba0Francisco Jerez   auto deps = objs<wait_list_tag>(d_deps, num_deps);
660e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   vector_t region = { size, 1, 1 };
661e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   vector_t obj_origin = { offset };
662e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   auto obj_pitch = pitch(region, {{ 1 }});
6639968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez
664e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   validate_common(q, deps);
665e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   validate_object(q, mem, obj_origin, obj_pitch, region);
6660e8460a52882ec58743991fec431f85300bea209Serge Martin   validate_map_flags(mem, flags);
667c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
668e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   void *map = mem.resource(q).add_map(q, flags, blocking, obj_origin, region);
669c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
670a0d99937a0b4e778cc0b2e93886c814dd8819f6dFrancisco Jerez   ret_object(rd_ev, create<hard_event>(q, CL_COMMAND_MAP_BUFFER, deps));
6719968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez   ret_error(r_errcode, CL_SUCCESS);
672c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   return map;
673c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
674c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} catch (error &e) {
6759968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez   ret_error(r_errcode, e);
676c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   return NULL;
677c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez}
678c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
6796230f77232a4703c9f98f569104ac03430a5fb95Francisco JerezCLOVER_API void *
680d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco JerezclEnqueueMapImage(cl_command_queue d_q, cl_mem d_mem, cl_bool blocking,
681c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                  cl_map_flags flags,
682e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez                  const size_t *p_origin, const size_t *p_region,
683c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                  size_t *row_pitch, size_t *slice_pitch,
684257781f243476863591965f22787ff390edd8ba0Francisco Jerez                  cl_uint num_deps, const cl_event *d_deps,
6859968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez                  cl_event *rd_ev, cl_int *r_errcode) try {
6869968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez   auto &q = obj(d_q);
687d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez   auto &img = obj<image>(d_mem);
688257781f243476863591965f22787ff390edd8ba0Francisco Jerez   auto deps = objs<wait_list_tag>(d_deps, num_deps);
689e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   auto region = vector(p_region);
690e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   auto origin = vector(p_origin);
691c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
692e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   validate_common(q, deps);
693e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   validate_object(q, img, origin, region);
6940e8460a52882ec58743991fec431f85300bea209Serge Martin   validate_map_flags(img, flags);
695c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
696e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   void *map = img.resource(q).add_map(q, flags, blocking, origin, region);
697c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
698a0d99937a0b4e778cc0b2e93886c814dd8819f6dFrancisco Jerez   ret_object(rd_ev, create<hard_event>(q, CL_COMMAND_MAP_IMAGE, deps));
6999968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez   ret_error(r_errcode, CL_SUCCESS);
700c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   return map;
701c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
702c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} catch (error &e) {
7039968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez   ret_error(r_errcode, e);
704c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   return NULL;
705c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez}
706c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
7076230f77232a4703c9f98f569104ac03430a5fb95Francisco JerezCLOVER_API cl_int
708d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco JerezclEnqueueUnmapMemObject(cl_command_queue d_q, cl_mem d_mem, void *ptr,
709257781f243476863591965f22787ff390edd8ba0Francisco Jerez                        cl_uint num_deps, const cl_event *d_deps,
7109968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez                        cl_event *rd_ev) try {
7119968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez   auto &q = obj(d_q);
712d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez   auto &mem = obj(d_mem);
713257781f243476863591965f22787ff390edd8ba0Francisco Jerez   auto deps = objs<wait_list_tag>(d_deps, num_deps);
714257781f243476863591965f22787ff390edd8ba0Francisco Jerez
715e26ed750668f1eb7aa9c81224bfd0c4a5f72e282Francisco Jerez   validate_common(q, deps);
716c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
717a0d99937a0b4e778cc0b2e93886c814dd8819f6dFrancisco Jerez   auto hev = create<hard_event>(
7189968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez      q, CL_COMMAND_UNMAP_MEM_OBJECT, deps,
7199968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez      [=, &q, &mem](event &) {
720d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez         mem.resource(q).del_map(ptr);
721c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      });
722c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
7239968d9daf264b726ee50bbc97937daac4e9c1811Francisco Jerez   ret_object(rd_ev, hev);
724c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   return CL_SUCCESS;
725c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
726c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} catch (error &e) {
727c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   return e.get();
728c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez}
729a97f1b697b01dca9f72d8559f8269188d76dccc9Serge Martin
730a97f1b697b01dca9f72d8559f8269188d76dccc9Serge MartinCLOVER_API cl_int
731a97f1b697b01dca9f72d8559f8269188d76dccc9Serge MartinclEnqueueMigrateMemObjects(cl_command_queue command_queue,
732a97f1b697b01dca9f72d8559f8269188d76dccc9Serge Martin                           cl_uint num_mem_objects,
733a97f1b697b01dca9f72d8559f8269188d76dccc9Serge Martin                           const cl_mem *mem_objects,
734a97f1b697b01dca9f72d8559f8269188d76dccc9Serge Martin                           cl_mem_migration_flags flags,
735a97f1b697b01dca9f72d8559f8269188d76dccc9Serge Martin                           cl_uint num_events_in_wait_list,
736a97f1b697b01dca9f72d8559f8269188d76dccc9Serge Martin                           const cl_event *event_wait_list,
737a97f1b697b01dca9f72d8559f8269188d76dccc9Serge Martin                           cl_event *event) {
738a97f1b697b01dca9f72d8559f8269188d76dccc9Serge Martin   CLOVER_NOT_SUPPORTED_UNTIL("1.2");
739a97f1b697b01dca9f72d8559f8269188d76dccc9Serge Martin   return CL_INVALID_VALUE;
740a97f1b697b01dca9f72d8559f8269188d76dccc9Serge Martin}
741