Merge pull request #51524 from RandomShaper/faster_vma
Upgrade Vulkan Memory Allocator, use Volk on Android
This commit is contained in:
commit
4c53669d8a
13 changed files with 2958 additions and 1014 deletions
|
@ -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/
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -54,7 +54,6 @@ def get_android_ndk_root():
|
|||
def get_flags():
|
||||
return [
|
||||
("tools", False),
|
||||
("use_volk", False),
|
||||
]
|
||||
|
||||
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
4
thirdparty/README.md
vendored
4
thirdparty/README.md
vendored
|
@ -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.
|
||||
|
||||
|
|
|
@ -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,
|
3899
thirdparty/vulkan/vk_mem_alloc.h
vendored
3899
thirdparty/vulkan/vk_mem_alloc.h
vendored
File diff suppressed because it is too large
Load diff
Loading…
Reference in a new issue