Vulkan 1.1 suport - prototype
diff --git a/src/VmaUsage.h b/src/VmaUsage.h
index 32980b6..9e0c09a 100644
--- a/src/VmaUsage.h
+++ b/src/VmaUsage.h
@@ -58,6 +58,10 @@
 //#define VMA_USE_STL_SHARED_MUTEX 0

 //#define VMA_DEBUG_GLOBAL_MUTEX 1

 //#define VMA_MEMORY_BUDGET 0

+

+//#define VMA_VULKAN_VERSION 1001000 // Vulkan 1.1

+#define VMA_VULKAN_VERSION 1000000 // Vulkan 1.0

+

 /*

 #define VMA_DEBUG_LOG(format, ...) do { \

         printf(format, __VA_ARGS__); \

diff --git a/src/VulkanSample.cpp b/src/VulkanSample.cpp
index bd4a422..7ea9fd8 100644
--- a/src/VulkanSample.cpp
+++ b/src/VulkanSample.cpp
@@ -1172,7 +1172,7 @@
     appInfo.applicationVersion = VK_MAKE_VERSION(1, 0, 0);

     appInfo.pEngineName = "Adam Sawicki Engine";

     appInfo.engineVersion = VK_MAKE_VERSION(1, 0, 0);

-    appInfo.apiVersion = VK_API_VERSION_1_0;

+    appInfo.apiVersion = VMA_VULKAN_VERSION == 1001000 ? VK_API_VERSION_1_1 : VK_API_VERSION_1_0;

 

     VkInstanceCreateInfo instInfo = { VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO };

     instInfo.pApplicationInfo = &appInfo;

@@ -1349,6 +1349,7 @@
     allocatorInfo.physicalDevice = g_hPhysicalDevice;

     allocatorInfo.device = g_hDevice;

     allocatorInfo.instance = g_hVulkanInstance;

+    allocatorInfo.vulkanApiVersion = appInfo.apiVersion;

 

     if(VK_KHR_dedicated_allocation_enabled)

     {

diff --git a/src/vk_mem_alloc.h b/src/vk_mem_alloc.h
index 6db215d..8e74dba 100644
--- a/src/vk_mem_alloc.h
+++ b/src/vk_mem_alloc.h
@@ -1777,6 +1777,17 @@
     #include <windows.h>

 #endif

 

+// Define this macro to declare maximum supported Vulkan version in format AAABBBCCC,

+// where AAA = major, BBB = minor, CCC = patch.

+// If you want to use version > 1.0, it still needs to be enabled via VmaAllocatorCreateInfo::vulkanApiVersion.

+#if !defined(VMA_VULKAN_VERSION)

+    #if defined(VK_VERSION_1_1)

+        #define VMA_VULKAN_VERSION 1001000

+    #else

+        #define VMA_VULKAN_VERSION 1000000

+    #endif

+#endif

+

 #if !defined(VMA_DEDICATED_ALLOCATION)

     #if VK_KHR_get_memory_requirements2 && VK_KHR_dedicated_allocation

         #define VMA_DEDICATED_ALLOCATION 1

@@ -1794,7 +1805,7 @@
 #endif

 

 #if !defined(VMA_MEMORY_BUDGET)

-    #if VK_EXT_memory_budget && VK_KHR_get_physical_device_properties2

+    #if VK_EXT_memory_budget && (VK_KHR_get_physical_device_properties2 || VMA_VULKAN_VERSION >= 1001000)

         #define VMA_MEMORY_BUDGET 1

     #else

         #define VMA_MEMORY_BUDGET 0

@@ -1860,6 +1871,9 @@
     VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT = 0x00000001,

     /** \brief Enables usage of VK_KHR_dedicated_allocation extension.

 

+    The flag works only if VmaAllocatorCreateInfo::vulkanApiVersion `== VK_API_VERSION_1_0`.

+    When it's `VK_API_VERSION_1_1`, the flag is ignored because the extension has been promoted to Vulkan 1.1.

+

     Using this extenion will automatically allocate dedicated blocks of memory for

     some buffers and images instead of suballocating place for them out of bigger

     memory blocks (as if you explicitly used #VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT

@@ -1883,6 +1897,9 @@
     /**

     Enables usage of VK_KHR_bind_memory2 extension.

 

+    The flag works only if VmaAllocatorCreateInfo::vulkanApiVersion `== VK_API_VERSION_1_0`.

+    When it's `VK_API_VERSION_1_1`, the flag is ignored because the extension has been promoted to Vulkan 1.1.

+

     You may set this flag only if you found out that this device extension is supported,

     you enabled it while creating Vulkan device passed as VmaAllocatorCreateInfo::device,

     and you want it to be used internally by this library.

@@ -1898,7 +1915,7 @@
     You may set this flag only if you found out that this device extension is supported,

     you enabled it while creating Vulkan device passed as VmaAllocatorCreateInfo::device,

     and you want it to be used internally by this library, along with another instance extension

-    VK_KHR_get_physical_device_properties2, which is required by it.

+    VK_KHR_get_physical_device_properties2, which is required by it (or Vulkan 1.1, where this extension is promoted).

 

     The extension provides query for current memory usage and budget, which will probably

     be more accurate than an estimation used by the library otherwise.

@@ -1931,15 +1948,15 @@
     PFN_vkCreateImage vkCreateImage;

     PFN_vkDestroyImage vkDestroyImage;

     PFN_vkCmdCopyBuffer vkCmdCopyBuffer;

-#if VMA_DEDICATED_ALLOCATION

+#if VMA_DEDICATED_ALLOCATION || VMA_VULKAN_VERSION >= 1001000

     PFN_vkGetBufferMemoryRequirements2KHR vkGetBufferMemoryRequirements2KHR;

     PFN_vkGetImageMemoryRequirements2KHR vkGetImageMemoryRequirements2KHR;

 #endif

-#if VMA_BIND_MEMORY2

+#if VMA_BIND_MEMORY2 || VMA_VULKAN_VERSION >= 1001000

     PFN_vkBindBufferMemory2KHR vkBindBufferMemory2KHR;

     PFN_vkBindImageMemory2KHR vkBindImageMemory2KHR;

 #endif

-#if VMA_MEMORY_BUDGET

+#if VMA_MEMORY_BUDGET || VMA_VULKAN_VERSION >= 1001000

     PFN_vkGetPhysicalDeviceMemoryProperties2KHR vkGetPhysicalDeviceMemoryProperties2KHR;

 #endif

 } VmaVulkanFunctions;

@@ -2052,9 +2069,19 @@
     const VmaRecordSettings* pRecordSettings;

     /** \brief Optional handle to Vulkan instance object.

 

-    Optional, can be null. Must be set if #VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT flas is used.

+    Optional, can be null. Must be set if #VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT flas is used

+    or if `vulkanApiVersion >= VK_MAKE_VERSION(1, 1, 0)`.

     */

     VkInstance instance;

