Sample app: Added printing information about available memory heaps nad types
diff --git a/src/Common.cpp b/src/Common.cpp
index b4572fe..20c0050 100644
--- a/src/Common.cpp
+++ b/src/Common.cpp
@@ -177,4 +177,92 @@
         assert(0);

 }

 

+std::wstring SizeToStr(size_t size)

+{

+    if(size == 0)

+        return L"0";

+    wchar_t result[32];

+    double size2 = (double)size;

+    if (size2 >= 1024.0*1024.0*1024.0*1024.0)

+    {

+        swprintf_s(result, L"%.2f TB", size2 / (1024.0*1024.0*1024.0*1024.0));

+    }

+    else if (size2 >= 1024.0*1024.0*1024.0)

+    {

+        swprintf_s(result, L"%.2f GB", size2 / (1024.0*1024.0*1024.0));

+    }

+    else if (size2 >= 1024.0*1024.0)

+    {

+        swprintf_s(result, L"%.2f MB", size2 / (1024.0*1024.0));

+    }

+    else if (size2 >= 1024.0)

+    {

+        swprintf_s(result, L"%.2f KB", size2 / 1024.0);

+    }

+    else

+        swprintf_s(result, L"%llu B", size);

+    return result;

+}

+

+const wchar_t* PhysicalDeviceTypeToStr(VkPhysicalDeviceType type)

+{

+    // Skipping common prefix VK_PHYSICAL_DEVICE_TYPE_

+    static const wchar_t* const VALUES[] = {

+        L"OTHER",

+        L"INTEGRATED_GPU",

+        L"DISCRETE_GPU",

+        L"VIRTUAL_GPU",

+        L"CPU",

+    };

+    return (uint32_t)type < _countof(VALUES) ? VALUES[(uint32_t)type] : L"";

+}

+

+const wchar_t* VendorIDToStr(uint32_t vendorID)

+{

+    switch(vendorID)

+    {

+    // Skipping common prefix VK_VENDOR_ID_ for these:

+    case 0x10001: return L"VIV";

+    case 0x10002: return L"VSI";

+    case 0x10003: return L"KAZAN";

+    case 0x10004: return L"CODEPLAY";

+    case 0x10005: return L"MESA";

+    case 0x10006: return L"POCL";

+    // Others...

+    case VENDOR_ID_AMD: return L"AMD";

+    case VENDOR_ID_NVIDIA: return L"NVIDIA";

+    case VENDOR_ID_INTEL: return L"Intel";

+    case 0x1010: return L"ImgTec";

+    case 0x13B5: return L"ARM";

+    case 0x5143: return L"Qualcomm";

+    }

+    return L"";

+}

+

+#if VMA_VULKAN_VERSION >= 1002000

+const wchar_t* DriverIDToStr(VkDriverId driverID)

+{

+    // Skipping common prefix VK_DRIVER_ID_

+    static const wchar_t* const VALUES[] = {

+        L"",

+        L"AMD_PROPRIETARY",

+        L"AMD_OPEN_SOURCE",

+        L"MESA_RADV",

+        L"NVIDIA_PROPRIETARY",

+        L"INTEL_PROPRIETARY_WINDOWS",

+        L"INTEL_OPEN_SOURCE_MESA",

+        L"IMAGINATION_PROPRIETARY",

+        L"QUALCOMM_PROPRIETARY",

+        L"ARM_PROPRIETARY",

+        L"GOOGLE_SWIFTSHADER",

+        L"GGP_PROPRIETARY",

+        L"BROADCOM_PROPRIETARY",

+        L"MESA_LLVMPIPE",

+        L"MOLTENVK",

+    };

+    return (uint32_t)driverID < _countof(VALUES) ? VALUES[(uint32_t)driverID] : L"";

+}

+#endif // #if VMA_VULKAN_VERSION >= 1002000

+

+

 #endif // #ifdef _WIN32

diff --git a/src/Common.h b/src/Common.h
index bbcce33..bdcd225 100644
--- a/src/Common.h
+++ b/src/Common.h
@@ -64,6 +64,10 @@
 

 #define ERR_GUARD_VULKAN(expr) TEST((expr) >= 0)

 

+static const uint32_t VENDOR_ID_AMD = 0x1002;

+static const uint32_t VENDOR_ID_NVIDIA = 0x10DE;

