Changes in TestWin32HandlesExport

Based on a patch proposed in https://github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator/pull/503 - thanks @Agrael1
diff --git a/src/Tests.cpp b/src/Tests.cpp
index 71883a9..90d9a43 100644
--- a/src/Tests.cpp
+++ b/src/Tests.cpp
@@ -8529,7 +8529,7 @@
         if((externalBufferProperties.externalMemoryProperties.externalMemoryFeatures &
             VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT) == 0)
         {
-            wprintf(L"WARNING: External memory not exportable, skipping test.\n");
+            wprintf(L"    WARNING: External memory not exportable, skipping test.\n");
             return;
         }
         requiresDedicated = (externalBufferProperties.externalMemoryProperties.externalMemoryFeatures &
@@ -8589,180 +8589,6 @@
 
     constexpr VkExternalMemoryHandleTypeFlagBits handleType =
         VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT;
-    constexpr uint32_t dataValue = 0x72158510;
-
-    PFN_vkGetPhysicalDeviceExternalBufferProperties pfnGetPhysicalDeviceExternalBufferProperties =
-        (PFN_vkGetPhysicalDeviceExternalBufferProperties)
-        vkGetInstanceProcAddr(g_hVulkanInstance, "vkGetPhysicalDeviceExternalBufferProperties");
-    TEST(pfnGetPhysicalDeviceExternalBufferProperties != nullptr);
-
-    for(size_t testIndex = 0; testIndex < 4; ++testIndex)
-    {
-        const bool testImport = (testIndex & 1) != 0;
-        const bool testCreateBuffer = (testIndex & 2) != 0;
-
-        VkBufferCreateInfo bufCreateInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };
-        bufCreateInfo.size = 0x10000; // 64 KB
-        bufCreateInfo.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;
-
-        HANDLE sharedHandle = NULL;
-        if(testImport)
-        {
-            VkPhysicalDeviceExternalBufferInfo externalBufInfo = {
-                VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_BUFFER_INFO };
-            externalBufInfo.flags = bufCreateInfo.flags;
-            externalBufInfo.usage = bufCreateInfo.usage;
-            externalBufInfo.handleType = handleType;
-            
-            VkExternalBufferProperties externalBufProps = {
-                VK_STRUCTURE_TYPE_EXTERNAL_BUFFER_PROPERTIES };
-            
-            pfnGetPhysicalDeviceExternalBufferProperties(g_hPhysicalDevice, 
-                &externalBufInfo, &externalBufProps);
-            
-            if((externalBufProps.externalMemoryProperties.externalMemoryFeatures &
-                VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT) == 0)
-            {
-                wprintf(L"    WARNING: External memory not importable, skipping test.\n");
-                continue;
-            }
-
-            const wchar_t* mappingName = L"MySharedVulkanMemory";
-            sharedHandle = CreateFileMapping(
-                INVALID_HANDLE_VALUE, // hFile - only in memory, no file.
-                NULL, // lpFileMappingAttributes
-                PAGE_READWRITE,
-                0, // dwMaximumSizeHigh
-                (DWORD)bufCreateInfo.size, // dwMaximumSizeLow
-                mappingName);
-            TEST(sharedHandle != NULL);
-
-            // Map the memory temporarily and write the dataValue to it.
-            void* sharedMemoryPtr = MapViewOfFile(
-                sharedHandle,
-                FILE_MAP_ALL_ACCESS,
-                0, // dwFileOffsetHigh
-                0, // dwFileOffsetLow
-                bufCreateInfo.size);
-            TEST(sharedMemoryPtr != NULL);
-            memcpy(sharedMemoryPtr, &dataValue, sizeof(dataValue));
-            UnmapViewOfFile(sharedMemoryPtr);
-        }
-
-        VkImportMemoryWin32HandleInfoKHR importInfo = {
-            VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR };
-        VkExternalMemoryBufferCreateInfoKHR externalMemBufCreateInfo = {
-            VK_STRUCTURE_TYPE_EXTERNAL_MEMORY_BUFFER_CREATE_INFO_KHR };
-        void* memoryAllocateNext = nullptr;
-
-        if(testImport)
-        {
-            externalMemBufCreateInfo.handleTypes = handleType;
-            bufCreateInfo.pNext = &externalMemBufCreateInfo;
-
-            importInfo.handleType = handleType;
-            importInfo.handle = sharedHandle;
-            memoryAllocateNext = &importInfo;
-        }
-
-        VmaAllocationCreateInfo allocCreateInfo = {};
-        // We would like read the data. We cannot use VMA_ALLOCATION_CREATE_HOST_ACCESS_RANDOM_BIT
-        // as we don't use VMA_MEMORY_USAGE_AUTO.
-        allocCreateInfo.preferredFlags = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT |
-            VK_MEMORY_PROPERTY_HOST_CACHED_BIT;
-
-        VkBuffer buf = VK_NULL_HANDLE;
-        VmaAllocation alloc = VK_NULL_HANDLE;
-
-        if (testCreateBuffer)
-        {
-            VkResult res = vmaCreateDedicatedBuffer(g_hAllocator, &bufCreateInfo, &allocCreateInfo,
-                memoryAllocateNext, &buf, &alloc, nullptr);
-            if (res != VK_SUCCESS)
-            {
-                TEST(alloc == VK_NULL_HANDLE && buf == VK_NULL_HANDLE);
-                if (res == VK_ERROR_FEATURE_NOT_PRESENT)
-                {
-                    wprintf(L"    WARNING: Couldn't create dedicated buffer - returned VK_ERROR_FEATURE_NOT_PRESENT. Likely no eligible memory type found.\n");
-                }
-                else if (res == VK_ERROR_OUT_OF_DEVICE_MEMORY)
-                {
-                    wprintf(L"    WARNING: Couldn't create dedicated buffer - returned VK_ERROR_OUT_OF_DEVICE_MEMORY.\n");
-                }
-                else
-                {
-                    wprintf(L"    WARNING: Couldn't create dedicated buffer - returned other error %u.\n", res);
-                }
-            }
-        }
-        else
-        {
-            TEST(vkCreateBuffer(g_hDevice, &bufCreateInfo, g_Allocs, &buf) == VK_SUCCESS);
-
-            VkMemoryRequirements memReq = {};
-            vkGetBufferMemoryRequirements(g_hDevice, buf, &memReq);
-
-            VkResult res = vmaAllocateDedicatedMemory(g_hAllocator, &memReq,
-                &allocCreateInfo, memoryAllocateNext, &alloc, nullptr);
-            if(res != VK_SUCCESS)
-            {
-                TEST(alloc == VK_NULL_HANDLE);
-                if (res == VK_ERROR_FEATURE_NOT_PRESENT)
-                {
-                    wprintf(L"    WARNING: Couldn't allocate dedicated memory - returned VK_ERROR_FEATURE_NOT_PRESENT. Likely no eligible memory type found.\n");
-                }
-                else if(res == VK_ERROR_OUT_OF_DEVICE_MEMORY)
-                {
-                    wprintf(L"    WARNING: Couldn't allocate dedicated memory - returned VK_ERROR_OUT_OF_DEVICE_MEMORY.\n");
-                }
-                else
-                {
-                    wprintf(L"    WARNING: Couldn't allocate dedicated memory - returned other error %u.\n", res);
-                }
-            }
-
-            if(alloc)
-            {
-                TEST(vmaBindBufferMemory(g_hAllocator, alloc, buf) == VK_SUCCESS);
-            }
-        }
-
-        if(alloc)
-        {
-            VmaAllocationInfo2 allocInfo2 = {};
-            vmaGetAllocationInfo2(g_hAllocator, alloc, &allocInfo2);
-            TEST(allocInfo2.dedicatedMemory);
-
-            VkMemoryPropertyFlags memPropsFlags = 0;
-            vmaGetAllocationMemoryProperties(g_hAllocator, alloc, &memPropsFlags);
-            const bool memoryMappable = (memPropsFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) != 0;
-
-            if(testImport)
-            {
-                if(memoryMappable)
-                {
-                    uint32_t readValue = 0;
-                    TEST(vmaCopyAllocationToMemory(g_hAllocator, alloc, 0, &readValue, sizeof readValue) == VK_SUCCESS);
-                    TEST(readValue == dataValue);
-                }
-                else
-                {
-                    wprintf(L"    WARNING: Allocation ended up in a non-HOST_VISIBLE memory.\n");
-                }
-            }
-        }
-
-        vmaDestroyBuffer(g_hAllocator, buf, alloc);
-
-        if(testImport)
-        {
-            CloseHandle(sharedHandle);
-        }
-    }
-
-#if 0
-    constexpr VkExternalMemoryHandleTypeFlagBits handleType =
-        VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT;
 
     constexpr static VkExportMemoryAllocateInfoKHR exportMemAllocInfo{
         VK_STRUCTURE_TYPE_EXPORT_MEMORY_ALLOCATE_INFO_KHR,
@@ -8794,10 +8620,12 @@
 
         vkGetPhysicalDeviceExternalBufferProperties(g_hPhysicalDevice,
             &externalBufferInfo, &externalBufferProperties);
+        constexpr VkExternalMemoryFeatureFlags expectedFlags =
+            VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT | VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT;
         if((externalBufferProperties.externalMemoryProperties.externalMemoryFeatures &
-            VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT) == 0)
+            expectedFlags) != expectedFlags)
         {
-            wprintf(L"WARNING: External memory not exportable, skipping test.\n");
+            wprintf(L"    WARNING: External memory not exportable and importable, skipping test.\n");
             return;
         }
         requiresDedicated = (externalBufferProperties.externalMemoryProperties.externalMemoryFeatures &
@@ -8831,21 +8659,38 @@
         VmaAllocation alloc = VK_NULL_HANDLE;
         TEST(vmaCreateBuffer(g_hAllocator, &bufCreateInfo, &allocCreateInfo, &buf, &alloc, nullptr) == VK_SUCCESS);
         HANDLE handle = NULL;
-        HANDLE handle2 = NULL;
         TEST(vmaGetMemoryWin32Handle(g_hAllocator, alloc, nullptr, &handle) == VK_SUCCESS);
         TEST(handle != nullptr);
-        TEST(vmaGetMemoryWin32Handle(g_hAllocator, alloc, nullptr, &handle2) == VK_SUCCESS);
-        TEST(handle2 != nullptr);
-        TEST(handle2 != handle);
 
+        // Import it into another allocation.
+        VkImportMemoryWin32HandleInfoKHR importMemHandleInfo = {
+            VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR };
+        importMemHandleInfo.handleType = handleType;
+        importMemHandleInfo.handle = handle;
+        importMemHandleInfo.name = nullptr;
+        VmaAllocationCreateInfo importAllocCreateInfo = {};
+        importAllocCreateInfo.usage = VMA_MEMORY_USAGE_AUTO;
+
+        VkBuffer importedBuf = VK_NULL_HANDLE;
+        VmaAllocation importedAlloc = VK_NULL_HANDLE;
+        TEST(vmaCreateDedicatedBuffer(g_hAllocator, &bufCreateInfo, &importAllocCreateInfo,
+            &importMemHandleInfo, &importedBuf, &importedAlloc, nullptr) == VK_SUCCESS);
+        TEST(importedBuf != VK_NULL_HANDLE);
+        TEST(importedAlloc != VK_NULL_HANDLE);
+
+        VmaAllocationInfo2 allocInfo2 = {};
+        vmaGetAllocationInfo2(g_hAllocator, importedAlloc, &allocInfo2);
+        if (test == 1)
+        {
+            TEST(allocInfo2.dedicatedMemory != VK_FALSE);
+        }
+
+        vmaDestroyBuffer(g_hAllocator, importedBuf, importedAlloc);
         vmaDestroyBuffer(g_hAllocator, buf, alloc);
         TEST(CloseHandle(handle));
-        TEST(CloseHandle(handle2));
     }
 
     vmaDestroyPool(g_hAllocator, pool);
-#endif // #if 0
-
 #endif
 }
 
@@ -8895,7 +8740,7 @@
     TestDeviceLocalMapped();
     TestMaintenance5();
     TestWin32HandlesExport();
-    //TestWin32HandlesImport(); // Commented out because failing on some GPUs with strange errors.
+    TestWin32HandlesImport();
     TestMappingMultithreaded();
     TestLinearAllocator();
     ManuallyTestLinearAllocator();