Browse Source

Merge pull request #51524 from RandomShaper/faster_vma

Upgrade Vulkan Memory Allocator, use Volk on Android
Rémi Verschelde 4 years ago
parent
commit
4c53669d8a

+ 1 - 1
COPYRIGHT.txt

@@ -453,7 +453,7 @@ License: Apache-2.0
 
 Files: ./thirdparty/vulkan/vk_mem_alloc.h
 Comment: Vulkan Memory Allocator
-Copyright: 2017-2019, Advanced Micro Devices, Inc.
+Copyright: 2017-2021, Advanced Micro Devices, Inc.
 License: Expat
 
 Files: ./thirdparty/wslay/

+ 7 - 14
drivers/vulkan/SCsub

@@ -6,24 +6,13 @@ thirdparty_obj = []
 thirdparty_dir = "#thirdparty/vulkan"
 thirdparty_volk_dir = "#thirdparty/volk"
 
+# Use bundled Vulkan headers
+env.Prepend(CPPPATH=[thirdparty_dir, thirdparty_dir + "/include"])
+
 if env["use_volk"]:
     env.AppendUnique(CPPDEFINES=["USE_VOLK"])
     env.Prepend(CPPPATH=[thirdparty_volk_dir])
 
-if env["platform"] == "android" and not env["use_volk"]:
-    # Use NDK Vulkan headers
-    ndk_vulkan_dir = env["ANDROID_NDK_ROOT"] + "/sources/third_party/vulkan/src"
-    thirdparty_includes = [
-        ndk_vulkan_dir,
-        ndk_vulkan_dir + "/include",
-        ndk_vulkan_dir + "/layers",
-        ndk_vulkan_dir + "/layers/generated",
-    ]
-    env.Prepend(CPPPATH=thirdparty_includes)
-else:
-    # Use bundled Vulkan headers
-    env.Prepend(CPPPATH=[thirdparty_dir, thirdparty_dir + "/include"])
-
 if env["platform"] == "android":
     env.AppendUnique(CPPDEFINES=["VK_USE_PLATFORM_ANDROID_KHR"])
 elif env["platform"] == "iphone":
@@ -47,6 +36,10 @@ if env["use_volk"]:
 
     thirdparty_sources_volk = [thirdparty_volk_dir + "/volk.c"]
     env_thirdparty_volk.add_source_files(thirdparty_obj, thirdparty_sources_volk)
+elif env["platform"] == "android":
+    # Our current NDK version only provides old Vulkan headers,
+    # so we have to limit VMA.
+    env_thirdparty_vma.AppendUnique(CPPDEFINES=["VMA_VULKAN_VERSION=1000000"])
 
 env_thirdparty_vma.add_source_files(thirdparty_obj, thirdparty_sources_vma)
 

+ 1 - 0
drivers/vulkan/rendering_device_vulkan.cpp

@@ -8794,6 +8794,7 @@ void RenderingDeviceVulkan::initialize(VulkanContext *p_context, bool p_local_de
 		memset(&allocatorInfo, 0, sizeof(VmaAllocatorCreateInfo));
 		allocatorInfo.physicalDevice = p_context->get_physical_device();
 		allocatorInfo.device = device;
+		allocatorInfo.instance = p_context->get_instance();
 		vmaCreateAllocator(&allocatorInfo, &allocator);
 	}
 

+ 1 - 4
drivers/vulkan/vulkan_context.h

@@ -233,10 +233,6 @@ protected:
 
 	Error _get_preferred_validation_layers(uint32_t *count, const char *const **names);
 
-	VkInstance _get_instance() {
-		return inst;
-	}
-
 public:
 	uint32_t get_vulkan_major() const { return vulkan_major; };
 	uint32_t get_vulkan_minor() const { return vulkan_minor; };
@@ -245,6 +241,7 @@ public:
 
 	VkDevice get_device();
 	VkPhysicalDevice get_physical_device();
+	VkInstance get_instance() { return inst; }
 	int get_swapchain_image_count() const;
 	uint32_t get_graphics_queue() const;
 

+ 0 - 1
platform/android/detect.py

@@ -54,7 +54,6 @@ def get_android_ndk_root():
 def get_flags():
     return [
         ("tools", False),
-        ("use_volk", False),
     ]
 
 

+ 1 - 1
platform/android/vulkan/vulkan_context_android.cpp

