1 // 2 // Copyright 2012 Francisco Jerez 3 // 4 // Permission is hereby granted, free of charge, to any person obtaining a 5 // copy of this software and associated documentation files (the "Software"), 6 // to deal in the Software without restriction, including without limitation 7 // the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 // and/or sell copies of the Software, and to permit persons to whom the 9 // Software is furnished to do so, subject to the following conditions: 10 // 11 // The above copyright notice and this permission notice shall be included in 12 // all copies or substantial portions of the Software. 13 // 14 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17 // THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 18 // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF 19 // OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 20 // SOFTWARE. 21 // 22 23 #ifndef __CORE_MEMORY_HPP__ 24 #define __CORE_MEMORY_HPP__ 25 26 #include <functional> 27 #include <map> 28 #include <memory> 29 30 #include "core/base.hpp" 31 #include "core/queue.hpp" 32 33 namespace clover { 34 typedef struct _cl_mem memory_obj; 35 36 class resource; 37 class sub_resource; 38 } 39 40 struct _cl_mem : public clover::ref_counter { 41 protected: 42 _cl_mem(clover::context &ctx, cl_mem_flags flags, 43 size_t size, void *host_ptr); 44 _cl_mem(const _cl_mem &obj) = delete; 45 46 public: 47 virtual ~_cl_mem(); 48 49 virtual cl_mem_object_type type() const = 0; 50 virtual clover::resource &resource(cl_command_queue q) = 0; 51 52 void destroy_notify(std::function<void ()> f); 53 cl_mem_flags flags() const; 54 size_t size() const; 55 void *host_ptr() const; 56 57 clover::context &ctx; 58 59 private: 60 cl_mem_flags __flags; 61 size_t __size; 62 void *__host_ptr; 63 std::function<void ()> __destroy_notify; 64 65 protected: 66 std::string data; 67 }; 68 69 namespace clover { 70 struct buffer : public memory_obj { 71 protected: 72 buffer(clover::context &ctx, cl_mem_flags flags, 73 size_t size, void *host_ptr); 74 75 public: 76 virtual cl_mem_object_type type() const; 77 }; 78 79 struct root_buffer : public buffer { 80 public: 81 root_buffer(clover::context &ctx, cl_mem_flags flags, 82 size_t size, void *host_ptr); 83 84 virtual clover::resource &resource(cl_command_queue q); 85 86 private: 87 std::map<clover::device *, 88 std::unique_ptr<clover::root_resource>> resources; 89 }; 90 91 struct sub_buffer : public buffer { 92 public: 93 sub_buffer(clover::root_buffer &parent, cl_mem_flags flags, 94 size_t offset, size_t size); 95 96 virtual clover::resource &resource(cl_command_queue q); 97 size_t offset() const; 98 99 clover::root_buffer &parent; 100 101 private: 102 size_t __offset; 103 std::map<clover::device *, 104 std::unique_ptr<clover::sub_resource>> resources; 105 }; 106 107 struct image : public memory_obj { 108 protected: 109 image(clover::context &ctx, cl_mem_flags flags, 110 const cl_image_format *format, 111 size_t width, size_t height, size_t depth, 112 size_t row_pitch, size_t slice_pitch, size_t size, 113 void *host_ptr); 114 115 public: 116 virtual clover::resource &resource(cl_command_queue q); 117 cl_image_format format() const; 118 size_t width() const; 119 size_t height() const; 120 size_t depth() const; 121 size_t row_pitch() const; 122 size_t slice_pitch() const; 123 124 private: 125 cl_image_format __format; 126 size_t __width; 127 size_t __height; 128 size_t __depth; 129 size_t __row_pitch; 130 size_t __slice_pitch; 131 std::map<clover::device *, 132 std::unique_ptr<clover::root_resource>> resources; 133 }; 134 135 struct image2d : public image { 136 public: 137 image2d(clover::context &ctx, cl_mem_flags flags, 138 const cl_image_format *format, size_t width, 139 size_t height, size_t row_pitch, 140 void *host_ptr); 141 142 virtual cl_mem_object_type type() const; 143 }; 144 145 struct image3d : public image { 146 public: 147 image3d(clover::context &ctx, cl_mem_flags flags, 148 const cl_image_format *format, 149 size_t width, size_t height, size_t depth, 150 size_t row_pitch, size_t slice_pitch, 151 void *host_ptr); 152 153 virtual cl_mem_object_type type() const; 154 }; 155 } 156 157 #endif 158