memory.hpp revision c6db1b3396384186aab5b685fe1fd540e17b3a62
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#ifndef __CORE_MEMORY_HPP__ 24c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez#define __CORE_MEMORY_HPP__ 25c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 26c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez#include <functional> 27c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez#include <map> 28c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez#include <memory> 29c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 30c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez#include "core/base.hpp" 31c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez#include "core/queue.hpp" 32c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 33c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jereznamespace clover { 34c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez typedef struct _cl_mem memory_obj; 35c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 36c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez class resource; 37c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez class sub_resource; 38c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 39c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 40c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezstruct _cl_mem : public clover::ref_counter { 41c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezprotected: 42c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez _cl_mem(clover::context &ctx, cl_mem_flags flags, 43c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez size_t size, void *host_ptr); 44c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez _cl_mem(const _cl_mem &obj) = delete; 45c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 46c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezpublic: 47c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez virtual ~_cl_mem(); 48c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 49c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez virtual cl_mem_object_type type() const = 0; 50c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez virtual clover::resource &resource(cl_command_queue q) = 0; 51c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 52c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez void destroy_notify(std::function<void ()> f); 53c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez cl_mem_flags flags() const; 54c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez size_t size() const; 55c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez void *host_ptr() const; 56c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 57c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez clover::context &ctx; 58c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 59c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezprivate: 60c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez cl_mem_flags __flags; 61c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez size_t __size; 62c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez void *__host_ptr; 63c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez std::function<void ()> __destroy_notify; 64c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 65c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezprotected: 66c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez std::string data; 67c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez}; 68c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 69c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jereznamespace clover { 70c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez struct buffer : public memory_obj { 71c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez protected: 72c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez buffer(clover::context &ctx, cl_mem_flags flags, 73c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez size_t size, void *host_ptr); 74c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 75c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez public: 76c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez virtual cl_mem_object_type type() const; 77c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez }; 78c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 79c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez struct root_buffer : public buffer { 80c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez public: 81c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez root_buffer(clover::context &ctx, cl_mem_flags flags, 82c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez size_t size, void *host_ptr); 83c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 84c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez virtual clover::resource &resource(cl_command_queue q); 85c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 86c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez private: 87c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez std::map<clover::device *, 88c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez std::unique_ptr<clover::root_resource>> resources; 89c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez }; 90c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 91c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez struct sub_buffer : public buffer { 92c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez public: 93c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez sub_buffer(clover::root_buffer &parent, cl_mem_flags flags, 94c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez size_t offset, size_t size); 95c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 96c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez virtual clover::resource &resource(cl_command_queue q); 97c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez size_t offset() const; 98c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 99c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez clover::root_buffer &parent; 100c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 101c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez private: 102c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez size_t __offset; 103c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez std::map<clover::device *, 104c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez std::unique_ptr<clover::sub_resource>> resources; 105c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez }; 106c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 107c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez struct image : public memory_obj { 108c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez protected: 109c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez image(clover::context &ctx, cl_mem_flags flags, 110c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez const cl_image_format *format, 111c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez size_t width, size_t height, size_t depth, 112c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez size_t row_pitch, size_t slice_pitch, size_t size, 113c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez void *host_ptr); 114c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 115c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez public: 116c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez virtual clover::resource &resource(cl_command_queue q); 117c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez cl_image_format format() const; 118c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez size_t width() const; 119c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez size_t height() const; 120c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez size_t depth() const; 121c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez size_t row_pitch() const; 122c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez size_t slice_pitch() const; 123c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 124c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez private: 125c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez cl_image_format __format; 126c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez size_t __width; 127c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez size_t __height; 128c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez size_t __depth; 129c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez size_t __row_pitch; 130c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez size_t __slice_pitch; 131c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez std::map<clover::device *, 132c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez std::unique_ptr<clover::root_resource>> resources; 133c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez }; 134c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 135c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez struct image2d : public image { 136c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez public: 137c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez image2d(clover::context &ctx, cl_mem_flags flags, 138c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez const cl_image_format *format, size_t width, 139c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez size_t height, size_t row_pitch, 140c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez void *host_ptr); 141c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 142c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez virtual cl_mem_object_type type() const; 143c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez }; 144c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 145c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez struct image3d : public image { 146c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez public: 147c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez image3d(clover::context &ctx, cl_mem_flags flags, 148c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez const cl_image_format *format, 149c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez size_t width, size_t height, size_t depth, 150c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez size_t row_pitch, size_t slice_pitch, 151c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez void *host_ptr); 152c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 153c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez virtual cl_mem_object_type type() const; 154c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez }; 155c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 156c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 157c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez#endif 158