+static const uint32_t VENDOR_ID_INTEL = 0x8086;

+

 extern VkInstance g_hVulkanInstance;

 extern VkPhysicalDevice g_hPhysicalDevice;

 extern VkDevice g_hDevice;

@@ -322,6 +326,15 @@
 

 void SaveFile(const wchar_t* filePath, const void* data, size_t dataSize);

 

+std::wstring SizeToStr(size_t size);

+

+const wchar_t* PhysicalDeviceTypeToStr(VkPhysicalDeviceType type);

+const wchar_t* VendorIDToStr(uint32_t vendorID);

+

+#if VMA_VULKAN_VERSION >= 1002000

+const wchar_t* DriverIDToStr(VkDriverId driverID);

+#endif

+

 #endif // #ifdef _WIN32

 

 #endif

diff --git a/src/VulkanSample.cpp b/src/VulkanSample.cpp
index 3cfe0ed..5884b41 100644
--- a/src/VulkanSample.cpp
+++ b/src/VulkanSample.cpp
@@ -1112,6 +1112,7 @@
 

 static void PrintEnabledFeatures()

 {

+    wprintf(L"Enabled extensions and features:\n");

     wprintf(L"Validation layer: %d\n", g_EnableValidationLayer ? 1 : 0);

     wprintf(L"Sparse binding: %d\n", g_SparseBindingEnabled ? 1 : 0);

     wprintf(L"Buffer device address: %d\n", g_BufferDeviceAddressEnabled ? 1 : 0);

@@ -1191,12 +1192,313 @@
 

 static void PrintPhysicalDeviceProperties(const VkPhysicalDeviceProperties& properties)

 {

-    wprintf(L"Physical device:\n");

-    wprintf(L"    Driver version: 0x%X\n", properties.driverVersion);

-    wprintf(L"    Vendor ID: 0x%X\n", properties.vendorID);

-    wprintf(L"    Device ID: 0x%X\n", properties.deviceID);

-    wprintf(L"    Device type: %u\n", properties.deviceType);

-    wprintf(L"    Device name: %hs\n", properties.deviceName);

+    wprintf(L"physicalDeviceProperties:\n");

+    wprintf(L"    driverVersion: 0x%X\n", properties.driverVersion);

+    wprintf(L"    vendorID: 0x%X (%s)\n", properties.vendorID, VendorIDToStr(properties.vendorID));

+    wprintf(L"    deviceID: 0x%X\n", properties.deviceID);

+    wprintf(L"    deviceType: %u (%s)\n", properties.deviceType, PhysicalDeviceTypeToStr(properties.deviceType));

+    wprintf(L"    deviceName: %hs\n", properties.deviceName);

+    wprintf(L"    limits:\n");

+    wprintf(L"        maxMemoryAllocationCount: %u\n", properties.limits.maxMemoryAllocationCount);

+    wprintf(L"        bufferImageGranularity: %llu B\n", properties.limits.bufferImageGranularity);

+    wprintf(L"        nonCoherentAtomSize: %llu B\n", properties.limits.nonCoherentAtomSize);

+}

+

+#if VMA_VULKAN_VERSION >= 1002000

+static void PrintPhysicalDeviceVulkan11Properties(const VkPhysicalDeviceVulkan11Properties& properties)

+{

+    wprintf(L"physicalDeviceVulkan11Properties:\n");

+    std::wstring sizeStr = SizeToStr(properties.maxMemoryAllocationSize);

+    wprintf(L"    maxMemoryAllocationSize: %llu B (%s)\n", properties.maxMemoryAllocationSize, sizeStr.c_str());

+}

+static void PrintPhysicalDeviceVulkan12Properties(const VkPhysicalDeviceVulkan12Properties& properties)

+{

+    wprintf(L"physicalDeviceVulkan12Properties:\n");

+    std::wstring str = DriverIDToStr(properties.driverID);

+    wprintf(L"    driverID: %u (%s)\n", properties.driverID, str.c_str());

+    wprintf(L"    driverName: %hs\n", properties.driverName);

+    wprintf(L"    driverInfo: %hs\n", properties.driverInfo);

+}

+#endif // #if VMA_VULKAN_VERSION > 1002000

+

+static void AddFlagToStr(std::wstring& inout, const wchar_t* flagStr)

+{

+    if(!inout.empty())

+        inout += L", ";

+    inout += flagStr;

+}

+

+static std::wstring HeapFlagsToStr(VkMemoryHeapFlags flags)

+{

+    std::wstring result;

+    if(flags & VK_MEMORY_HEAP_DEVICE_LOCAL_BIT)

+        AddFlagToStr(result, L"DEVICE_LOCAL");

+    if(flags & VK_MEMORY_HEAP_MULTI_INSTANCE_BIT)

+        AddFlagToStr(result, L"MULTI_INSTANCE");

+    return result;

+}

+

+static std::wstring PropertyFlagsToStr(VkMemoryPropertyFlags flags)

+{

+    std::wstring result;

+    if(flags & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT)

+        AddFlagToStr(result, L"DEVICE_LOCAL");

+    if(flags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT)

+        AddFlagToStr(result, L"HOST_VISIBLE");

+    if(flags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT)

+        AddFlagToStr(result, L"HOST_COHERENT");

+    if(flags & VK_MEMORY_PROPERTY_HOST_CACHED_BIT)

+        AddFlagToStr(result, L"HOST_CACHED");

+    if(flags & VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT)

+        AddFlagToStr(result, L"LAZILY_ALLOCATED");

+

+#if VMA_VULKAN_VERSION >= 1001000

+    if(flags & VK_MEMORY_PROPERTY_PROTECTED_BIT)

+        AddFlagToStr(result, L"PROTECTED");

+#endif

+

+#if VK_AMD_device_coherent_memory

+    if(flags & VK_MEMORY_PROPERTY_DEVICE_COHERENT_BIT_AMD)

+        AddFlagToStr(result, L"DEVICE_COHERENT (AMD)");

+    if(flags & VK_MEMORY_PROPERTY_DEVICE_UNCACHED_BIT_AMD)

+        AddFlagToStr(result, L"DEVICE_UNCACHED (AMD)");

+#endif

+

+    return result;

+}

+

+static void PrintMemoryTypes()

+{

+    wprintf(L"MEMORY HEAPS:\n");

+    const VkPhysicalDeviceMemoryProperties* memProps = nullptr;

+    vmaGetMemoryProperties(g_hAllocator, &memProps);

+

+    wprintf(L"heapCount=%u, typeCount=%u\n", memProps->memoryHeapCount, memProps->memoryTypeCount);

+

+    std::wstring sizeStr, flagsStr;

+    for(uint32_t heapIndex = 0; heapIndex < memProps->memoryHeapCount; ++heapIndex)

+    {

+        const VkMemoryHeap& heap = memProps->memoryHeaps[heapIndex];

+        sizeStr = SizeToStr(heap.size);

+        flagsStr = HeapFlagsToStr(heap.flags);

+        wprintf(L"Heap %u: %llu B (%s) %s\n", heapIndex, heap.size, sizeStr.c_str(), flagsStr.c_str());

+        

+        for(uint32_t typeIndex = 0; typeIndex < memProps->memoryTypeCount; ++typeIndex)

+        {

+            const VkMemoryType& type = memProps->memoryTypes[typeIndex];

+            if(type.heapIndex == heapIndex)

+            {

+                flagsStr = PropertyFlagsToStr(type.propertyFlags);

+                wprintf(L"    Type %u: %s\n", typeIndex, flagsStr.c_str());

+            }

+        }

+    }

+}

+

+#if 0

+template<typename It, typename MapFunc>

+inline VkDeviceSize MapSum(It beg, It end, MapFunc mapFunc)

+{

+    VkDeviceSize result = 0;

+    for(It it = beg; it != end; ++it)

+        result += mapFunc(*it);

+    return result;

+}

+#endif

+

+static bool CanCreateVertexBuffer(uint32_t allowedMemoryTypeBits)

+{

+    VkBufferCreateInfo bufCreateInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO };

+    bufCreateInfo.size = 0x10000;

+    bufCreateInfo.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;

+

+    VkBuffer buf = VK_NULL_HANDLE;

+    VkResult res = vkCreateBuffer(g_hDevice, &bufCreateInfo, g_Allocs, &buf);

+    assert(res == VK_SUCCESS);

+

+    VkMemoryRequirements memReq = {};

+    vkGetBufferMemoryRequirements(g_hDevice, buf, &memReq);

+

+    vkDestroyBuffer(g_hDevice, buf, g_Allocs);

+

+    return (memReq.memoryTypeBits & allowedMemoryTypeBits) != 0;

+}

