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 "api/util.hpp" 24c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez#include "core/memory.hpp" 25c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez#include "core/format.hpp" 26c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 27c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezusing namespace clover; 28c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 29c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco JerezPUBLIC cl_mem 30c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco JerezclCreateBuffer(cl_context ctx, cl_mem_flags flags, size_t size, 31c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez void *host_ptr, cl_int *errcode_ret) try { 32c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez if (!ctx) 33c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez throw error(CL_INVALID_CONTEXT); 34c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 35c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez if (bool(host_ptr) != bool(flags & (CL_MEM_USE_HOST_PTR | 36c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez CL_MEM_COPY_HOST_PTR))) 37c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez throw error(CL_INVALID_HOST_PTR); 38c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 39c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez if (!size) 40c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez throw error(CL_INVALID_BUFFER_SIZE); 41c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 4287280d56a375fcfc9231e72963439f9a370c408aBlaž Tomažič if (flags & ~(CL_MEM_READ_WRITE | CL_MEM_WRITE_ONLY | CL_MEM_READ_ONLY | 43c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez CL_MEM_USE_HOST_PTR | CL_MEM_ALLOC_HOST_PTR | 44c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez CL_MEM_COPY_HOST_PTR)) 45c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez throw error(CL_INVALID_VALUE); 46c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 47c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez ret_error(errcode_ret, CL_SUCCESS); 48c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return new root_buffer(*ctx, flags, size, host_ptr); 49c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 50c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} catch (error &e) { 51c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez ret_error(errcode_ret, e); 52c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return NULL; 53c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 54c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 55c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco JerezPUBLIC cl_mem 56c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco JerezclCreateSubBuffer(cl_mem obj, cl_mem_flags flags, cl_buffer_create_type op, 57c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez const void *op_info, cl_int *errcode_ret) try { 58c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez root_buffer *parent = dynamic_cast<root_buffer *>(obj); 59c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 60c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez if (!parent) 61c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez throw error(CL_INVALID_MEM_OBJECT); 62c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 63c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez if ((flags & (CL_MEM_USE_HOST_PTR | 64c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez CL_MEM_ALLOC_HOST_PTR | 65c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez CL_MEM_COPY_HOST_PTR)) || 66c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez (~flags & parent->flags() & (CL_MEM_READ_ONLY | 67c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez CL_MEM_WRITE_ONLY))) 68c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez throw error(CL_INVALID_VALUE); 69c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 70c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez if (op == CL_BUFFER_CREATE_TYPE_REGION) { 71c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez const cl_buffer_region *reg = (const cl_buffer_region *)op_info; 72c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 73c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez if (!reg || 74c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez reg->origin > parent->size() || 75c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez reg->origin + reg->size > parent->size()) 76c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez throw error(CL_INVALID_VALUE); 77c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 78c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez if (!reg->size) 79c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez throw error(CL_INVALID_BUFFER_SIZE); 80c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 81c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez ret_error(errcode_ret, CL_SUCCESS); 82c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return new sub_buffer(*parent, flags, reg->origin, reg->size); 83c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 84c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez } else { 85c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez throw error(CL_INVALID_VALUE); 86c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez } 87c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 88c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} catch (error &e) { 89c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez ret_error(errcode_ret, e); 90c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return NULL; 91c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 92c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 93c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco JerezPUBLIC cl_mem 94c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco JerezclCreateImage2D(cl_context ctx, cl_mem_flags flags, 95c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez const cl_image_format *format, 96c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez size_t width, size_t height, size_t row_pitch, 97c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez void *host_ptr, cl_int *errcode_ret) try { 98c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez if (!ctx) 99c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez throw error(CL_INVALID_CONTEXT); 100c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 10187280d56a375fcfc9231e72963439f9a370c408aBlaž Tomažič if (flags & ~(CL_MEM_READ_WRITE | CL_MEM_WRITE_ONLY | CL_MEM_READ_ONLY | 102c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez CL_MEM_USE_HOST_PTR | CL_MEM_ALLOC_HOST_PTR | 103c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez CL_MEM_COPY_HOST_PTR)) 104c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez throw error(CL_INVALID_VALUE); 105c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 106c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez if (!format) 107c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez throw error(CL_INVALID_IMAGE_FORMAT_DESCRIPTOR); 108c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 109c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez if (width < 1 || height < 1) 110c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez throw error(CL_INVALID_IMAGE_SIZE); 111c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 112c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez if (bool(host_ptr) != bool(flags & (CL_MEM_USE_HOST_PTR | 113c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez CL_MEM_COPY_HOST_PTR))) 114c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez throw error(CL_INVALID_HOST_PTR); 115c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 116c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez if (!supported_formats(ctx, CL_MEM_OBJECT_IMAGE2D).count(*format)) 117c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez throw error(CL_IMAGE_FORMAT_NOT_SUPPORTED); 118c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 119c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez ret_error(errcode_ret, CL_SUCCESS); 120c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return new image2d(*ctx, flags, format, width, height, 121c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez row_pitch, host_ptr); 122c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 123c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} catch (error &e) { 124c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez ret_error(errcode_ret, e); 125c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return NULL; 126c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 127c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 128c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco JerezPUBLIC cl_mem 129c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco JerezclCreateImage3D(cl_context ctx, cl_mem_flags flags, 130c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez const cl_image_format *format, 131c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez size_t width, size_t height, size_t depth, 132c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez size_t row_pitch, size_t slice_pitch, 133c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez void *host_ptr, cl_int *errcode_ret) try { 134c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez if (!ctx) 135c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez throw error(CL_INVALID_CONTEXT); 136c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 13787280d56a375fcfc9231e72963439f9a370c408aBlaž Tomažič if (flags & ~(CL_MEM_READ_WRITE | CL_MEM_WRITE_ONLY | CL_MEM_READ_ONLY | 138c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez CL_MEM_USE_HOST_PTR | CL_MEM_ALLOC_HOST_PTR | 139c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez CL_MEM_COPY_HOST_PTR)) 140c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez throw error(CL_INVALID_VALUE); 141c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 142c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez if (!format) 143c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez throw error(CL_INVALID_IMAGE_FORMAT_DESCRIPTOR); 144c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 145c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez if (width < 1 || height < 1 || depth < 2) 146c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez throw error(CL_INVALID_IMAGE_SIZE); 147c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 148c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez if (bool(host_ptr) != bool(flags & (CL_MEM_USE_HOST_PTR | 149c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez CL_MEM_COPY_HOST_PTR))) 150c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez throw error(CL_INVALID_HOST_PTR); 151c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 152c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez if (!supported_formats(ctx, CL_MEM_OBJECT_IMAGE3D).count(*format)) 153c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez throw error(CL_IMAGE_FORMAT_NOT_SUPPORTED); 154c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 155c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez ret_error(errcode_ret, CL_SUCCESS); 156c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return new image3d(*ctx, flags, format, width, height, depth, 157c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez row_pitch, slice_pitch, host_ptr); 158c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 159c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} catch (error &e) { 160c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez ret_error(errcode_ret, e); 161c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return NULL; 162c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 163c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 164c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco JerezPUBLIC cl_int 165c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco JerezclGetSupportedImageFormats(cl_context ctx, cl_mem_flags flags, 166c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez cl_mem_object_type type, cl_uint count, 167c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez cl_image_format *buf, cl_uint *count_ret) try { 168c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez if (!ctx) 169c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez throw error(CL_INVALID_CONTEXT); 170c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 17187280d56a375fcfc9231e72963439f9a370c408aBlaž Tomažič if (flags & ~(CL_MEM_READ_WRITE | CL_MEM_WRITE_ONLY | CL_MEM_READ_ONLY | 172c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez CL_MEM_USE_HOST_PTR | CL_MEM_ALLOC_HOST_PTR | 173c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez CL_MEM_COPY_HOST_PTR)) 174c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez throw error(CL_INVALID_VALUE); 175c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 176c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez if (!count && buf) 177c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez throw error(CL_INVALID_VALUE); 178c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 179c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez auto formats = supported_formats(ctx, type); 180c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 181c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez if (buf) 182c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez std::copy_n(formats.begin(), std::min((cl_uint)formats.size(), count), 183c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez buf); 184c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez if (count_ret) 185c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez *count_ret = formats.size(); 186c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 187c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return CL_SUCCESS; 188c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 189c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} catch (error &e) { 190c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return e.get(); 191c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 192c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 193c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco JerezPUBLIC cl_int 194c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco JerezclGetMemObjectInfo(cl_mem obj, cl_mem_info param, 195c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez size_t size, void *buf, size_t *size_ret) { 196c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez if (!obj) 197c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return CL_INVALID_MEM_OBJECT; 198c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 199c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez switch (param) { 200c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez case CL_MEM_TYPE: 201c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return scalar_property<cl_mem_object_type>(buf, size, size_ret, 202c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez obj->type()); 203c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 204c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez case CL_MEM_FLAGS: 205c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return scalar_property<cl_mem_flags>(buf, size, size_ret, obj->flags()); 206c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 207c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez case CL_MEM_SIZE: 208c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return scalar_property<size_t>(buf, size, size_ret, obj->size()); 209c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 210c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez case CL_MEM_HOST_PTR: 211c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return scalar_property<void *>(buf, size, size_ret, obj->host_ptr()); 212c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 213c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez case CL_MEM_MAP_COUNT: 214c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return scalar_property<cl_uint>(buf, size, size_ret, 0); 215c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 216c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez case CL_MEM_REFERENCE_COUNT: 217c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return scalar_property<cl_uint>(buf, size, size_ret, obj->ref_count()); 218c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 219c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez case CL_MEM_CONTEXT: 220c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return scalar_property<cl_context>(buf, size, size_ret, &obj->ctx); 221c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 222c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez case CL_MEM_ASSOCIATED_MEMOBJECT: { 223c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez sub_buffer *sub = dynamic_cast<sub_buffer *>(obj); 224c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return scalar_property<cl_mem>(buf, size, size_ret, 225c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez (sub ? &sub->parent : NULL)); 226c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez } 227c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez case CL_MEM_OFFSET: { 228c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez sub_buffer *sub = dynamic_cast<sub_buffer *>(obj); 229c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return scalar_property<size_t>(buf, size, size_ret, 230c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez (sub ? sub->offset() : 0)); 231c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez } 232c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez default: 233c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return CL_INVALID_VALUE; 234c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez } 235c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 236c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 237c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco JerezPUBLIC cl_int 238c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco JerezclGetImageInfo(cl_mem obj, cl_image_info param, 239c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez size_t size, void *buf, size_t *size_ret) { 240c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez image *img = dynamic_cast<image *>(obj); 241c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez if (!img) 242c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return CL_INVALID_MEM_OBJECT; 243c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 244c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez switch (param) { 245c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez case CL_IMAGE_FORMAT: 246c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return scalar_property<cl_image_format>(buf, size, size_ret, 247c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez img->format()); 248c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 249c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez case CL_IMAGE_ELEMENT_SIZE: 250c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return scalar_property<size_t>(buf, size, size_ret, 0); 251c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 252c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez case CL_IMAGE_ROW_PITCH: 253c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return scalar_property<size_t>(buf, size, size_ret, img->row_pitch()); 254c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 255c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez case CL_IMAGE_SLICE_PITCH: 256c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return scalar_property<size_t>(buf, size, size_ret, img->slice_pitch()); 257c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 258c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez case CL_IMAGE_WIDTH: 259c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return scalar_property<size_t>(buf, size, size_ret, img->width()); 260c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 261c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez case CL_IMAGE_HEIGHT: 262c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return scalar_property<size_t>(buf, size, size_ret, img->height()); 263c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 264c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez case CL_IMAGE_DEPTH: 265c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return scalar_property<size_t>(buf, size, size_ret, img->depth()); 266c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 267c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez default: 268c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return CL_INVALID_VALUE; 269c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez } 270c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 271c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 272c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco JerezPUBLIC cl_int 273c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco JerezclRetainMemObject(cl_mem obj) { 274c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez if (!obj) 275c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return CL_INVALID_MEM_OBJECT; 276c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 277c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez obj->retain(); 278c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return CL_SUCCESS; 279c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 280c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 281c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco JerezPUBLIC cl_int 282c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco JerezclReleaseMemObject(cl_mem obj) { 283c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez if (!obj) 284c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return CL_INVALID_MEM_OBJECT; 285c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 286c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez if (obj->release()) 287c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez delete obj; 288c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 289c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return CL_SUCCESS; 290c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 291c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 292c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco JerezPUBLIC cl_int 293c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco JerezclSetMemObjectDestructorCallback(cl_mem obj, 294c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez void (CL_CALLBACK *pfn_notify)(cl_mem, void *), 295c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez void *user_data) { 296c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez if (!obj) 297c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return CL_INVALID_MEM_OBJECT; 298c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 299c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez if (!pfn_notify) 300c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return CL_INVALID_VALUE; 301c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 302c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez obj->destroy_notify([=]{ pfn_notify(obj, user_data); }); 303c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 304c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return CL_SUCCESS; 305c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 306