blob: 7c481107aad44dacfd8e8be9417b76203432927e [file] [log] [blame]
Francisco Jerezc6db1b32012-04-20 16:56:19 +02001//
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 Graunkef0cb66b2013-04-21 13:52:08 -070017// 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 Jerezc6db1b32012-04-20 16:56:19 +020021//
22
Francisco Jerez099d2812013-09-15 15:29:34 -070023#ifndef CLOVER_CORE_MEMORY_HPP
24#define CLOVER_CORE_MEMORY_HPP
Francisco Jerezc6db1b32012-04-20 16:56:19 +020025
26#include <functional>
27#include <map>
28#include <memory>
Tom Stellardc6d98012014-09-22 10:00:39 -040029#include <stack>
Francisco Jerezc6db1b32012-04-20 16:56:19 +020030
Francisco Jerezbff60c82013-10-06 13:51:01 -070031#include "core/object.hpp"
Francisco Jerezc6db1b32012-04-20 16:56:19 +020032#include "core/queue.hpp"
Francisco Jerezc4578d22014-02-18 15:07:11 +010033#include "core/resource.hpp"
Francisco Jerezc6db1b32012-04-20 16:56:19 +020034
35namespace clover {
Francisco Jerezd6f7afc2013-10-01 12:00:51 -070036 class memory_obj : public ref_counter, public _cl_mem {
Francisco Jerezc6db1b32012-04-20 16:56:19 +020037 protected:
Francisco Jerezc4578d22014-02-18 15:07:11 +010038 memory_obj(clover::context &ctx, cl_mem_flags flags,
Francisco Jerezd6f7afc2013-10-01 12:00:51 -070039 size_t size, void *host_ptr);
Francisco Jerez5226eac2013-09-16 21:44:36 -070040
Francisco Jerezd6f7afc2013-10-01 12:00:51 -070041 memory_obj(const memory_obj &obj) = delete;
Francisco Jerez5226eac2013-09-16 21:44:36 -070042 memory_obj &
43 operator=(const memory_obj &obj) = delete;
Francisco Jerezd6f7afc2013-10-01 12:00:51 -070044
45 public:
46 virtual ~memory_obj();
47
Francisco Jerez369419f2013-09-16 21:11:16 -070048 bool
49 operator==(const memory_obj &obj) const;
50
Francisco Jerezd6f7afc2013-10-01 12:00:51 -070051 virtual cl_mem_object_type type() const = 0;
Serge Martinc0f03f62020-05-09 08:11:16 +020052 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 Jerezd6f7afc2013-10-01 12:00:51 -070057
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 Jerezc4578d22014-02-18 15:07:11 +010063 const intrusive_ref<clover::context> context;
Francisco Jerezd6f7afc2013-10-01 12:00:51 -070064
65 private:
66 cl_mem_flags _flags;
67 size_t _size;
68 void *_host_ptr;
Tom Stellardc6d98012014-09-22 10:00:39 -040069 std::stack<std::function<void ()>> _destroy_notify;
Francisco Jerezd6f7afc2013-10-01 12:00:51 -070070
71 protected:
72 std::string data;
73 };
74
75 class buffer : public memory_obj {
76 protected:
Francisco Jerezc4578d22014-02-18 15:07:11 +010077 buffer(clover::context &ctx, cl_mem_flags flags,
Francisco Jerezc6db1b32012-04-20 16:56:19 +020078 size_t size, void *host_ptr);
79
80 public:
81 virtual cl_mem_object_type type() const;
82 };
83
Francisco Jerezd6f7afc2013-10-01 12:00:51 -070084 class root_buffer : public buffer {
Francisco Jerezc6db1b32012-04-20 16:56:19 +020085 public:
Francisco Jerezc4578d22014-02-18 15:07:11 +010086 root_buffer(clover::context &ctx, cl_mem_flags flags,
Francisco Jerezc6db1b32012-04-20 16:56:19 +020087 size_t size, void *host_ptr);
88
Serge Martinc0f03f62020-05-09 08:11:16 +020089 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 Jerezc6db1b32012-04-20 16:56:19 +020095
96 private:
Serge Martinc0f03f62020-05-09 08:11:16 +020097 clover::resource &
98 resource(command_queue &q, const void *data_ptr);
99
Francisco Jerezd6f7afc2013-10-01 12:00:51 -0700100 std::map<device *,
101 std::unique_ptr<root_resource>> resources;
Francisco Jerezc6db1b32012-04-20 16:56:19 +0200102 };
103
Francisco Jerezd6f7afc2013-10-01 12:00:51 -0700104 class sub_buffer : public buffer {
Francisco Jerezc6db1b32012-04-20 16:56:19 +0200105 public:
Francisco Jerezd6f7afc2013-10-01 12:00:51 -0700106 sub_buffer(root_buffer &parent, cl_mem_flags flags,
Francisco Jerezc6db1b32012-04-20 16:56:19 +0200107 size_t offset, size_t size);
108
Serge Martinc0f03f62020-05-09 08:11:16 +0200109 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 Jerezc6db1b32012-04-20 16:56:19 +0200115 size_t offset() const;
116
Francisco Jerezc4578d22014-02-18 15:07:11 +0100117 const intrusive_ref<root_buffer> parent;
Francisco Jerezc6db1b32012-04-20 16:56:19 +0200118
119 private:
Francisco Jerez8e14b822013-09-17 23:13:48 -0700120 size_t _offset;
Francisco Jerezd6f7afc2013-10-01 12:00:51 -0700121 std::map<device *,
122 std::unique_ptr<sub_resource>> resources;
Francisco Jerezc6db1b32012-04-20 16:56:19 +0200123 };
124
Francisco Jerezd6f7afc2013-10-01 12:00:51 -0700125 class image : public memory_obj {
Francisco Jerezc6db1b32012-04-20 16:56:19 +0200126 protected:
Francisco Jerezc4578d22014-02-18 15:07:11 +0100127 image(clover::context &ctx, cl_mem_flags flags,
Francisco Jerezc6db1b32012-04-20 16:56:19 +0200128 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 Jerezc6db1b32012-04-20 16:56:19 +0200134 cl_image_format format() const;
135 size_t width() const;
136 size_t height() const;
137 size_t depth() const;
Francisco Jerezadefa842013-10-18 16:25:36 -0700138 size_t pixel_size() const;
Francisco Jerezc6db1b32012-04-20 16:56:19 +0200139 size_t row_pitch() const;
140 size_t slice_pitch() const;
Serge Martinc0f03f62020-05-09 08:11:16 +0200141 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 Jerezc6db1b32012-04-20 16:56:19 +0200147
148 private:
Serge Martinc0f03f62020-05-09 08:11:16 +0200149 clover::resource &
150 resource(command_queue &q, const void *data_ptr);
151
Francisco Jerez8e14b822013-09-17 23:13:48 -0700152 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 Jerezd6f7afc2013-10-01 12:00:51 -0700158 std::map<device *,
159 std::unique_ptr<root_resource>> resources;
Francisco Jerezc6db1b32012-04-20 16:56:19 +0200160 };
161
Francisco Jerezd6f7afc2013-10-01 12:00:51 -0700162 class image2d : public image {
Francisco Jerezc6db1b32012-04-20 16:56:19 +0200163 public:
Francisco Jerezc4578d22014-02-18 15:07:11 +0100164 image2d(clover::context &ctx, cl_mem_flags flags,
Francisco Jerezc6db1b32012-04-20 16:56:19 +0200165 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 Jerezd6f7afc2013-10-01 12:00:51 -0700172 class image3d : public image {
Francisco Jerezc6db1b32012-04-20 16:56:19 +0200173 public:
Francisco Jerezc4578d22014-02-18 15:07:11 +0100174 image3d(clover::context &ctx, cl_mem_flags flags,
Francisco Jerezc6db1b32012-04-20 16:56:19 +0200175 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