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