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 ®ion, 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 ®ion) { 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 ®ion) { 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 ®ion) { 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 ®ion) { 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 ®ion) { 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 ®ion) { 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 ®ion) { 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 ®ion) { 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