Lluvia
Memory.h
Go to the documentation of this file.
1 
8 #ifndef LLUVIA_CORE_MEMORY_MEMORY_H_
9 #define LLUVIA_CORE_MEMORY_MEMORY_H_
10 
11 #include <array>
12 #include <cstdint>
13 #include <memory>
14 #include <string>
15 #include <tuple>
16 #include <vector>
17 
19 
23 
24 namespace ll {
25 
26 namespace vulkan {
27  class Device;
28 } // namespace vulkan
29 
30 // forward declarations
31 class Buffer;
32 class Image;
33 class ImageDescriptor;
34 class ImageView;
35 class ImageViewDescriptor;
36 class Session;
37 
41 struct VkHeapInfo {
42 
46  uint32_t typeIndex;
47 
51  uint64_t size;
52 
57 
61  std::vector<uint32_t> familyQueueIndices;
62 };
63 
92 class Memory : public std::enable_shared_from_this<ll::Memory> {
93 
94 public:
95  Memory() = delete;
96  Memory(const Memory& memory) = delete;
97  Memory(Memory&& memory) = delete;
98 
107  Memory(const std::shared_ptr<ll::vulkan::Device>& device,
108  const ll::VkHeapInfo& heapInfo,
109  const uint64_t pageSize);
110 
112 
113  Memory& operator=(const Memory& memory) = delete;
114  Memory& operator=(Memory&& memory) = delete;
115 
124 
130  uint64_t getPageSize() const noexcept;
131 
137  uint32_t getPageCount() const noexcept;
138 
145  bool isMappable() const noexcept;
146 
157  bool isPageMappable(const uint32_t page) const noexcept;
158 
173  std::shared_ptr<ll::Buffer> createBuffer(const uint64_t size);
174 
189  std::shared_ptr<ll::Buffer> createBuffer(const uint64_t size, const ll::BufferUsageFlags usageFlags);
190 
203  std::shared_ptr<ll::Buffer> createBufferWithUnsafeFlags(const uint64_t size, const uint32_t usageFlags);
204 
221  std::shared_ptr<ll::Image> createImage(const ll::ImageDescriptor& descriptor);
222 
244  std::shared_ptr<ll::ImageView> createImageView(
245  const ll::ImageDescriptor& imgDescriptor,
246  const ll::ImageViewDescriptor& viewDescriptor);
247 
248 private:
249  impl::MemoryAllocationTryInfo getSuitableMemoryPage(const vk::MemoryRequirements& memRequirements);
250  void releaseMemoryAllocation(const ll::MemoryAllocationInfo& allocInfo);
251 
252  void releaseBuffer(const ll::Buffer& buffer);
253  void* mapBuffer(const ll::Buffer& buffer);
254  void unmapBuffer(const ll::Buffer& buffer);
255 
256  void releaseImage(const ll::Image& image);
257 
258  std::shared_ptr<ll::vulkan::Device> m_device;
259 
260  const ll::VkHeapInfo m_heapInfo {};
261  const uint64_t m_pageSize {0u};
262 
263  std::vector<vk::DeviceMemory> m_memoryPages;
264  std::vector<ll::impl::MemoryFreeSpaceManager> m_pageManagers;
265  std::vector<bool> m_memoryPageMappingFlags;
266 
267  friend class ll::Buffer;
268  friend class ll::Image;
269 };
270 
271 } // namespace ll
272 
273 #endif // LLUVIA_CORE_MEMORY_MEMORY_H_
MemoryFreeSpaceManager class.
MemoryPropertyFlags class.
Objects to manage raw portions of allocated memory.
Definition: Buffer.h:57
Stores all relevant information for creating ll::Image objects.
Definition: ImageDescriptor.h:189
Descriptor for ll::ImageView objects.
Definition: ImageViewDescriptor.h:41
Represents portions of a ll::Image to be sent as parameter to a GLSL shader.
Definition: ImageView.h:149
Objects to manage images.
Definition: Image.h:74
Class to manage allocation of objects into a specific type of memory.
Definition: Memory.h:92
std::shared_ptr< ll::Image > createImage(const ll::ImageDescriptor &descriptor)
Creates a new ll::Image object.
Memory(const std::shared_ptr< ll::vulkan::Device > &device, const ll::VkHeapInfo &heapInfo, const uint64_t pageSize)
Constructs a new ll::Memory object.
uint64_t getPageSize() const noexcept
Gets the page size.
std::shared_ptr< ll::ImageView > createImageView(const ll::ImageDescriptor &imgDescriptor, const ll::ImageViewDescriptor &viewDescriptor)
Creates an image view.
Memory(Memory &&memory)=delete
Memory(const Memory &memory)=delete
bool isPageMappable(const uint32_t page) const noexcept
Determines if a certain memory page is mappable.
Memory & operator=(Memory &&memory)=delete
std::shared_ptr< ll::Buffer > createBuffer(const uint64_t size)
Creates a buffer.
Memory & operator=(const Memory &memory)=delete
Memory()=delete
std::shared_ptr< ll::Buffer > createBufferWithUnsafeFlags(const uint64_t size, const uint32_t usageFlags)
Creates buffer with usage flags passed as integer type.
bool isMappable() const noexcept
Determines if this memory is mappable to host-visible memory.
uint32_t getPageCount() const noexcept
Gets the number of pages used.
ll::MemoryPropertyFlags getMemoryPropertyFlags() const noexcept
Gets the Vulkan memory property flags used to create this memory.
Definition: Buffer.h:28
Structure to hold the allocation information of objects in memory.
Definition: MemoryAllocationInfo.h:19
Vulkan heap information.
Definition: Memory.h:41
std::vector< uint32_t > familyQueueIndices
Definition: Memory.h:61
uint64_t size
Definition: Memory.h:51
ll::MemoryPropertyFlags flags
Definition: Memory.h:56
uint32_t typeIndex
Definition: Memory.h:46