1c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez//
2c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// Copyright 2012 Francisco Jerez
3c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez//
4c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// Permission is hereby granted, free of charge, to any person obtaining a
5c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// copy of this software and associated documentation files (the "Software"),
6c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// to deal in the Software without restriction, including without limitation
7c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// the rights to use, copy, modify, merge, publish, distribute, sublicense,
8c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// and/or sell copies of the Software, and to permit persons to whom the
9c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// Software is furnished to do so, subject to the following conditions:
10c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez//
11c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// The above copyright notice and this permission notice shall be included in
12c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// all copies or substantial portions of the Software.
13c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez//
14c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17f0cb66b69904b0a3e4083aa8874af63cf1c14321Kenneth Graunke// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
18f0cb66b69904b0a3e4083aa8874af63cf1c14321Kenneth Graunke// OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19f0cb66b69904b0a3e4083aa8874af63cf1c14321Kenneth Graunke// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20f0cb66b69904b0a3e4083aa8874af63cf1c14321Kenneth Graunke// OTHER DEALINGS IN THE SOFTWARE.
21c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez//
22c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
23099d281b38fae791300984964fab1124b0eb14d2Francisco Jerez#ifndef CLOVER_CORE_MEMORY_HPP
24099d281b38fae791300984964fab1124b0eb14d2Francisco Jerez#define CLOVER_CORE_MEMORY_HPP
25c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
26c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez#include <functional>
27c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez#include <map>
28c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez#include <memory>
29c6d980140913307d48648058ec24da42a31fc37cTom Stellard#include <stack>
30c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
31bff60c894a290260ab3dd2086445b44622a2800eFrancisco Jerez#include "core/object.hpp"
32c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez#include "core/queue.hpp"
33c4578d2277155c50c8680849763850cddb8e8ec2Francisco Jerez#include "core/resource.hpp"
34c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
35c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jereznamespace clover {
36d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez   class memory_obj : public ref_counter, public _cl_mem {
37d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez   protected:
38c4578d2277155c50c8680849763850cddb8e8ec2Francisco Jerez      memory_obj(clover::context &ctx, cl_mem_flags flags,
39d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez                 size_t size, void *host_ptr);
405226eacf8d4ea395062bf594079acc747bcd6e97Francisco Jerez
41d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez      memory_obj(const memory_obj &obj) = delete;
425226eacf8d4ea395062bf594079acc747bcd6e97Francisco Jerez      memory_obj &
435226eacf8d4ea395062bf594079acc747bcd6e97Francisco Jerez      operator=(const memory_obj &obj) = delete;
44c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
45d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez   public:
46d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez      virtual ~memory_obj();
47c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
48369419f761f26dffd61fd614e5e28bb4cd02e867Francisco Jerez      bool
49369419f761f26dffd61fd614e5e28bb4cd02e867Francisco Jerez      operator==(const memory_obj &obj) const;
50369419f761f26dffd61fd614e5e28bb4cd02e867Francisco Jerez
51d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez      virtual cl_mem_object_type type() const = 0;
52d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez      virtual clover::resource &resource(command_queue &q) = 0;
53c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
54d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez      void destroy_notify(std::function<void ()> f);
55d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez      cl_mem_flags flags() const;
56d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez      size_t size() const;
57d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez      void *host_ptr() const;
58c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
59c4578d2277155c50c8680849763850cddb8e8ec2Francisco Jerez      const intrusive_ref<clover::context> context;
60c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
61d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez   private:
62d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez      cl_mem_flags _flags;
63d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez      size_t _size;
64d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez      void *_host_ptr;
65c6d980140913307d48648058ec24da42a31fc37cTom Stellard      std::stack<std::function<void ()>> _destroy_notify;
66c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
67d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez   protected:
68d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez      std::string data;
69d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez   };
70c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
71d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez   class buffer : public memory_obj {
72c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   protected:
73c4578d2277155c50c8680849763850cddb8e8ec2Francisco Jerez      buffer(clover::context &ctx, cl_mem_flags flags,
74c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez             size_t size, void *host_ptr);
75c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
76c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   public:
77c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      virtual cl_mem_object_type type() const;
78c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   };
79c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
80d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez   class root_buffer : public buffer {
81c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   public:
82c4578d2277155c50c8680849763850cddb8e8ec2Francisco Jerez      root_buffer(clover::context &ctx, cl_mem_flags flags,
83c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                  size_t size, void *host_ptr);
84c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
85d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez      virtual clover::resource &resource(command_queue &q);
86c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
87c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   private:
88d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez      std::map<device *,
89d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez               std::unique_ptr<root_resource>> resources;
90c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   };
91c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
92d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez   class sub_buffer : public buffer {
93c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   public:
94d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez      sub_buffer(root_buffer &parent, cl_mem_flags flags,
95c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez                 size_t offset, size_t size);
96c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
97d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez      virtual clover::resource &resource(command_queue &q);
98c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      size_t offset() const;
99c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
100c4578d2277155c50c8680849763850cddb8e8ec2Francisco Jerez      const intrusive_ref<root_buffer> parent;
101c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
102c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   private:
1038e14b82fd2c561cac3e0d5f84d5f67815ad53867Francisco Jerez      size_t _offset;
104d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez      std::map<device *,
105d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez               std::unique_ptr<sub_resource>> resources;
106c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   };
107c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
108d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez   class image : public memory_obj {
109c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   protected:
110c4578d2277155c50c8680849763850cddb8e8ec2Francisco Jerez      image(clover::context &ctx, cl_mem_flags flags,
111c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez            const cl_image_format *format,
112c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez            size_t width, size_t height, size_t depth,
113c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez            size_t row_pitch, size_t slice_pitch, size_t size,
114c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez            void *host_ptr);
115c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
116c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   public:
117d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez      virtual clover::resource &resource(command_queue &q);
118c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      cl_image_format format() const;
119c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      size_t width() const;
120c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      size_t height() const;
121c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      size_t depth() const;
122adefa84d66b13a4892bbc544194bacdc410fcc4eFrancisco Jerez      size_t pixel_size() const;
123c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      size_t row_pitch() const;
124c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      size_t slice_pitch() const;
125c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
126c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   private:
1278e14b82fd2c561cac3e0d5f84d5f67815ad53867Francisco Jerez      cl_image_format _format;
1288e14b82fd2c561cac3e0d5f84d5f67815ad53867Francisco Jerez      size_t _width;
1298e14b82fd2c561cac3e0d5f84d5f67815ad53867Francisco Jerez      size_t _height;
1308e14b82fd2c561cac3e0d5f84d5f67815ad53867Francisco Jerez      size_t _depth;
1318e14b82fd2c561cac3e0d5f84d5f67815ad53867Francisco Jerez      size_t _row_pitch;
1328e14b82fd2c561cac3e0d5f84d5f67815ad53867Francisco Jerez      size_t _slice_pitch;
133d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez      std::map<device *,
134d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez               std::unique_ptr<root_resource>> resources;
135c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   };
136c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
137d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez   class image2d : public image {
138c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   public:
139c4578d2277155c50c8680849763850cddb8e8ec2Francisco Jerez      image2d(clover::context &ctx, cl_mem_flags flags,
140c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez              const cl_image_format *format, size_t width,
141c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez              size_t height, size_t row_pitch,
142c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez              void *host_ptr);
143c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
144c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      virtual cl_mem_object_type type() const;
145c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   };
146c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
147d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez   class image3d : public image {
148c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   public:
149c4578d2277155c50c8680849763850cddb8e8ec2Francisco Jerez      image3d(clover::context &ctx, cl_mem_flags flags,
150c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez              const cl_image_format *format,
151c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez              size_t width, size_t height, size_t depth,
152c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez              size_t row_pitch, size_t slice_pitch,
153c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez              void *host_ptr);
154c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
155c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez      virtual cl_mem_object_type type() const;
156c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez   };
157c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez}
158c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez
159c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez#endif
160