Further development of budget management
diff --git a/src/VulkanSample.cpp b/src/VulkanSample.cpp
index dc9e76c..0865bdb 100644
--- a/src/VulkanSample.cpp
+++ b/src/VulkanSample.cpp
@@ -46,8 +46,10 @@
static bool g_EnableValidationLayer = true;
static bool VK_KHR_get_memory_requirements2_enabled = false;
+static bool VK_KHR_get_physical_device_properties2_enabled = false;
static bool VK_KHR_dedicated_allocation_enabled = false;
static bool VK_KHR_bind_memory2_enabled = false;
+static bool VK_EXT_memory_budget_enabled = false;
bool g_SparseBindingEnabled = false;
static HINSTANCE g_hAppInstance;
@@ -1115,15 +1117,32 @@
}
}
- std::vector<const char*> instanceExtensions;
- instanceExtensions.push_back(VK_KHR_SURFACE_EXTENSION_NAME);
- instanceExtensions.push_back(VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
+ uint32_t availableInstanceExtensionCount = 0;
+ ERR_GUARD_VULKAN( vkEnumerateInstanceExtensionProperties(nullptr, &availableInstanceExtensionCount, nullptr) );
+ std::vector<VkExtensionProperties> availableInstanceExtensions(availableInstanceExtensionCount);
+ if(availableInstanceExtensionCount > 0)
+ {
+ ERR_GUARD_VULKAN( vkEnumerateInstanceExtensionProperties(nullptr, &availableInstanceExtensionCount, availableInstanceExtensions.data()) );
+ }
+
+ std::vector<const char*> enabledInstanceExtensions;
+ enabledInstanceExtensions.push_back(VK_KHR_SURFACE_EXTENSION_NAME);
+ enabledInstanceExtensions.push_back(VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
std::vector<const char*> instanceLayers;
if(g_EnableValidationLayer == true)
{
instanceLayers.push_back(VALIDATION_LAYER_NAME);
- instanceExtensions.push_back("VK_EXT_debug_report");
+ enabledInstanceExtensions.push_back("VK_EXT_debug_report");
+ }
+
+ for(const auto& extensionProperties : availableInstanceExtensions)
+ {
+ if(strcmp(extensionProperties.extensionName, VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME) == 0)
+ {
+ enabledInstanceExtensions.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
+ VK_KHR_get_physical_device_properties2_enabled = true;
+ }
}
VkApplicationInfo appInfo = { VK_STRUCTURE_TYPE_APPLICATION_INFO };
@@ -1135,8 +1154,8 @@
VkInstanceCreateInfo instInfo = { VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO };
instInfo.pApplicationInfo = &appInfo;
- instInfo.enabledExtensionCount = static_cast<uint32_t>(instanceExtensions.size());
- instInfo.ppEnabledExtensionNames = instanceExtensions.data();
+ instInfo.enabledExtensionCount = static_cast<uint32_t>(enabledInstanceExtensions.size());
+ instInfo.ppEnabledExtensionNames = enabledInstanceExtensions.data();
instInfo.enabledLayerCount = static_cast<uint32_t>(instanceLayers.size());
instInfo.ppEnabledLayerNames = instanceLayers.data();
@@ -1282,6 +1301,11 @@
enabledDeviceExtensions.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
VK_KHR_bind_memory2_enabled = true;
}
+ else if(strcmp(properties[i].extensionName, VK_EXT_MEMORY_BUDGET_EXTENSION_NAME) == 0)
+ {
+ enabledDeviceExtensions.push_back(VK_EXT_MEMORY_BUDGET_EXTENSION_NAME);
+ VK_EXT_memory_budget_enabled = true;
+ }
}
}
}
@@ -1302,6 +1326,7 @@
VmaAllocatorCreateInfo allocatorInfo = {};
allocatorInfo.physicalDevice = g_hPhysicalDevice;
allocatorInfo.device = g_hDevice;
+ allocatorInfo.instance = g_hVulkanInstance;
if(VK_KHR_dedicated_allocation_enabled)
{
@@ -1322,6 +1347,10 @@
{
allocatorInfo.flags |= VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT;
}
+ if(VK_EXT_memory_budget_enabled && VK_KHR_get_physical_device_properties2_enabled)
+ {
+ allocatorInfo.flags |= VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT;
+ }
if(USE_CUSTOM_CPU_ALLOCATION_CALLBACKS)
{
@@ -1341,7 +1370,7 @@
/*
std::array<VkDeviceSize, VK_MAX_MEMORY_HEAPS> heapSizeLimit;
std::fill(heapSizeLimit.begin(), heapSizeLimit.end(), VK_WHOLE_SIZE);
- heapSizeLimit[0] = 100ull * 1024 * 1024;
+ heapSizeLimit[0] = 512ull * 1024 * 1024;
allocatorInfo.pHeapSizeLimit = heapSizeLimit.data();
*/