+

+static bool CanCreateOptimalSampledImage(uint32_t allowedMemoryTypeBits)

+{

+    VkImageCreateInfo imgCreateInfo = { VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO };

+    imgCreateInfo.imageType = VK_IMAGE_TYPE_2D;

+    imgCreateInfo.extent.width = 256;

+    imgCreateInfo.extent.height = 256;

+    imgCreateInfo.extent.depth = 1;

+    imgCreateInfo.mipLevels = 1;

+    imgCreateInfo.arrayLayers = 1;

+    imgCreateInfo.format = VK_FORMAT_R8G8B8A8_UNORM;

+    imgCreateInfo.tiling = VK_IMAGE_TILING_OPTIMAL;

+    imgCreateInfo.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;

+    imgCreateInfo.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;

+    imgCreateInfo.samples = VK_SAMPLE_COUNT_1_BIT;

+

+    VkImage img = VK_NULL_HANDLE;

+    VkResult res = vkCreateImage(g_hDevice, &imgCreateInfo, g_Allocs, &img);

+    assert(res == VK_SUCCESS);

+

+    VkMemoryRequirements memReq = {};

+    vkGetImageMemoryRequirements(g_hDevice, img, &memReq);

+

+    vkDestroyImage(g_hDevice, img, g_Allocs);

+

+    return (memReq.memoryTypeBits & allowedMemoryTypeBits) != 0;

+}

