Commit de6734f7 authored by Peng Huang's avatar Peng Huang Committed by Commit Bot

vma_wrapper: create VmaAllocator for vulkan 1.1.0

For vulkan 1.1.0, VmaAllocator will use dedicated memory
allocation for some big vulkan memory request, and free
it when the allocation is released. Without this change,
the VmaAllocator will allocate memory from self managed
memory blocks for all vulkan memory request. And the
memory may not be released when the allocation is
released. VmaAllocator may keep the memory for later
usage. It could be the reason for the memory regression
in fuchsia.

Bug: fuchsia:52463
Change-Id: I7b905435d31b927b2344724f8a2e1738e0544410
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2215414
Commit-Queue: Vasiliy Telezhnikov <vasilyt@chromium.org>
Reviewed-by: default avatarVasiliy Telezhnikov <vasilyt@chromium.org>
Auto-Submit: Peng Huang <penghuang@chromium.org>
Cr-Commit-Position: refs/heads/master@{#771927}
parent d0fc6792
...@@ -22,6 +22,8 @@ from reg import Registry ...@@ -22,6 +22,8 @@ from reg import Registry
registry = Registry() registry = Registry()
registry.loadFile(open(path.join(vulkan_reg_path, "vk.xml"))) registry.loadFile(open(path.join(vulkan_reg_path, "vk.xml")))
VULKAN_REQUIRED_API_VERSION = 'VK_API_VERSION_1_1'
VULKAN_UNASSOCIATED_FUNCTIONS = [ VULKAN_UNASSOCIATED_FUNCTIONS = [
{ {
'functions': [ 'functions': [
...@@ -408,6 +410,8 @@ namespace gpu { ...@@ -408,6 +410,8 @@ namespace gpu {
struct VulkanFunctionPointers; struct VulkanFunctionPointers;
constexpr uint32_t kVulkanRequiredApiVersion = %s;
COMPONENT_EXPORT(VULKAN) VulkanFunctionPointers* GetVulkanFunctionPointers(); COMPONENT_EXPORT(VULKAN) VulkanFunctionPointers* GetVulkanFunctionPointers();
struct COMPONENT_EXPORT(VULKAN) VulkanFunctionPointers { struct COMPONENT_EXPORT(VULKAN) VulkanFunctionPointers {
...@@ -462,7 +466,7 @@ struct COMPONENT_EXPORT(VULKAN) VulkanFunctionPointers { ...@@ -462,7 +466,7 @@ struct COMPONENT_EXPORT(VULKAN) VulkanFunctionPointers {
// Unassociated functions // Unassociated functions
VulkanFunction<PFN_vkGetInstanceProcAddr> vkGetInstanceProcAddr; VulkanFunction<PFN_vkGetInstanceProcAddr> vkGetInstanceProcAddr;
""") """ % VULKAN_REQUIRED_API_VERSION)
WriteFunctionDeclarations(file, VULKAN_UNASSOCIATED_FUNCTIONS) WriteFunctionDeclarations(file, VULKAN_UNASSOCIATED_FUNCTIONS)
...@@ -585,6 +589,7 @@ bool VulkanFunctionPointers::BindInstanceFunctionPointers( ...@@ -585,6 +589,7 @@ bool VulkanFunctionPointers::BindInstanceFunctionPointers(
VkInstance vk_instance, VkInstance vk_instance,
uint32_t api_version, uint32_t api_version,
const gfx::ExtensionSet& enabled_extensions) { const gfx::ExtensionSet& enabled_extensions) {
DCHECK_GE(api_version, kVulkanRequiredApiVersion);
""") """)
WriteInstanceFunctionPointerInitialization(file, VULKAN_INSTANCE_FUNCTIONS); WriteInstanceFunctionPointerInitialization(file, VULKAN_INSTANCE_FUNCTIONS);
...@@ -598,6 +603,7 @@ bool VulkanFunctionPointers::BindDeviceFunctionPointers( ...@@ -598,6 +603,7 @@ bool VulkanFunctionPointers::BindDeviceFunctionPointers(
VkDevice vk_device, VkDevice vk_device,
uint32_t api_version, uint32_t api_version,
const gfx::ExtensionSet& enabled_extensions) { const gfx::ExtensionSet& enabled_extensions) {
DCHECK_GE(api_version, kVulkanRequiredApiVersion);
// Device functions // Device functions
""") """)
WriteDeviceFunctionPointerInitialization(file, VULKAN_DEVICE_FUNCTIONS) WriteDeviceFunctionPointerInitialization(file, VULKAN_DEVICE_FUNCTIONS)
......
...@@ -39,6 +39,7 @@ VkResult CreateAllocator(VkPhysicalDevice physical_device, ...@@ -39,6 +39,7 @@ VkResult CreateAllocator(VkPhysicalDevice physical_device,
function_pointers->vkGetImageMemoryRequirements2.get(), function_pointers->vkGetImageMemoryRequirements2.get(),
}; };
static_assert(kVulkanRequiredApiVersion >= VK_API_VERSION_1_1, "");
VmaAllocatorCreateInfo allocator_info = { VmaAllocatorCreateInfo allocator_info = {
.flags = VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT, .flags = VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT,
.physicalDevice = physical_device, .physicalDevice = physical_device,
...@@ -51,6 +52,7 @@ VkResult CreateAllocator(VkPhysicalDevice physical_device, ...@@ -51,6 +52,7 @@ VkResult CreateAllocator(VkPhysicalDevice physical_device,
.preferredLargeHeapBlockSize = 4 * 1024 * 1024, .preferredLargeHeapBlockSize = 4 * 1024 * 1024,
.pVulkanFunctions = &functions, .pVulkanFunctions = &functions,
.instance = instance, .instance = instance,
.vulkanApiVersion = kVulkanRequiredApiVersion,
}; };
return vmaCreateAllocator(&allocator_info, pAllocator); return vmaCreateAllocator(&allocator_info, pAllocator);
......
...@@ -66,16 +66,14 @@ TEST_F(VulkanCXXTest, CreateInstanceUnique) { ...@@ -66,16 +66,14 @@ TEST_F(VulkanCXXTest, CreateInstanceUnique) {
auto* vulkan_function_pointers = GetVulkanFunctionPointers(); auto* vulkan_function_pointers = GetVulkanFunctionPointers();
EXPECT_TRUE(vulkan_function_pointers->BindUnassociatedFunctionPointers()); EXPECT_TRUE(vulkan_function_pointers->BindUnassociatedFunctionPointers());
constexpr uint32_t kRequiredApiVersion = VK_MAKE_VERSION(1, 1, 0);
vk::Result result; vk::Result result;
uint32_t api_version; uint32_t api_version;
std::tie(result, api_version) = vk::enumerateInstanceVersion(); std::tie(result, api_version) = vk::enumerateInstanceVersion();
EXPECT_EQ(result, vk::Result::eSuccess); EXPECT_EQ(result, vk::Result::eSuccess);
EXPECT_GE(api_version, kRequiredApiVersion); EXPECT_GE(api_version, kVulkanRequiredApiVersion);
vk::ApplicationInfo app_info("VulkanCXXTest", 0, nullptr, 0, vk::ApplicationInfo app_info("VulkanCXXTest", 0, nullptr, 0,
kRequiredApiVersion); kVulkanRequiredApiVersion);
vk::InstanceCreateInfo instance_create_info({}, &app_info); vk::InstanceCreateInfo instance_create_info({}, &app_info);
auto result_value = vk::createInstanceUnique(instance_create_info); auto result_value = vk::createInstanceUnique(instance_create_info);
EXPECT_EQ(result_value.result, vk::Result::eSuccess); EXPECT_EQ(result_value.result, vk::Result::eSuccess);
...@@ -84,7 +82,7 @@ TEST_F(VulkanCXXTest, CreateInstanceUnique) { ...@@ -84,7 +82,7 @@ TEST_F(VulkanCXXTest, CreateInstanceUnique) {
EXPECT_TRUE(instance); EXPECT_TRUE(instance);
EXPECT_TRUE(vulkan_function_pointers->BindInstanceFunctionPointers( EXPECT_TRUE(vulkan_function_pointers->BindInstanceFunctionPointers(
instance.get(), kRequiredApiVersion, gfx::ExtensionSet())); instance.get(), kVulkanRequiredApiVersion, gfx::ExtensionSet()));
instance.reset(); instance.reset();
} }
......
...@@ -74,6 +74,7 @@ bool VulkanFunctionPointers::BindInstanceFunctionPointers( ...@@ -74,6 +74,7 @@ bool VulkanFunctionPointers::BindInstanceFunctionPointers(
VkInstance vk_instance, VkInstance vk_instance,
uint32_t api_version, uint32_t api_version,
const gfx::ExtensionSet& enabled_extensions) { const gfx::ExtensionSet& enabled_extensions) {
DCHECK_GE(api_version, kVulkanRequiredApiVersion);
vkCreateDevice = reinterpret_cast<PFN_vkCreateDevice>( vkCreateDevice = reinterpret_cast<PFN_vkCreateDevice>(
vkGetInstanceProcAddr(vk_instance, "vkCreateDevice")); vkGetInstanceProcAddr(vk_instance, "vkCreateDevice"));
if (!vkCreateDevice) { if (!vkCreateDevice) {
...@@ -356,6 +357,7 @@ bool VulkanFunctionPointers::BindDeviceFunctionPointers( ...@@ -356,6 +357,7 @@ bool VulkanFunctionPointers::BindDeviceFunctionPointers(
VkDevice vk_device, VkDevice vk_device,
uint32_t api_version, uint32_t api_version,
const gfx::ExtensionSet& enabled_extensions) { const gfx::ExtensionSet& enabled_extensions) {
DCHECK_GE(api_version, kVulkanRequiredApiVersion);
// Device functions // Device functions
vkAllocateCommandBuffers = reinterpret_cast<PFN_vkAllocateCommandBuffers>( vkAllocateCommandBuffers = reinterpret_cast<PFN_vkAllocateCommandBuffers>(
vkGetDeviceProcAddr(vk_device, "vkAllocateCommandBuffers")); vkGetDeviceProcAddr(vk_device, "vkAllocateCommandBuffers"));
......
...@@ -44,6 +44,8 @@ namespace gpu { ...@@ -44,6 +44,8 @@ namespace gpu {
struct VulkanFunctionPointers; struct VulkanFunctionPointers;
constexpr uint32_t kVulkanRequiredApiVersion = VK_API_VERSION_1_1;
COMPONENT_EXPORT(VULKAN) VulkanFunctionPointers* GetVulkanFunctionPointers(); COMPONENT_EXPORT(VULKAN) VulkanFunctionPointers* GetVulkanFunctionPointers();
struct COMPONENT_EXPORT(VULKAN) VulkanFunctionPointers { struct COMPONENT_EXPORT(VULKAN) VulkanFunctionPointers {
......
...@@ -60,8 +60,6 @@ VulkanWarningCallback(VkDebugReportFlagsEXT flags, ...@@ -60,8 +60,6 @@ VulkanWarningCallback(VkDebugReportFlagsEXT flags,
} }
#endif // DCHECK_IS_ON() #endif // DCHECK_IS_ON()
constexpr uint32_t kRequiredApiVersion = VK_MAKE_VERSION(1, 1, 0);
} // namespace } // namespace
VulkanInstance::VulkanInstance() = default; VulkanInstance::VulkanInstance() = default;
...@@ -87,13 +85,13 @@ bool VulkanInstance::Initialize( ...@@ -87,13 +85,13 @@ bool VulkanInstance::Initialize(
return false; return false;
} }
if (vulkan_info_.api_version < kRequiredApiVersion) if (vulkan_info_.api_version < kVulkanRequiredApiVersion)
return false; return false;
gpu::crash_keys::vulkan_api_version.Set( gpu::crash_keys::vulkan_api_version.Set(
VkVersionToString(vulkan_info_.api_version)); VkVersionToString(vulkan_info_.api_version));
vulkan_info_.used_api_version = kRequiredApiVersion; vulkan_info_.used_api_version = kVulkanRequiredApiVersion;
VkApplicationInfo app_info = {}; VkApplicationInfo app_info = {};
app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO; app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
...@@ -306,24 +304,21 @@ bool VulkanInstance::CollectInfo() { ...@@ -306,24 +304,21 @@ bool VulkanInstance::CollectInfo() {
// API version of the VkPhysicalDevice, so we need to check the GPU's // API version of the VkPhysicalDevice, so we need to check the GPU's
// API version instead of just testing to see if // API version instead of just testing to see if
// vkGetPhysicalDeviceFeatures2 is non-null. // vkGetPhysicalDeviceFeatures2 is non-null.
if (info.properties.apiVersion >= VK_MAKE_VERSION(1, 1, 0)) { static_assert(kVulkanRequiredApiVersion >= VK_API_VERSION_1_1, "");
VkPhysicalDeviceSamplerYcbcrConversionFeatures ycbcr_conversion_features = VkPhysicalDeviceSamplerYcbcrConversionFeatures ycbcr_conversion_features = {
{VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES}; VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES};
VkPhysicalDeviceProtectedMemoryFeatures protected_memory_feature = { VkPhysicalDeviceProtectedMemoryFeatures protected_memory_feature = {
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES}; VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES};
VkPhysicalDeviceFeatures2 features_2 = { VkPhysicalDeviceFeatures2 features_2 = {
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2}; VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2};
features_2.pNext = &ycbcr_conversion_features; features_2.pNext = &ycbcr_conversion_features;
ycbcr_conversion_features.pNext = &protected_memory_feature; ycbcr_conversion_features.pNext = &protected_memory_feature;
vkGetPhysicalDeviceFeatures2(device, &features_2); vkGetPhysicalDeviceFeatures2(device, &features_2);
info.features = features_2.features; info.features = features_2.features;
info.feature_sampler_ycbcr_conversion = info.feature_sampler_ycbcr_conversion =
ycbcr_conversion_features.samplerYcbcrConversion; ycbcr_conversion_features.samplerYcbcrConversion;
info.feature_protected_memory = protected_memory_feature.protectedMemory; info.feature_protected_memory = protected_memory_feature.protectedMemory;
} else {
vkGetPhysicalDeviceFeatures(device, &info.features);
}
count = 0; count = 0;
vkGetPhysicalDeviceQueueFamilyProperties(device, &count, nullptr); vkGetPhysicalDeviceQueueFamilyProperties(device, &count, nullptr);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment