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 BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
18// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
19// OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20// 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
33namespace clover {
34   typedef struct _cl_mem memory_obj;
35
36   class resource;
37   class sub_resource;
38}
39
40struct _cl_mem : public clover::ref_counter {
41protected:
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
46public:
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
59private:
60   cl_mem_flags __flags;
61   size_t __size;
62   void *__host_ptr;
63   std::function<void ()> __destroy_notify;
64
65protected:
66   std::string data;
67};
68
69namespace 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
158