@@ -48,7 +48,7 @@ int VulkanContextAndroid::window_create(ANativeWindow *p_window, DisplayServer::
 	createInfo.window = p_window;
 
 	VkSurfaceKHR surface;
-	VkResult err = vkCreateAndroidSurfaceKHR(_get_instance(), &createInfo, nullptr, &surface);
+	VkResult err = vkCreateAndroidSurfaceKHR(get_instance(), &createInfo, nullptr, &surface);
 	if (err != VK_SUCCESS) {
 		ERR_FAIL_V_MSG(-1, "vkCreateAndroidSurfaceKHR failed with error " + itos(err));
 	}

+ 1 - 1
platform/iphone/vulkan_context_iphone.mm

@@ -48,7 +48,7 @@ Error VulkanContextIPhone::window_create(DisplayServer::WindowID p_window_id, Di
 
 	VkSurfaceKHR surface;
 	VkResult err =
-			vkCreateIOSSurfaceMVK(_get_instance(), &createInfo, nullptr, &surface);
+			vkCreateIOSSurfaceMVK(get_instance(), &createInfo, nullptr, &surface);
 	ERR_FAIL_COND_V(err, ERR_CANT_CREATE);
 
 	return _window_create(p_window_id, p_vsync_mode, surface, p_width, p_height);

+ 1 - 1
platform/linuxbsd/vulkan_context_x11.cpp

@@ -48,7 +48,7 @@ Error VulkanContextX11::window_create(DisplayServer::WindowID p_window_id, Displ
 	createInfo.window = p_window;
 
 	VkSurfaceKHR surface;
-	VkResult err = vkCreateXlibSurfaceKHR(_get_instance(), &createInfo, nullptr, &surface);
+	VkResult err = vkCreateXlibSurfaceKHR(get_instance(), &createInfo, nullptr, &surface);
 	ERR_FAIL_COND_V(err, ERR_CANT_CREATE);
 	return _window_create(p_window_id, p_vsync_mode, surface, p_width, p_height);
 }

+ 1 - 1
platform/osx/vulkan_context_osx.mm

@@ -47,7 +47,7 @@ Error VulkanContextOSX::window_create(DisplayServer::WindowID p_window_id, Displ
 	createInfo.pView = p_window;
 
 	VkSurfaceKHR surface;
-	VkResult err = vkCreateMacOSSurfaceMVK(_get_instance(), &createInfo, nullptr, &surface);
+	VkResult err = vkCreateMacOSSurfaceMVK(get_instance(), &createInfo, nullptr, &surface);
 	ERR_FAIL_COND_V(err, ERR_CANT_CREATE);
 	return _window_create(p_window_id, p_vsync_mode, surface, p_width, p_height);
 }

+ 1 - 1
platform/windows/vulkan_context_win.cpp

@@ -47,7 +47,7 @@ int VulkanContextWindows::window_create(DisplayServer::WindowID p_window_id, Dis
 	createInfo.hinstance = p_instance;
 	createInfo.hwnd = p_window;
 	VkSurfaceKHR surface;
-	VkResult err = vkCreateWin32SurfaceKHR(_get_instance(), &createInfo, nullptr, &surface);
+	VkResult err = vkCreateWin32SurfaceKHR(get_instance(), &createInfo, nullptr, &surface);
 	ERR_FAIL_COND_V(err, -1);
 	return _window_create(p_window_id, p_vsync_mode, surface, p_width, p_height);
 }

+ 2 - 2
thirdparty/README.md

@@ -692,8 +692,8 @@ Files extracted from upstream source:
 SDK release: https://github.com/KhronosGroup/Vulkan-ValidationLayers/blob/master/layers/generated/vk_enum_string_helper.h
 
 `vk_mem_alloc.h` is taken from https://github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator
-Version: 2.3.0 (2019)
-`vk_mem_alloc.cpp` and `android/vk_mem_alloc.cpp` are Godot files and should be preserved on updates.
+Version: 3.0.0-development (2021-06-21), branch `feature-small-buffers`, commit `cfea2f72851f9ee4a399769f18865047b83711f1`
+`vk_mem_alloc.cpp` is a Godot file and should be preserved on updates.
 
 Patches in the `patches` directory should be re-applied after updates.
 

+ 0 - 29
thirdparty/vulkan/patches/VMA-assert-remove.patch

@@ -1,29 +0,0 @@
-diff --git a/thirdparty/vulkan/vk_mem_alloc.h b/thirdparty/vulkan/vk_mem_alloc.h
-index 0dfb66efc6..8a42699e7f 100644
---- a/thirdparty/vulkan/vk_mem_alloc.h
-+++ b/thirdparty/vulkan/vk_mem_alloc.h
-@@ -17508,24 +17508,6 @@ VMA_CALL_PRE VkResult VMA_CALL_POST vmaCreateBuffer(
-         allocator->GetBufferMemoryRequirements(*pBuffer, vkMemReq,
-             requiresDedicatedAllocation, prefersDedicatedAllocation);
- 
--        // Make sure alignment requirements for specific buffer usages reported
--        // in Physical Device Properties are included in alignment reported by memory requirements.
--        if((pBufferCreateInfo->usage & VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT) != 0)
--        {
--           VMA_ASSERT(vkMemReq.alignment %
--              allocator->m_PhysicalDeviceProperties.limits.minTexelBufferOffsetAlignment == 0);
--        }
--        if((pBufferCreateInfo->usage & VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT) != 0)
--        {
--           VMA_ASSERT(vkMemReq.alignment %
--              allocator->m_PhysicalDeviceProperties.limits.minUniformBufferOffsetAlignment == 0);
--        }
--        if((pBufferCreateInfo->usage & VK_BUFFER_USAGE_STORAGE_BUFFER_BIT) != 0)
--        {
--           VMA_ASSERT(vkMemReq.alignment %
--              allocator->m_PhysicalDeviceProperties.limits.minStorageBufferOffsetAlignment == 0);
--        }
--
-         // 3. Allocate memory using allocator.
-         res = allocator->AllocateMemory(
-             vkMemReq,

File diff suppressed because it is too large
+ 571 - 111
thirdparty/vulkan/vk_mem_alloc.h


Some files were not shown because too many files changed in this diff