cf183f09b7439aeebd163441d29d966ac6cebd84
[platform/core/uifw/dali-core.git] / dali / graphics / vulkan / vulkan-device-memory-manager.h
1 //
2 // Created by adam.b on 06/06/17.
3 //
4
5 #ifndef VULKAN_PROJECT_DEVICEMEMORYMANAGER_H
6 #define VULKAN_PROJECT_DEVICEMEMORYMANAGER_H
7
8 #include <dali/graphics/vulkan/vulkan-types.h>
9
10 namespace Dali
11 {
12 namespace Graphics
13 {
14 namespace Vulkan
15 {
16
17 class Graphics;
18 class Image;
19 class Buffer;
20 class DeviceMemoryManager;
21
22 /**
23  * DeviceMemory represents continuous memory block with particular properties
24  * like being mappable etc. The actual memory is being allocated from DeviceMemory,
25  * however simplest use may assume use of whole DeviceMemory block for a single
26  * resource/
27  */
28 class DeviceMemory
29 {
30 public:
31   DeviceMemory(DeviceMemoryManager& manager, Graphics& graphics,
32                const vk::MemoryRequirements& requirements, vk::MemoryPropertyFlags properties);
33
34   void* Map(uint32_t offset, uint32_t size);
35
36   void Unmap();
37
38   void Bind( Image& image, uint32_t offset );
39   void Bind( Buffer& image, uint32_t offset );
40
41 private:
42   DeviceMemoryManager& mManager;
43   Graphics&            mGraphics;
44
45   vk::DeviceMemory        mDeviceMemory;
46   vk::MemoryPropertyFlags mProperties;
47   vk::MemoryRequirements  mRequirements;
48
49   std::atomic< uint32_t > mUserCount; // this is just a refcount
50 };
51
52 /**
53  * DeviceMemoryManager
54  */
55 class DeviceMemoryManager
56 {
57 public:
58   DeviceMemoryManager() = delete;
59   DeviceMemoryManager(Graphics& graphics);
60   ~DeviceMemoryManager()                          = default;
61   DeviceMemoryManager(const DeviceMemoryManager&) = delete;
62   DeviceMemoryManager(DeviceMemoryManager&&)      = default;
63
64   DeviceMemoryManager& operator=(const DeviceMemoryManager&) = delete;
65   DeviceMemoryManager& operator=(DeviceMemoryManager&&) = default;
66
67   /* Allocates memory for VkImage */
68   vk::DeviceMemory& Allocate(vk::Image image, vk::MemoryPropertyFlags memoryFlags);
69
70   /* Allocates memory for VkBuffer */
71   vk::DeviceMemory& Allocate(vk::Buffer image, vk::MemoryPropertyFlags memoryFlags);
72
73   std::unique_ptr< DeviceMemory > Allocate(vk::MemoryRequirements  requirements,
74                                            vk::MemoryPropertyFlags flags);
75
76   Graphics& GetGraphics() const
77   {
78     return mGraphics;
79   }
80
81 private:
82   Graphics& mGraphics;
83 };
84
85 } // namespace Vulkan
86 } // namespace Graphics
87 } // namespace Dali
88
89 #endif //VULKAN_PROJECT_DEVICEMEMORYMANAGER_H