mesa: Restore 78-column wrapping of license text in C++-style comments.
[mesa.git] / src / gallium / state_trackers / 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 __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