From 461a41b569b7f58f709e2588a5787231cfb87926 Mon Sep 17 00:00:00 2001
From: Tobias Frisch <tfrisch@uni-koblenz.de>
Date: Fri, 9 Jul 2021 19:00:18 +0200
Subject: [PATCH] [#59] Added VMA C++ bindings

Signed-off-by: Tobias Frisch <tfrisch@uni-koblenz.de>
---
 .gitmodules                            |  3 ++
 config/lib/GLFW.cmake                  |  2 +-
 config/lib/SPIRV_Cross.cmake           |  2 +-
 config/lib/VulkanMemoryAllocator.cmake |  5 ++--
 include/vkcv/Context.hpp               |  8 ++---
 lib/VulkanMemoryAllocator-Hpp          |  1 +
 src/vkcv/Context.cpp                   | 41 ++++++++++++++++----------
 7 files changed, 38 insertions(+), 24 deletions(-)
 create mode 160000 lib/VulkanMemoryAllocator-Hpp

diff --git a/.gitmodules b/.gitmodules
index 789927dd..cfa32fb4 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -25,3 +25,6 @@
 [submodule "lib/VulkanMemoryAllocator"]
 	path = lib/VulkanMemoryAllocator
 	url = https://github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git
+[submodule "lib/VulkanMemoryAllocator-Hpp"]
+	path = lib/VulkanMemoryAllocator-Hpp
+	url = https://github.com/malte-v/VulkanMemoryAllocator-Hpp.git
diff --git a/config/lib/GLFW.cmake b/config/lib/GLFW.cmake
index c423f960..9668694d 100644
--- a/config/lib/GLFW.cmake
+++ b/config/lib/GLFW.cmake
@@ -10,7 +10,7 @@ else()
         add_subdirectory(${vkcv_lib}/glfw)
 
         list(APPEND vkcv_libraries glfw)
-        list(APPEND vkcv_includes ${vkcv_lib}/glfw/include)
+        list(APPEND vkcv_includes ${vkcv_lib_path}/glfw/include)
 
         message(${vkcv_config_msg} " GLFW    -   " ${glfw3_VERSION})
     else()
diff --git a/config/lib/SPIRV_Cross.cmake b/config/lib/SPIRV_Cross.cmake
index cf1e6fe0..00ae4552 100644
--- a/config/lib/SPIRV_Cross.cmake
+++ b/config/lib/SPIRV_Cross.cmake
@@ -25,7 +25,7 @@ else()
         add_subdirectory(${vkcv_lib}/SPIRV-Cross)
 
         list(APPEND vkcv_libraries spirv-cross-cpp)
-        list(APPEND vkcv_includes ${vkcv_lib}/SPIV-Cross/include)
+        list(APPEND vkcv_includes ${vkcv_lib_path}/SPIV-Cross/include)
 
         message(${vkcv_config_msg} " SPIRV Cross    - " ${SPIRV_CROSS_VERSION})
     else()
diff --git a/config/lib/VulkanMemoryAllocator.cmake b/config/lib/VulkanMemoryAllocator.cmake
index 1ec40d1b..aeca2ad1 100644
--- a/config/lib/VulkanMemoryAllocator.cmake
+++ b/config/lib/VulkanMemoryAllocator.cmake
@@ -1,9 +1,10 @@
 
-if (EXISTS "${vkcv_lib_path}/VulkanMemoryAllocator")
+if ((EXISTS "${vkcv_lib_path}/VulkanMemoryAllocator") AND
+	(EXISTS "${vkcv_lib_path}/VulkanMemoryAllocator-Hpp"))
 	add_subdirectory(${vkcv_lib}/VulkanMemoryAllocator)
 	
 	list(APPEND vkcv_libraries VulkanMemoryAllocator)
-	list(APPEND vkcv_includes ${vkcv_lib}/VulkanMemoryAllocator/include)
+	list(APPEND vkcv_includes ${vkcv_lib_path}/VulkanMemoryAllocator-Hpp)
 	
 	message(${vkcv_config_msg} " VMA     - ")
 else()
diff --git a/include/vkcv/Context.hpp b/include/vkcv/Context.hpp
index ab744f66..2ecd9203 100644
--- a/include/vkcv/Context.hpp
+++ b/include/vkcv/Context.hpp
@@ -1,7 +1,7 @@
 #pragma once
 
 #include <vulkan/vulkan.hpp>
-#include <vk_mem_alloc.h>
+#include <vk_mem_alloc.hpp>
 
 #include "QueueManager.hpp"
 
@@ -35,7 +35,7 @@ namespace vkcv
         const QueueManager& getQueueManager() const;
 	
         [[nodiscard]]
-		const VmaAllocator& getAllocator() const;
+		const vma::Allocator& getAllocator() const;
         
         static Context create(const char *applicationName,
 							  uint32_t applicationVersion,
@@ -52,13 +52,13 @@ namespace vkcv
          * @param device Vulkan-Device
          */
         Context(vk::Instance instance, vk::PhysicalDevice physicalDevice, vk::Device device,
-				QueueManager&& queueManager, VmaAllocator& allocator) noexcept;
+				QueueManager&& queueManager, vma::Allocator&& allocator) noexcept;
         
         vk::Instance        m_Instance;
         vk::PhysicalDevice  m_PhysicalDevice;
         vk::Device          m_Device;
 		QueueManager		m_QueueManager;
-		VmaAllocator 		m_Allocator;
+		vma::Allocator 		m_Allocator;
 		
     };
 }