+    /** \brief Optional. The highest version of Vulkan that the application is designed to use.

+    

+    It must be a value in the format as created by macro `VK_MAKE_VERSION` or a constant like: `VK_API_VERSION_1_1`, `VK_API_VERSION_1_0`.

+    The patch version number specified is ignored. Only the major and minor versions are considered.

+    It must be less or euqal (preferably equal) to value as passed to `vkCreateInstance` as `VkApplicationInfo::apiVersion`.

+    Only versions 1.0 and 1.1 are supported by the current implementation.

+    Leaving it initialized to zero is equivalent to `VK_API_VERSION_1_0`.

+    */

+    uint32_t vulkanApiVersion;

 } VmaAllocatorCreateInfo;

 

 /// Creates Allocator object.

@@ -3293,8 +3320,8 @@
 

 This function is similar to vmaBindBufferMemory(), but it provides additional parameters.

 

-If `pNext` is not null, #VmaAllocator object must have been created with #VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT flag.

-Otherwise the call fails.

+If `pNext` is not null, #VmaAllocator object must have been created with #VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT flag

+or with VmaAllocatorCreateInfo::vulkanApiVersion `== VK_API_VERSION_1_1`. Otherwise the call fails.

 */

 VMA_CALL_PRE VkResult VMA_CALL_POST vmaBindBufferMemory2(

     VmaAllocator allocator,

@@ -3327,8 +3354,8 @@
 

 This function is similar to vmaBindImageMemory(), but it provides additional parameters.

 

-If `pNext` is not null, #VmaAllocator object must have been created with #VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT flag.

-Otherwise the call fails.

+If `pNext` is not null, #VmaAllocator object must have been created with #VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT flag

+or with VmaAllocatorCreateInfo::vulkanApiVersion `== VK_API_VERSION_1_1`. Otherwise the call fails.

 */

 VMA_CALL_PRE VkResult VMA_CALL_POST vmaBindImageMemory2(

     VmaAllocator allocator,

@@ -7015,8 +7042,9 @@
     VMA_CLASS_NO_COPY(VmaAllocator_T)

 public:

     bool m_UseMutex;

-    bool m_UseKhrDedicatedAllocation;

-    bool m_UseKhrBindMemory2;

+    uint32_t m_VulkanApiVersion;

+    bool m_UseKhrDedicatedAllocation; // Can be set only if m_VulkanApiVersion < VK_MAKE_VERSION(1, 1, 0).

+    bool m_UseKhrBindMemory2; // Can be set only if m_VulkanApiVersion < VK_MAKE_VERSION(1, 1, 0).

     bool m_UseExtMemoryBudget;

     VkDevice m_hDevice;

     VkInstance m_hInstance;

@@ -14495,6 +14523,7 @@
 

 VmaAllocator_T::VmaAllocator_T(const VmaAllocatorCreateInfo* pCreateInfo) :

     m_UseMutex((pCreateInfo->flags & VMA_ALLOCATOR_CREATE_EXTERNALLY_SYNCHRONIZED_BIT) == 0),

+    m_VulkanApiVersion(pCreateInfo->vulkanApiVersion != 0 ? pCreateInfo->vulkanApiVersion : VK_API_VERSION_1_0),

     m_UseKhrDedicatedAllocation((pCreateInfo->flags & VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT) != 0),

     m_UseKhrBindMemory2((pCreateInfo->flags & VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT) != 0),

     m_UseExtMemoryBudget((pCreateInfo->flags & VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT) != 0),

@@ -14515,6 +14544,12 @@
     ,m_pRecorder(VMA_NULL)

 #endif

 {

+    if(m_VulkanApiVersion >= VK_MAKE_VERSION(1, 1, 0))

+    {

+        m_UseKhrDedicatedAllocation = false;

+        m_UseKhrBindMemory2 = false;

+    }

+

     if(VMA_DEBUG_DETECT_CORRUPTION)

     {

         // Needs to be multiply of uint32_t size because we are going to write VMA_CORRUPTION_DETECTION_MAGIC_VALUE to it.

@@ -14523,24 +14558,33 @@
 

     VMA_ASSERT(pCreateInfo->physicalDevice && pCreateInfo->device);

 

-#if !(VMA_DEDICATED_ALLOCATION)

-    if((pCreateInfo->flags & VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT) != 0)

+    if(m_VulkanApiVersion < VK_MAKE_VERSION(1, 1, 0))

     {

-        VMA_ASSERT(0 && "VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT set but required extensions are disabled by preprocessor macros.");

-    }

+#if !(VMA_DEDICATED_ALLOCATION)

+        if((pCreateInfo->flags & VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT) != 0)

+        {

+            VMA_ASSERT(0 && "VMA_ALLOCATOR_CREATE_KHR_DEDICATED_ALLOCATION_BIT set but required extensions are disabled by preprocessor macros.");

+        }

 #endif

 #if !(VMA_BIND_MEMORY2)

-    if((pCreateInfo->flags & VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT) != 0)

-    {

-        VMA_ASSERT(0 && "VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT set but required extension is disabled by preprocessor macros.");

-    }

+        if((pCreateInfo->flags & VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT) != 0)

+        {

+            VMA_ASSERT(0 && "VMA_ALLOCATOR_CREATE_KHR_BIND_MEMORY2_BIT set but required extension is disabled by preprocessor macros.");

+        }

 #endif

+    }

 #if !(VMA_MEMORY_BUDGET)

     if((pCreateInfo->flags & VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT) != 0)

     {

         VMA_ASSERT(0 && "VMA_ALLOCATOR_CREATE_EXT_MEMORY_BUDGET_BIT set but required extension is disabled by preprocessor macros.");

     }

 #endif

+#if VMA_VULKAN_VERSION < 1001000

+    if(m_VulkanApiVersion >= VK_MAKE_VERSION(1, 1, 0))

+    {

+        VMA_ASSERT(0 && "vulkanApiVersion >= VK_API_VERSION_1_1 but required Vulkan version is disabled by preprocessor macros.");

+    }

+#endif

 

     memset(&m_DeviceMemoryCallbacks, 0 ,sizeof(m_DeviceMemoryCallbacks));

     memset(&m_PhysicalDeviceProperties, 0, sizeof(m_PhysicalDeviceProperties));

@@ -14688,6 +14732,22 @@
     m_VulkanFunctions.vkCreateImage = (PFN_vkCreateImage)vkCreateImage;

     m_VulkanFunctions.vkDestroyImage = (PFN_vkDestroyImage)vkDestroyImage;

     m_VulkanFunctions.vkCmdCopyBuffer = (PFN_vkCmdCopyBuffer)vkCmdCopyBuffer;

+#if VMA_VULKAN_VERSION >= 1001000

+    if(m_VulkanApiVersion >= VK_MAKE_VERSION(1, 1, 0))

+    {

+        VMA_ASSERT(m_hInstance != VK_NULL_HANDLE);

+        m_VulkanFunctions.vkGetBufferMemoryRequirements2KHR =

+            (PFN_vkGetBufferMemoryRequirements2KHR)vkGetDeviceProcAddr(m_hDevice, "vkGetBufferMemoryRequirements2");

+        m_VulkanFunctions.vkGetImageMemoryRequirements2KHR =

+            (PFN_vkGetImageMemoryRequirements2KHR)vkGetDeviceProcAddr(m_hDevice, "vkGetImageMemoryRequirements2");

+        m_VulkanFunctions.vkBindBufferMemory2KHR =

+            (PFN_vkBindBufferMemory2KHR)vkGetDeviceProcAddr(m_hDevice, "vkBindBufferMemory2");

+        m_VulkanFunctions.vkBindImageMemory2KHR =

+            (PFN_vkBindImageMemory2KHR)vkGetDeviceProcAddr(m_hDevice, "vkBindImageMemory2");

+        m_VulkanFunctions.vkGetPhysicalDeviceMemoryProperties2KHR =

+            (PFN_vkGetPhysicalDeviceMemoryProperties2KHR)vkGetInstanceProcAddr(m_hInstance, "vkGetPhysicalDeviceMemoryProperties2");

+    }

+#endif

 #if VMA_DEDICATED_ALLOCATION

     if(m_UseKhrDedicatedAllocation)

     {

@@ -14696,7 +14756,7 @@
         m_VulkanFunctions.vkGetImageMemoryRequirements2KHR =

             (PFN_vkGetImageMemoryRequirements2KHR)vkGetDeviceProcAddr(m_hDevice, "vkGetImageMemoryRequirements2KHR");

     }

-#endif // #if VMA_DEDICATED_ALLOCATION

+#endif

 #if VMA_BIND_MEMORY2

     if(m_UseKhrBindMemory2)

     {

@@ -14707,7 +14767,7 @@
     }

 #endif // #if VMA_BIND_MEMORY2

 #if VMA_MEMORY_BUDGET

-    if(m_UseExtMemoryBudget)

+    if(m_UseExtMemoryBudget && m_VulkanApiVersion < VK_MAKE_VERSION(1, 1, 0))

     {

         VMA_ASSERT(m_hInstance != VK_NULL_HANDLE);

         m_VulkanFunctions.vkGetPhysicalDeviceMemoryProperties2KHR =

@@ -14738,11 +14798,11 @@
         VMA_COPY_IF_NOT_NULL(vkCreateImage);

         VMA_COPY_IF_NOT_NULL(vkDestroyImage);

         VMA_COPY_IF_NOT_NULL(vkCmdCopyBuffer);

-#if VMA_DEDICATED_ALLOCATION

+#if VMA_DEDICATED_ALLOCATION || VMA_VULKAN_VERSION >= 1001000

         VMA_COPY_IF_NOT_NULL(vkGetBufferMemoryRequirements2KHR);

         VMA_COPY_IF_NOT_NULL(vkGetImageMemoryRequirements2KHR);

 #endif

-#if VMA_BIND_MEMORY2

+#if VMA_BIND_MEMORY2 || VMA_VULKAN_VERSION >= 1001000

         VMA_COPY_IF_NOT_NULL(vkBindBufferMemory2KHR);

         VMA_COPY_IF_NOT_NULL(vkBindImageMemory2KHR);

 #endif

@@ -14772,22 +14832,22 @@
     VMA_ASSERT(m_VulkanFunctions.vkCreateImage != VMA_NULL);

     VMA_ASSERT(m_VulkanFunctions.vkDestroyImage != VMA_NULL);

     VMA_ASSERT(m_VulkanFunctions.vkCmdCopyBuffer != VMA_NULL);

-#if VMA_DEDICATED_ALLOCATION

-    if(m_UseKhrDedicatedAllocation)

+#if VMA_DEDICATED_ALLOCATION || VMA_VULKAN_VERSION >= 1001000

+    if(m_VulkanApiVersion >= VK_MAKE_VERSION(1, 1, 0) || m_UseKhrDedicatedAllocation)

     {

         VMA_ASSERT(m_VulkanFunctions.vkGetBufferMemoryRequirements2KHR != VMA_NULL);

         VMA_ASSERT(m_VulkanFunctions.vkGetImageMemoryRequirements2KHR != VMA_NULL);

     }

 #endif

-#if VMA_BIND_MEMORY2

-    if(m_UseKhrBindMemory2)

+#if VMA_BIND_MEMORY2 || VMA_VULKAN_VERSION >= 1001000

+    if(m_VulkanApiVersion >= VK_MAKE_VERSION(1, 1, 0) || m_UseKhrBindMemory2)

     {

         VMA_ASSERT(m_VulkanFunctions.vkBindBufferMemory2KHR != VMA_NULL);

         VMA_ASSERT(m_VulkanFunctions.vkBindImageMemory2KHR != VMA_NULL);

     }

 #endif

-#if VMA_MEMORY_BUDGET

-    if(m_UseExtMemoryBudget)

+#if VMA_MEMORY_BUDGET || VMA_VULKAN_VERSION >= 1001000

+    if(m_UseExtMemoryBudget || m_VulkanApiVersion >= VK_MAKE_VERSION(1, 1, 0))

     {

         VMA_ASSERT(m_VulkanFunctions.vkGetPhysicalDeviceMemoryProperties2KHR != VMA_NULL);

     }

@@ -14950,9 +15010,9 @@
     allocInfo.memoryTypeIndex = memTypeIndex;

     allocInfo.allocationSize = size;

 

-#if VMA_DEDICATED_ALLOCATION

+#if VMA_DEDICATED_ALLOCATION || VMA_VULKAN_VERSION >= 1001000

     VkMemoryDedicatedAllocateInfoKHR dedicatedAllocInfo = { VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO_KHR };

-    if(m_UseKhrDedicatedAllocation)

+    if(m_UseKhrDedicatedAllocation || m_VulkanApiVersion >= VK_MAKE_VERSION(1, 1, 0))

     {

         if(dedicatedBuffer != VK_NULL_HANDLE)

         {

@@ -14966,7 +15026,7 @@
             allocInfo.pNext = &dedicatedAllocInfo;

         }

     }

-#endif // #if VMA_DEDICATED_ALLOCATION

+#endif // #if VMA_DEDICATED_ALLOCATION || VMA_VULKAN_VERSION >= 1001000

 

     size_t allocIndex;

     VkResult res = VK_SUCCESS;

@@ -15088,8 +15148,8 @@
     bool& requiresDedicatedAllocation,

     bool& prefersDedicatedAllocation) const

 {

-#if VMA_DEDICATED_ALLOCATION

-    if(m_UseKhrDedicatedAllocation)

+#if VMA_DEDICATED_ALLOCATION || VMA_VULKAN_VERSION >= 1001000

+    if(m_UseKhrDedicatedAllocation || m_VulkanApiVersion >= VK_MAKE_VERSION(1, 1, 0))

     {

         VkBufferMemoryRequirementsInfo2KHR memReqInfo = { VK_STRUCTURE_TYPE_BUFFER_MEMORY_REQUIREMENTS_INFO_2_KHR };

         memReqInfo.buffer = hBuffer;

@@ -15106,7 +15166,7 @@
         prefersDedicatedAllocation  = (memDedicatedReq.prefersDedicatedAllocation  != VK_FALSE);

     }

     else

-#endif // #if VMA_DEDICATED_ALLOCATION

+#endif // #if VMA_DEDICATED_ALLOCATION || VMA_VULKAN_VERSION >= 1001000

     {

         (*m_VulkanFunctions.vkGetBufferMemoryRequirements)(m_hDevice, hBuffer, &memReq);

         requiresDedicatedAllocation = false;

@@ -15120,8 +15180,8 @@
     bool& requiresDedicatedAllocation,

     bool& prefersDedicatedAllocation) const

 {

-#if VMA_DEDICATED_ALLOCATION

-    if(m_UseKhrDedicatedAllocation)

+#if VMA_DEDICATED_ALLOCATION || VMA_VULKAN_VERSION >= 1001000

+    if(m_UseKhrDedicatedAllocation || m_VulkanApiVersion >= VK_MAKE_VERSION(1, 1, 0))

     {

         VkImageMemoryRequirementsInfo2KHR memReqInfo = { VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2_KHR };

         memReqInfo.image = hImage;

@@ -15138,7 +15198,7 @@
         prefersDedicatedAllocation  = (memDedicatedReq.prefersDedicatedAllocation  != VK_FALSE);

     }

     else

-#endif // #if VMA_DEDICATED_ALLOCATION

+#endif // #if VMA_DEDICATED_ALLOCATION || VMA_VULKAN_VERSION >= 1001000

     {

         (*m_VulkanFunctions.vkGetImageMemoryRequirements)(m_hDevice, hImage, &memReq);

         requiresDedicatedAllocation = false;

@@ -15842,8 +15902,9 @@
 {

     if(pNext != VMA_NULL)

     {

-#if VMA_BIND_MEMORY2

-        if(m_UseKhrBindMemory2 && m_VulkanFunctions.vkBindBufferMemory2KHR != VMA_NULL)

+#if VMA_VULKAN_VERSION >= 1001000 || VMA_BIND_MEMORY2

+        if((m_UseKhrBindMemory2 || m_VulkanApiVersion >= VK_MAKE_VERSION(1, 1, 0)) &&

+            m_VulkanFunctions.vkBindBufferMemory2KHR != VMA_NULL)

         {

             VkBindBufferMemoryInfoKHR bindBufferMemoryInfo = { VK_STRUCTURE_TYPE_BIND_BUFFER_MEMORY_INFO_KHR };

             bindBufferMemoryInfo.pNext = pNext;

@@ -15853,7 +15914,7 @@
             return (*m_VulkanFunctions.vkBindBufferMemory2KHR)(m_hDevice, 1, &bindBufferMemoryInfo);

         }

         else

-#endif // #if VMA_BIND_MEMORY2

+#endif // #if VMA_VULKAN_VERSION >= 1001000 || VMA_BIND_MEMORY2

         {

             return VK_ERROR_EXTENSION_NOT_PRESENT;

         }

@@ -15872,8 +15933,9 @@
 {

     if(pNext != VMA_NULL)

     {

-#if VMA_BIND_MEMORY2

-        if(m_UseKhrBindMemory2 && m_VulkanFunctions.vkBindImageMemory2KHR != VMA_NULL)

+#if VMA_VULKAN_VERSION >= 1001000 || VMA_BIND_MEMORY2

+        if((m_UseKhrBindMemory2 || m_VulkanApiVersion >= VK_MAKE_VERSION(1, 1, 0)) &&

+            m_VulkanFunctions.vkBindImageMemory2KHR != VMA_NULL)

         {

             VkBindImageMemoryInfoKHR bindBufferMemoryInfo = { VK_STRUCTURE_TYPE_BIND_IMAGE_MEMORY_INFO_KHR };

             bindBufferMemoryInfo.pNext = pNext;

@@ -16281,6 +16343,8 @@
     VmaAllocator* pAllocator)

 {

     VMA_ASSERT(pCreateInfo && pAllocator);

+    VMA_ASSERT(pCreateInfo->vulkanApiVersion == 0 ||

+        (VK_VERSION_MAJOR(pCreateInfo->vulkanApiVersion) == 1 && VK_VERSION_MINOR(pCreateInfo->vulkanApiVersion) <= 1));

     VMA_DEBUG_LOG("vmaCreateAllocator");

     *pAllocator = vma_new(pCreateInfo->pAllocationCallbacks, VmaAllocator_T)(pCreateInfo);

     return (*pAllocator)->Init(pCreateInfo);