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