+

+static void PrintMemoryConclusions()

+{

+    wprintf(L"Conclusions:\n");

+

+    const VkPhysicalDeviceProperties* props = nullptr;

+    const VkPhysicalDeviceMemoryProperties* memProps = nullptr;

+    vmaGetPhysicalDeviceProperties(g_hAllocator, &props);

+    vmaGetMemoryProperties(g_hAllocator, &memProps);

+

+    const uint32_t heapCount = memProps->memoryHeapCount;

+

+    uint32_t deviceLocalHeapCount = 0;

+    uint32_t hostVisibleHeapCount = 0;

+    uint32_t deviceLocalAndHostVisibleHeapCount = 0;

+    VkDeviceSize deviceLocalHeapSumSize = 0;

+    VkDeviceSize hostVisibleHeapSumSize = 0;

+    VkDeviceSize deviceLocalAndHostVisibleHeapSumSize = 0;

+

+    for(uint32_t heapIndex = 0; heapIndex < heapCount; ++heapIndex)

+    {

+        const VkMemoryHeap& heap = memProps->memoryHeaps[heapIndex];

+        const bool isDeviceLocal = (heap.flags & VK_MEMORY_HEAP_DEVICE_LOCAL_BIT) != 0;

+        bool isHostVisible = false;

+        for(uint32_t typeIndex = 0; typeIndex < memProps->memoryTypeCount; ++typeIndex)

+        {

+            const VkMemoryType& type = memProps->memoryTypes[typeIndex];

+            if(type.heapIndex == heapIndex && (type.propertyFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT))

+            {

+                isHostVisible = true;

+                break;

+            }

+        }

+        if(isDeviceLocal)

+        {

+            ++deviceLocalHeapCount;

+            deviceLocalHeapSumSize += heap.size;

+        }

+        if(isHostVisible)

+        {

+            ++hostVisibleHeapCount;

+            hostVisibleHeapSumSize += heap.size;

+            if(isDeviceLocal)

+            {

+                ++deviceLocalAndHostVisibleHeapCount;

+                deviceLocalAndHostVisibleHeapSumSize += heap.size;

+            }

+        }

+    }

+

+    uint32_t hostVisibleNotHostCoherentTypeCount = 0;

+    uint32_t notDeviceLocalNotHostVisibleTypeCount = 0;

+    uint32_t amdSpecificTypeCount = 0;

+    uint32_t lazilyAllocatedTypeCount = 0;

+    uint32_t allTypeBits = 0;

+    uint32_t deviceLocalTypeBits = 0;

+    for(uint32_t typeIndex = 0; typeIndex < memProps->memoryTypeCount; ++typeIndex)

+    {

+        const VkMemoryType& type = memProps->memoryTypes[typeIndex];

+        allTypeBits |= 1u << typeIndex;

+        if(type.propertyFlags & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT)

+        {

+            deviceLocalTypeBits |= 1u << typeIndex;

+        }

+        if((type.propertyFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) &&

+            (type.propertyFlags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) == 0)

+        {

+            ++hostVisibleNotHostCoherentTypeCount;

+        }

+        if((type.propertyFlags & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) == 0 &&

+            (type.propertyFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) == 0)

+        {

+            ++notDeviceLocalNotHostVisibleTypeCount;

+        }

+        if(type.propertyFlags & (VK_MEMORY_PROPERTY_DEVICE_COHERENT_BIT_AMD | VK_MEMORY_PROPERTY_DEVICE_UNCACHED_BIT_AMD))

+        {

+            ++amdSpecificTypeCount;

+        }

+        if(type.propertyFlags & VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT)

+        {

+            ++lazilyAllocatedTypeCount;

+        }

+    }

+

+    assert(deviceLocalHeapCount > 0);

+    if(deviceLocalHeapCount == heapCount)

+        wprintf(L"- All heaps are DEVICE_LOCAL.\n");

+    else

+        wprintf(L"- %u heaps are DEVICE_LOCAL, total %s.\n", deviceLocalHeapCount, SizeToStr(deviceLocalHeapSumSize).c_str());

+

+    assert(hostVisibleHeapCount > 0);

+    if(hostVisibleHeapCount == heapCount)

+        wprintf(L"- All heaps are HOST_VISIBLE.\n");

+    else

+        wprintf(L"- %u heaps are HOST_VISIBLE, total %s.\n", deviceLocalHeapCount, SizeToStr(hostVisibleHeapSumSize).c_str());

+

+    if(deviceLocalHeapCount < heapCount && hostVisibleHeapCount < heapCount)

+    {

+        if(deviceLocalAndHostVisibleHeapCount == 0)

+            wprintf(L"- No heaps are DEVICE_LOCAL and HOST_VISIBLE.\n");

+        if(deviceLocalAndHostVisibleHeapCount == heapCount)

+            wprintf(L"- All heaps are DEVICE_LOCAL and HOST_VISIBLE.\n");

+        else

+            wprintf(L"- %u heaps are DEVICE_LOCAL and HOST_VISIBLE, total %s.\n", deviceLocalHeapCount, SizeToStr(deviceLocalAndHostVisibleHeapSumSize).c_str());

+    }

+

+    if(hostVisibleNotHostCoherentTypeCount == 0)

+        wprintf(L"- No types are HOST_VISIBLE but not HOST_COHERENT.\n");

+    else

+        wprintf(L"- %u types are HOST_VISIBLE but not HOST_COHERENT.\n", hostVisibleNotHostCoherentTypeCount);

+

+    if(notDeviceLocalNotHostVisibleTypeCount == 0)

+        wprintf(L"- No types are not DEVICE_LOCAL and not HOST_VISIBLE.\n");

+    else

+        wprintf(L"- %u types are not DEVICE_LOCAL and not HOST_VISIBLE.\n", notDeviceLocalNotHostVisibleTypeCount);

+

+    if(amdSpecificTypeCount == 0)

+        wprintf(L"- No types are AMD-specific DEVICE_COHERENT or DEVICE_UNCACHED.\n");

+    else

+        wprintf(L"- %u types are AMD-specific DEVICE_COHERENT or DEVICE_UNCACHED.\n", amdSpecificTypeCount);

+

+    if(lazilyAllocatedTypeCount == 0)

+        wprintf(L"- No types are LAZILY_ALLOCATED.\n");

+    else

+        wprintf(L"- %u types are LAZILY_ALLOCATED.\n", lazilyAllocatedTypeCount);

+

+    if(props->vendorID == VENDOR_ID_AMD &&

+        props->deviceType == VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU &&

+        deviceLocalAndHostVisibleHeapSumSize > 256llu * 1024 * 1024)

+    {

+        wprintf(L"- AMD Smart Access Memory (SAM) is enabled!\n");

+    }

+

+    if(deviceLocalHeapCount < heapCount)

+    {

+        const uint32_t nonDeviceLocalTypeBits = ~deviceLocalTypeBits & allTypeBits;

+        

+        if(CanCreateVertexBuffer(nonDeviceLocalTypeBits))

+            wprintf(L"- A buffer with VERTEX_BUFFER usage can be created in some non-DEVICE_LOCAL type.\n");

+        else

+            wprintf(L"- A buffer with VERTEX_BUFFER usage cannot be created in some non-DEVICE_LOCAL type.\n");

+

+        if(CanCreateOptimalSampledImage(nonDeviceLocalTypeBits))

+            wprintf(L"- An image with OPTIMAL tiling and SAMPLED usage can be created in some non-DEVICE_LOCAL type.\n");

+        else

+            wprintf(L"- An image with OPTIMAL tiling and SAMPLED usage cannot be created in some non-DEVICE_LOCAL type.\n");

+    }

+

+    //wprintf(L"\n");

 }

 

 static void InitializeApplication()