diff --git a/lib/VulkanMemoryAllocator-Hpp b/lib/VulkanMemoryAllocator-Hpp
new file mode 160000
index 00000000..eae6e8d3
--- /dev/null
+++ b/lib/VulkanMemoryAllocator-Hpp
@@ -0,0 +1 @@
+Subproject commit eae6e8d3bd4593e0d7071c85fba2a8f33fbe5dab
diff --git a/src/vkcv/Context.cpp b/src/vkcv/Context.cpp
index b5315db4..431d53b7 100644
--- a/src/vkcv/Context.cpp
+++ b/src/vkcv/Context.cpp
@@ -38,7 +38,7 @@ namespace vkcv
                      vk::PhysicalDevice physicalDevice,
                      vk::Device device,
 					 QueueManager&& queueManager,
-					 VmaAllocator& allocator) noexcept :
+					 vma::Allocator&& allocator) noexcept :
     m_Instance(instance),
     m_PhysicalDevice(physicalDevice),
     m_Device(device),
@@ -48,10 +48,7 @@ namespace vkcv
 
     Context::~Context() noexcept
     {
-    	if (m_Allocator) {
-			vmaDestroyAllocator(m_Allocator);
-    	}
-    	
+    	m_Allocator.destroy();
         m_Device.destroy();
         m_Instance.destroy();
     }
@@ -75,7 +72,7 @@ namespace vkcv
     	return m_QueueManager;
     }
     
-    const VmaAllocator& Context::getAllocator() const {
+    const vma::Allocator& Context::getAllocator() const {
     	return m_Allocator;
     }
 	
@@ -311,18 +308,30 @@ namespace vkcv
 				queuePairsTransfer
 		);
 		
-		VmaAllocatorCreateInfo allocatorCreateInfo = {};
-		allocatorCreateInfo.physicalDevice = physicalDevice;
-		allocatorCreateInfo.instance = instance;
-		allocatorCreateInfo.device = device;
-		allocatorCreateInfo.vulkanApiVersion = VK_HEADER_VERSION_COMPLETE;
+		const vma::AllocatorCreateInfo allocatorCreateInfo (
+				vma::AllocatorCreateFlags(),
+				physicalDevice,
+				device,
+				0,
+				nullptr,
+				nullptr,
+				0,
+				nullptr,
+				nullptr,
+				nullptr,
+				instance,
+				VK_HEADER_VERSION_COMPLETE
+		);
 		
-		VmaAllocator allocator;
-		if (VK_SUCCESS != vmaCreateAllocator(&allocatorCreateInfo, &allocator)) {
-			allocator = nullptr;
-		}
+		vma::Allocator allocator = vma::createAllocator(allocatorCreateInfo);
 		
-		return Context(instance, physicalDevice, device, std::move(queueManager), allocator);
+		return Context(
+				instance,
+				physicalDevice,
+				device,
+				std::move(queueManager),
+				std::move(allocator)
+		);
 	}
  
 }
-- 
GitLab