1 //
2 //  VulkanImage.hpp
3 //  MNN
4 //
5 //  Created by MNN on 2019/01/31.
6 //  Copyright © 2018, Alibaba Group Holding Limited
7 //
8 
9 #ifndef VulkanImage_hpp
10 #define VulkanImage_hpp
11 #include <MNN/Tensor.hpp>
12 #include "backend/vulkan/component/VulkanBuffer.hpp"
13 #include "backend/vulkan/component/VulkanMemoryPool.hpp"
14 namespace MNN {
15 class VulkanSampler : public NonCopyable {
16 public:
17     VulkanSampler(const VulkanDevice& dev, VkFilter filter = VK_FILTER_NEAREST,
18                   VkSamplerAddressMode mode = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER);
19     virtual ~VulkanSampler();
20 
get() const21     VkSampler get() const {
22         return mSampler;
23     }
24 private:
25     VkSampler mSampler;
26     const VulkanDevice& mDevice;
27 };
28 
29 class VulkanImage : public NonCopyable {
30 public:
31     VulkanImage(const VulkanMemoryPool& pool, bool seperate, const std::vector<int>& dims,
32                 halide_type_t type = halide_type_of<float>());
VulkanImage(const VulkanMemoryPool & pool,bool seperate,int w,int h)33     VulkanImage(const VulkanMemoryPool& pool, bool seperate, int w, int h)
34         : VulkanImage(pool, seperate, std::vector<int>{w, h}) {
35     }
36     virtual ~VulkanImage();
37 
width() const38     inline int width() const {
39         return std::get<1>(mInfo);
40     }
height() const41     inline int height() const {
42         return std::get<2>(mInfo);
43     }
depth() const44     inline int depth() const {
45         return std::get<3>(mInfo);
46     }
dims() const47     inline std::vector<int> dims() const {
48         return mDims;
49     }
get() const50     inline VkImage get() const {
51         return mImage.first;
52     }
view() const53     inline VkImageView view() const {
54         return mImage.second;
55     }
format() const56     inline VkFormat format() const {
57         return std::get<4>(mInfo);
58     }
59     void release();
layout() const60     inline VkImageLayout layout() const {
61         return mLayout;
62     }
setLayout(VkImageLayout layout)63     inline void setLayout(VkImageLayout layout) {
64         mLayout = layout;
65     }
66 private:
67     std::tuple<VkImageType, uint32_t, uint32_t, uint32_t, VkFormat> mInfo;
68     std::pair<VkImage, VkImageView> mImage;
69     const VulkanDevice& mDevice;
70     std::vector<int> mDims;
71     const VulkanMemoryPool& mPool;
72     std::pair<void*, int> mMemory;
73     VkImageLayout mLayout;
74 };
75 } // namespace MNN
76 
77 #endif /* VulkanImage_hpp */
78