@@ -1272,7 +1574,7 @@
     instInfo.enabledLayerCount = static_cast<uint32_t>(instanceLayers.size());

     instInfo.ppEnabledLayerNames = instanceLayers.data();

 

-    wprintf(L"Vulkan API version: ");

+    wprintf(L"Vulkan API version used: ");

     switch(appInfo.apiVersion)

     {

     case VK_API_VERSION_1_0: wprintf(L"1.0\n"); break;

@@ -1370,11 +1672,34 @@
 

     // Query for features

 

+#if VMA_VULKAN_VERSION >= 1001000

+    VkPhysicalDeviceProperties2 physicalDeviceProperties2 = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2 };

+    

+#if VMA_VULKAN_VERSION >= 1002000

+    // Vulkan spec says structure VkPhysicalDeviceVulkan11Properties is "Provided by VK_VERSION_1_2" - is this a mistake? Assuming not...

+    VkPhysicalDeviceVulkan11Properties physicalDeviceVulkan11Properties = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES };

+    VkPhysicalDeviceVulkan12Properties physicalDeviceVulkan12Properties = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES };

+    PnextChainPushFront(&physicalDeviceProperties2, &physicalDeviceVulkan11Properties);

+    PnextChainPushFront(&physicalDeviceProperties2, &physicalDeviceVulkan12Properties);

