diff --git a/.gitmodules b/.gitmodules index 5cb5c0f9..1b809ff2 100644 --- a/.gitmodules +++ b/.gitmodules @@ -31,3 +31,6 @@ [submodule "Nuake/dependencies/glfw"] path = Nuake/dependencies/glfw url = https://github.com/antopilo/glfw.git +[submodule "Nuake/dependencies/vma"] + path = Nuake/dependencies/vma + url = https://github.com/antopilo/VulkanMemoryAllocatorPremake5.git diff --git a/Nuake/dependencies/vma b/Nuake/dependencies/vma new file mode 160000 index 00000000..5a53a198 --- /dev/null +++ b/Nuake/dependencies/vma @@ -0,0 +1 @@ +Subproject commit 5a53a198945ba8260fbc58fadb788745ce6aa263 diff --git a/Nuake/dependencies/vma_p5.lua b/Nuake/dependencies/vma_p5.lua new file mode 100644 index 00000000..c48ff24e --- /dev/null +++ b/Nuake/dependencies/vma_p5.lua @@ -0,0 +1,27 @@ +group "Dependencies" +project "vma" + location "vma" + kind "StaticLib" + language "C++" + cppdialect "C++20" + staticruntime "on" + + -- Include the headers + includedirs { + "vma/include", + "../src/Vendors/vulkan", + } + + files { + "vma/include/**.h", + "vma/include/**.cpp" + } + + filter "configurations:Debug" + runtime "Debug" + symbols "on" + + filter "configurations:Release" + runtime "Release" + optimize "on" +group "" \ No newline at end of file diff --git a/Nuake/src/Rendering/Vulkan/VulkanRenderer.cpp b/Nuake/src/Rendering/Vulkan/VulkanRenderer.cpp index af433f5d..c131fb31 100644 --- a/Nuake/src/Rendering/Vulkan/VulkanRenderer.cpp +++ b/Nuake/src/Rendering/Vulkan/VulkanRenderer.cpp @@ -1,9 +1,12 @@ #include "VulkanRenderer.h" #include "src/Core/Logger.h" +#include + #include "src/Window.h" #include -#include + + using namespace Nuake; @@ -47,6 +50,71 @@ void VkRenderer::Initialize() InitSync(); + VmaVulkanFunctions vulkanFunctions = {}; + vulkanFunctions.vkGetInstanceProcAddr = vkGetInstanceProcAddr; + vulkanFunctions.vkGetDeviceProcAddr = vkGetDeviceProcAddr; + vulkanFunctions.vkAllocateMemory = vkAllocateMemory; + vulkanFunctions.vkFreeMemory = vkFreeMemory; + vulkanFunctions.vkMapMemory = vkMapMemory; + vulkanFunctions.vkUnmapMemory = vkUnmapMemory; + vulkanFunctions.vkFlushMappedMemoryRanges = vkFlushMappedMemoryRanges; + vulkanFunctions.vkInvalidateMappedMemoryRanges = vkInvalidateMappedMemoryRanges; + vulkanFunctions.vkBindBufferMemory = vkBindBufferMemory; + vulkanFunctions.vkBindImageMemory = vkBindImageMemory; + vulkanFunctions.vkGetBufferMemoryRequirements = vkGetBufferMemoryRequirements; + vulkanFunctions.vkGetImageMemoryRequirements = vkGetImageMemoryRequirements; + vulkanFunctions.vkCreateBuffer = vkCreateBuffer; + vulkanFunctions.vkDestroyBuffer = vkDestroyBuffer; + vulkanFunctions.vkCreateImage = vkCreateImage; + vulkanFunctions.vkDestroyImage = vkDestroyImage; + vulkanFunctions.vkCmdCopyBuffer = vkCmdCopyBuffer; + + // Optional: Include extension functions if needed + vulkanFunctions.vkGetBufferMemoryRequirements2KHR = vkGetBufferMemoryRequirements2KHR; + vulkanFunctions.vkGetImageMemoryRequirements2KHR = vkGetImageMemoryRequirements2KHR; + vulkanFunctions.vkBindBufferMemory2KHR = vkBindBufferMemory2KHR; + vulkanFunctions.vkBindImageMemory2KHR = vkBindImageMemory2KHR; + + // Pass the vulkanFunctions struct to the VMA allocator + VmaAllocatorCreateInfo allocatorInfo = {}; + allocatorInfo.physicalDevice = GPU; + allocatorInfo.device = Device; + allocatorInfo.instance = Instance; + allocatorInfo.flags = VMA_ALLOCATOR_CREATE_BUFFER_DEVICE_ADDRESS_BIT; + allocatorInfo.pVulkanFunctions = { + allocatorInfo.pVulkanFunctions = new VmaVulkanFunctions{ + .vkGetInstanceProcAddr = vkGetInstanceProcAddr, + .vkGetDeviceProcAddr = vkGetDeviceProcAddr, + .vkGetPhysicalDeviceProperties = vkGetPhysicalDeviceProperties, + .vkGetPhysicalDeviceMemoryProperties = vkGetPhysicalDeviceMemoryProperties, + .vkAllocateMemory = vkAllocateMemory, + .vkFreeMemory = vkFreeMemory, + .vkMapMemory = vkMapMemory, + .vkUnmapMemory = vkUnmapMemory, + .vkFlushMappedMemoryRanges = vkFlushMappedMemoryRanges, + .vkInvalidateMappedMemoryRanges = vkInvalidateMappedMemoryRanges, + .vkBindBufferMemory = vkBindBufferMemory, + .vkBindImageMemory = vkBindImageMemory, + .vkGetBufferMemoryRequirements = vkGetBufferMemoryRequirements, + .vkGetImageMemoryRequirements = vkGetImageMemoryRequirements, + .vkCreateBuffer = vkCreateBuffer, + .vkDestroyBuffer = vkDestroyBuffer, + .vkCreateImage = vkCreateImage, + .vkDestroyImage = vkDestroyImage, + .vkCmdCopyBuffer = vkCmdCopyBuffer, + .vkGetBufferMemoryRequirements2KHR = vkGetBufferMemoryRequirements2KHR, + .vkGetImageMemoryRequirements2KHR = vkGetImageMemoryRequirements2KHR, + .vkBindBufferMemory2KHR = vkBindBufferMemory2KHR, + .vkBindImageMemory2KHR = vkBindImageMemory2KHR, + } + }; + + vmaCreateAllocator(&allocatorInfo, &Allocator); + + MainDeletionQueue.push_function([&]() { + vmaDestroyAllocator(Allocator); + }); + IsInitialized = true; } diff --git a/Nuake/src/Rendering/Vulkan/VulkanRenderer.h b/Nuake/src/Rendering/Vulkan/VulkanRenderer.h index 10ef42af..c1b08806 100644 --- a/Nuake/src/Rendering/Vulkan/VulkanRenderer.h +++ b/Nuake/src/Rendering/Vulkan/VulkanRenderer.h @@ -5,12 +5,15 @@ #include #include "vkb/VkBootstrap.h" +#include "vk_mem_alloc.h" + +#include namespace Nuake { // Since we need to delete things in order, and manually doing it in the cleanup is -// too tedious to maintain. We will use a queue of destructor to execute in inverse order -// of insertion + // too tedious to maintain. We will use a queue of destructor to execute in inverse order + // of insertion struct DeletionQueue { std::deque> Deletors; @@ -101,6 +104,8 @@ namespace Nuake DeletionQueue MainDeletionQueue; + VmaAllocator Allocator; + public: static VkRenderer& Get() { diff --git a/premake5.lua b/premake5.lua index 28aa39f1..ecfe6633 100644 --- a/premake5.lua +++ b/premake5.lua @@ -45,7 +45,8 @@ workspace "Nuake" outputdir = "%{cfg.buildcfg}-%{cfg.system}-%{cfg.architecture}" local globalDefines = { "TRACY_ENABLE", - "TRACY_ON_DEMAND" + "TRACY_ON_DEMAND", + "NK_VK" } group "Dependencies" @@ -60,6 +61,7 @@ group "Dependencies" include "Nuake/dependencies/yoga_p5.lua" include "Nuake/dependencies/msdf-atlas-gen_p5.lua" include "Nuake/dependencies/freetype_p5.lua" + include "Nuake/dependencies/vma_p5.lua" group "" include "NuakeNet/premake5.lua" @@ -91,6 +93,7 @@ project "Nuake" "_MBCS", "IMGUI_DEFINE_MATH_OPERATORS", + "NK_VK" } targetdir ("bin/" .. outputdir .. "/%{prj.name}") @@ -142,7 +145,10 @@ project "Nuake" "%{prj.name}/src/Vendors/incbin/*.c", "%{prj.name}/src/Vendors/incbin/*.h", "%{prj.name}/src/Vendors/nanosvg/*.h", - + "%{prj.name}/src/Vendors/volk/*.c", + "%{prj.name}/src/Vendors/volk/*.h", + "%{prj.name}/src/Vendors/vkb/*.cpp", + "%{prj.name}/src/Vendors/vkb/*.h", -- Modules System "%{prj.name}/src/Modules/Modules.h", "%{prj.name}/src/Modules/Modules.cpp", @@ -160,11 +166,13 @@ project "Nuake" "%{prj.name}/src/Vendors/wren/src/include", "%{prj.name}/src/Vendors/incbin", "%{prj.name}/src/Vendors/nanosvg", + "%{prj.name}/src/Vendors/vulkan", + "%{prj.name}/src/Vendors/vkb", "%{prj.name}/dependencies/build", "%{prj.name}/dependencies/soloud/include", "%{prj.name}/dependencies/Coral/Coral.Native/Include", "%{prj.name}/dependencies/recastnavigation/DebugUtils/Include", - "%{prj.name}/dependencies/recastnavigation/Detour/Include", + "%{prj.name}/dependencies/recastnavigation/Detour/Include", "%{prj.name}/dependencies/recastnavigation/DetourCrowd/Include", "%{prj.name}/dependencies/recastnavigation/DetourTileCache/Include", "%{prj.name}/dependencies/recastnavigation/Recast/Include", @@ -175,14 +183,15 @@ project "Nuake" "%{prj.name}/dependencies/freetype/include", "%{prj.name}/dependencies/tracy/public/tracy", "%{prj.name}/dependencies/entt/src", - + "%{prj.name}/dependencies/vma/include" } links { "soloud", "tracy", - "yoga" + "yoga", + "vma" } filter "system:linux"