Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  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.