+#endif

+

+    vkGetPhysicalDeviceProperties2(g_hPhysicalDevice, &physicalDeviceProperties2);

+

+    PrintPhysicalDeviceProperties(physicalDeviceProperties2.properties);

+#if VMA_VULKAN_VERSION >= 1002000

+    PrintPhysicalDeviceVulkan11Properties(physicalDeviceVulkan11Properties);

+    PrintPhysicalDeviceVulkan12Properties(physicalDeviceVulkan12Properties);

+#endif

+

+#else // #if VMA_VULKAN_VERSION >= 1001000

     VkPhysicalDeviceProperties physicalDeviceProperties = {};

     vkGetPhysicalDeviceProperties(g_hPhysicalDevice, &physicalDeviceProperties);

-

     PrintPhysicalDeviceProperties(physicalDeviceProperties);

 

+#endif // #if VMA_VULKAN_VERSION >= 1001000

+

+    wprintf(L"\n");

+

     VkPhysicalDeviceFeatures2 physicalDeviceFeatures = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2 };

     

     VkPhysicalDeviceCoherentMemoryFeaturesAMD physicalDeviceCoherentMemoryFeatures = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COHERENT_MEMORY_FEATURES_AMD };

@@ -1583,7 +1908,12 @@
     SetAllocatorCreateInfo(allocatorInfo);

     ERR_GUARD_VULKAN( vmaCreateAllocator(&allocatorInfo, &g_hAllocator) );

 

+    PrintMemoryTypes();

+    wprintf(L"\n");

+    PrintMemoryConclusions();

+    wprintf(L"\n");

     PrintEnabledFeatures();

+    wprintf(L"\n");

 

     // Retrieve queues (don't need to be destroyed).

 

@@ -1971,7 +2301,7 @@
         // This is intentionally assigned here because we are now inside CreateWindow, before it returns.

         g_hWnd = hWnd;

         InitializeApplication();

-        PrintAllocatorStats();

+        //PrintAllocatorStats();

         return 0;

 

     case WM_DESTROY: