gallium: rename 'state tracker' to 'frontend'
[mesa.git] / src / gallium / frontends / clover / core / memory.hpp
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