Francisco Jerez | c6db1b3 | 2012-04-20 16:56:19 +0200 | [diff] [blame] | 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 |
Kenneth Graunke | f0cb66b | 2013-04-21 13:52:08 -0700 | [diff] [blame] | 17 | // THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR |
| 18 | // OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, |
| 19 | // ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR |
| 20 | // OTHER DEALINGS IN THE SOFTWARE. |
Francisco Jerez | c6db1b3 | 2012-04-20 16:56:19 +0200 | [diff] [blame] | 21 | // |
| 22 | |
Francisco Jerez | 099d281 | 2013-09-15 15:29:34 -0700 | [diff] [blame] | 23 | #ifndef CLOVER_CORE_MEMORY_HPP |
| 24 | #define CLOVER_CORE_MEMORY_HPP |
Francisco Jerez | c6db1b3 | 2012-04-20 16:56:19 +0200 | [diff] [blame] | 25 | |
| 26 | #include <functional> |
| 27 | #include <map> |
| 28 | #include <memory> |
Tom Stellard | c6d9801 | 2014-09-22 10:00:39 -0400 | [diff] [blame] | 29 | #include <stack> |
Francisco Jerez | c6db1b3 | 2012-04-20 16:56:19 +0200 | [diff] [blame] | 30 | |
Francisco Jerez | bff60c8 | 2013-10-06 13:51:01 -0700 | [diff] [blame] | 31 | #include "core/object.hpp" |
Francisco Jerez | c6db1b3 | 2012-04-20 16:56:19 +0200 | [diff] [blame] | 32 | #include "core/queue.hpp" |
Francisco Jerez | c4578d2 | 2014-02-18 15:07:11 +0100 | [diff] [blame] | 33 | #include "core/resource.hpp" |
Francisco Jerez | c6db1b3 | 2012-04-20 16:56:19 +0200 | [diff] [blame] | 34 | |
| 35 | namespace clover { |
Francisco Jerez | d6f7afc | 2013-10-01 12:00:51 -0700 | [diff] [blame] | 36 | class memory_obj : public ref_counter, public _cl_mem { |
Francisco Jerez | c6db1b3 | 2012-04-20 16:56:19 +0200 | [diff] [blame] | 37 | protected: |
Francisco Jerez | c4578d2 | 2014-02-18 15:07:11 +0100 | [diff] [blame] | 38 | memory_obj(clover::context &ctx, cl_mem_flags flags, |
Francisco Jerez | d6f7afc | 2013-10-01 12:00:51 -0700 | [diff] [blame] | 39 | size_t size, void *host_ptr); |
Francisco Jerez | 5226eac | 2013-09-16 21:44:36 -0700 | [diff] [blame] | 40 | |
Francisco Jerez | d6f7afc | 2013-10-01 12:00:51 -0700 | [diff] [blame] | 41 | memory_obj(const memory_obj &obj) = delete; |
Francisco Jerez | 5226eac | 2013-09-16 21:44:36 -0700 | [diff] [blame] | 42 | memory_obj & |
| 43 | operator=(const memory_obj &obj) = delete; |
Francisco Jerez | d6f7afc | 2013-10-01 12:00:51 -0700 | [diff] [blame] | 44 | |
| 45 | public: |
| 46 | virtual ~memory_obj(); |
| 47 | |
Francisco Jerez | 369419f | 2013-09-16 21:11:16 -0700 | [diff] [blame] | 48 | bool |
| 49 | operator==(const memory_obj &obj) const; |
| 50 | |
Francisco Jerez | d6f7afc | 2013-10-01 12:00:51 -0700 | [diff] [blame] | 51 | virtual cl_mem_object_type type() const = 0; |
Serge Martin | c0f03f6 | 2020-05-09 08:11:16 +0200 | [diff] [blame] | 52 | virtual clover::resource & |
| 53 | resource_in(command_queue &q) = 0; |
| 54 | virtual clover::resource & |
| 55 | resource_undef(command_queue &q) = 0; |
| 56 | virtual void resource_out(command_queue &q) = 0; |
Francisco Jerez | d6f7afc | 2013-10-01 12:00:51 -0700 | [diff] [blame] | 57 | |
| 58 | void destroy_notify(std::function<void ()> f); |
| 59 | cl_mem_flags flags() const; |
| 60 | size_t size() const; |
| 61 | void *host_ptr() const; |
| 62 | |
Francisco Jerez | c4578d2 | 2014-02-18 15:07:11 +0100 | [diff] [blame] | 63 | const intrusive_ref<clover::context> context; |
Francisco Jerez | d6f7afc | 2013-10-01 12:00:51 -0700 | [diff] [blame] | 64 | |
| 65 | private: |
| 66 | cl_mem_flags _flags; |
| 67 | size_t _size; |
| 68 | void *_host_ptr; |
Tom Stellard | c6d9801 | 2014-09-22 10:00:39 -0400 | [diff] [blame] | 69 | std::stack<std::function<void ()>> _destroy_notify; |
Francisco Jerez | d6f7afc | 2013-10-01 12:00:51 -0700 | [diff] [blame] | 70 | |
| 71 | protected: |
| 72 | std::string data; |
| 73 | }; |
| 74 | |
| 75 | class buffer : public memory_obj { |
| 76 | protected: |
Francisco Jerez | c4578d2 | 2014-02-18 15:07:11 +0100 | [diff] [blame] | 77 | buffer(clover::context &ctx, cl_mem_flags flags, |
Francisco Jerez | c6db1b3 | 2012-04-20 16:56:19 +0200 | [diff] [blame] | 78 | size_t size, void *host_ptr); |
| 79 | |
| 80 | public: |
| 81 | virtual cl_mem_object_type type() const; |
| 82 | }; |
| 83 | |
Francisco Jerez | d6f7afc | 2013-10-01 12:00:51 -0700 | [diff] [blame] | 84 | class root_buffer : public buffer { |
Francisco Jerez | c6db1b3 | 2012-04-20 16:56:19 +0200 | [diff] [blame] | 85 | public: |
Francisco Jerez | c4578d2 | 2014-02-18 15:07:11 +0100 | [diff] [blame] | 86 | root_buffer(clover::context &ctx, cl_mem_flags flags, |
Francisco Jerez | c6db1b3 | 2012-04-20 16:56:19 +0200 | [diff] [blame] | 87 | size_t size, void *host_ptr); |
| 88 | |
Serge Martin | c0f03f6 | 2020-05-09 08:11:16 +0200 | [diff] [blame] | 89 | virtual clover::resource & |
| 90 | resource_in(command_queue &q); |
| 91 | virtual clover::resource & |
| 92 | resource_undef(command_queue &q); |
| 93 | virtual void |
| 94 | resource_out(command_queue &q); |
Francisco Jerez | c6db1b3 | 2012-04-20 16:56:19 +0200 | [diff] [blame] | 95 | |
| 96 | private: |
Serge Martin | c0f03f6 | 2020-05-09 08:11:16 +0200 | [diff] [blame] | 97 | clover::resource & |
| 98 | resource(command_queue &q, const void *data_ptr); |
| 99 | |
Francisco Jerez | d6f7afc | 2013-10-01 12:00:51 -0700 | [diff] [blame] | 100 | std::map<device *, |
| 101 | std::unique_ptr<root_resource>> resources; |
Francisco Jerez | c6db1b3 | 2012-04-20 16:56:19 +0200 | [diff] [blame] | 102 | }; |
| 103 | |
Francisco Jerez | d6f7afc | 2013-10-01 12:00:51 -0700 | [diff] [blame] | 104 | class sub_buffer : public buffer { |
Francisco Jerez | c6db1b3 | 2012-04-20 16:56:19 +0200 | [diff] [blame] | 105 | public: |
Francisco Jerez | d6f7afc | 2013-10-01 12:00:51 -0700 | [diff] [blame] | 106 | sub_buffer(root_buffer &parent, cl_mem_flags flags, |
Francisco Jerez | c6db1b3 | 2012-04-20 16:56:19 +0200 | [diff] [blame] | 107 | size_t offset, size_t size); |
| 108 | |
Serge Martin | c0f03f6 | 2020-05-09 08:11:16 +0200 | [diff] [blame] | 109 | virtual clover::resource & |
| 110 | resource_in(command_queue &q); |
| 111 | virtual clover::resource & |
| 112 | resource_undef(command_queue &q); |
| 113 | virtual void |
| 114 | resource_out(command_queue &q); |
Francisco Jerez | c6db1b3 | 2012-04-20 16:56:19 +0200 | [diff] [blame] | 115 | size_t offset() const; |
| 116 | |
Francisco Jerez | c4578d2 | 2014-02-18 15:07:11 +0100 | [diff] [blame] | 117 | const intrusive_ref<root_buffer> parent; |
Francisco Jerez | c6db1b3 | 2012-04-20 16:56:19 +0200 | [diff] [blame] | 118 | |
| 119 | private: |
Francisco Jerez | 8e14b82 | 2013-09-17 23:13:48 -0700 | [diff] [blame] | 120 | size_t _offset; |
Francisco Jerez | d6f7afc | 2013-10-01 12:00:51 -0700 | [diff] [blame] | 121 | std::map<device *, |
| 122 | std::unique_ptr<sub_resource>> resources; |
Francisco Jerez | c6db1b3 | 2012-04-20 16:56:19 +0200 | [diff] [blame] | 123 | }; |
| 124 | |
Francisco Jerez | d6f7afc | 2013-10-01 12:00:51 -0700 | [diff] [blame] | 125 | class image : public memory_obj { |
Francisco Jerez | c6db1b3 | 2012-04-20 16:56:19 +0200 | [diff] [blame] | 126 | protected: |
Francisco Jerez | c4578d2 | 2014-02-18 15:07:11 +0100 | [diff] [blame] | 127 | image(clover::context &ctx, cl_mem_flags flags, |
Francisco Jerez | c6db1b3 | 2012-04-20 16:56:19 +0200 | [diff] [blame] | 128 | const cl_image_format *format, |
| 129 | size_t width, size_t height, size_t depth, |
| 130 | size_t row_pitch, size_t slice_pitch, size_t size, |
| 131 | void *host_ptr); |
| 132 | |
| 133 | public: |
Francisco Jerez | c6db1b3 | 2012-04-20 16:56:19 +0200 | [diff] [blame] | 134 | cl_image_format format() const; |
| 135 | size_t width() const; |
| 136 | size_t height() const; |
| 137 | size_t depth() const; |
Francisco Jerez | adefa84 | 2013-10-18 16:25:36 -0700 | [diff] [blame] | 138 | size_t pixel_size() const; |
Francisco Jerez | c6db1b3 | 2012-04-20 16:56:19 +0200 | [diff] [blame] | 139 | size_t row_pitch() const; |
| 140 | size_t slice_pitch() const; |
Serge Martin | c0f03f6 | 2020-05-09 08:11:16 +0200 | [diff] [blame] | 141 | virtual clover::resource & |
| 142 | resource_in(command_queue &q); |
| 143 | virtual clover::resource & |
| 144 | resource_undef(command_queue &q); |
| 145 | virtual void |
| 146 | resource_out(command_queue &q); |
Francisco Jerez | c6db1b3 | 2012-04-20 16:56:19 +0200 | [diff] [blame] | 147 | |
| 148 | private: |
Serge Martin | c0f03f6 | 2020-05-09 08:11:16 +0200 | [diff] [blame] | 149 | clover::resource & |
| 150 | resource(command_queue &q, const void *data_ptr); |
| 151 | |
Francisco Jerez | 8e14b82 | 2013-09-17 23:13:48 -0700 | [diff] [blame] | 152 | cl_image_format _format; |
| 153 | size_t _width; |
| 154 | size_t _height; |
| 155 | size_t _depth; |
| 156 | size_t _row_pitch; |
| 157 | size_t _slice_pitch; |
Francisco Jerez | d6f7afc | 2013-10-01 12:00:51 -0700 | [diff] [blame] | 158 | std::map<device *, |
| 159 | std::unique_ptr<root_resource>> resources; |
Francisco Jerez | c6db1b3 | 2012-04-20 16:56:19 +0200 | [diff] [blame] | 160 | }; |
| 161 | |
Francisco Jerez | d6f7afc | 2013-10-01 12:00:51 -0700 | [diff] [blame] | 162 | class image2d : public image { |
Francisco Jerez | c6db1b3 | 2012-04-20 16:56:19 +0200 | [diff] [blame] | 163 | public: |
Francisco Jerez | c4578d2 | 2014-02-18 15:07:11 +0100 | [diff] [blame] | 164 | image2d(clover::context &ctx, cl_mem_flags flags, |
Francisco Jerez | c6db1b3 | 2012-04-20 16:56:19 +0200 | [diff] [blame] | 165 | const cl_image_format *format, size_t width, |
| 166 | size_t height, size_t row_pitch, |
| 167 | void *host_ptr); |
| 168 | |
| 169 | virtual cl_mem_object_type type() const; |
| 170 | }; |
| 171 | |
Francisco Jerez | d6f7afc | 2013-10-01 12:00:51 -0700 | [diff] [blame] | 172 | class image3d : public image { |
Francisco Jerez | c6db1b3 | 2012-04-20 16:56:19 +0200 | [diff] [blame] | 173 | public: |
Francisco Jerez | c4578d2 | 2014-02-18 15:07:11 +0100 | [diff] [blame] | 174 | image3d(clover::context &ctx, cl_mem_flags flags, |
Francisco Jerez | c6db1b3 | 2012-04-20 16:56:19 +0200 | [diff] [blame] | 175 | const cl_image_format *format, |
| 176 | size_t width, size_t height, size_t depth, |
| 177 | size_t row_pitch, size_t slice_pitch, |
| 178 | void *host_ptr); |
| 179 | |
| 180 | virtual cl_mem_object_type type() const; |
| 181 | }; |
| 182 | } |
| 183 | |
| 184 | #endif |