VmaReplay: Extended by detailed statistics for parameters of structures like VmaAllocationCreateInfo, VkImageCreateInfo etc.
diff --git a/src/VmaReplay/Common.h b/src/VmaReplay/Common.h
index a78524b..d0548bf 100644
--- a/src/VmaReplay/Common.h
+++ b/src/VmaReplay/Common.h
@@ -35,6 +35,11 @@
{
return (x+y-1) / y;
}
+template <typename T>
+inline T round_div(T x, T y)
+{
+ return (x+y/(T)2) / y;
+}
template <typename T>
inline T align_up(T val, T align)
diff --git a/src/VmaReplay/Constants.cpp b/src/VmaReplay/Constants.cpp
new file mode 100644
index 0000000..44b4748
--- /dev/null
+++ b/src/VmaReplay/Constants.cpp
@@ -0,0 +1,766 @@
+#include "Common.h"
+#include "Constants.h"
+
+const int RESULT_EXCEPTION = -1000;
+const int RESULT_ERROR_COMMAND_LINE = -1;
+const int RESULT_ERROR_SOURCE_FILE = -2;
+const int RESULT_ERROR_FORMAT = -3;
+const int RESULT_ERROR_VULKAN = -4;
+
+const char* VMA_FUNCTION_NAMES[] = {
+ "vmaCreatePool",
+ "vmaDestroyPool",
+ "vmaSetAllocationUserData",
+ "vmaCreateBuffer",
+ "vmaDestroyBuffer",
+ "vmaCreateImage",
+ "vmaDestroyImage",
+ "vmaFreeMemory",
+ "vmaFreeMemoryPages",
+ "vmaCreateLostAllocation",
+ "vmaAllocateMemory",
+ "vmaAllocateMemoryPages",
+ "vmaAllocateMemoryForBuffer",
+ "vmaAllocateMemoryForImage",
+ "vmaMapMemory",
+ "vmaUnmapMemory",
+ "vmaFlushAllocation",
+ "vmaInvalidateAllocation",
+ "vmaTouchAllocation",
+ "vmaGetAllocationInfo",
+ "vmaMakePoolAllocationsLost",
+ "vmaResizeAllocation",
+ "vmaDefragmentationBegin",
+ "vmaDefragmentationEnd",
+};
+static_assert(
+ _countof(VMA_FUNCTION_NAMES) == (size_t)VMA_FUNCTION::Count,
+ "VMA_FUNCTION_NAMES array doesn't match VMA_FUNCTION enum.");
+
+const char* VMA_POOL_CREATE_FLAG_NAMES[] = {
+ "VMA_POOL_CREATE_IGNORE_BUFFER_IMAGE_GRANULARITY_BIT",
+ "VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT",
+ "VMA_POOL_CREATE_BUDDY_ALGORITHM_BIT",
+};
+const uint32_t VMA_POOL_CREATE_FLAG_VALUES[] = {
+ VMA_POOL_CREATE_IGNORE_BUFFER_IMAGE_GRANULARITY_BIT,
+ VMA_POOL_CREATE_LINEAR_ALGORITHM_BIT,
+ VMA_POOL_CREATE_BUDDY_ALGORITHM_BIT,
+};
+const size_t VMA_POOL_CREATE_FLAG_COUNT = _countof(VMA_POOL_CREATE_FLAG_NAMES);
+static_assert(
+ _countof(VMA_POOL_CREATE_FLAG_NAMES) == _countof(VMA_POOL_CREATE_FLAG_VALUES),
+ "VMA_POOL_CREATE_FLAG_NAMES array doesn't match VMA_POOL_CREATE_FLAG_VALUES.");
+
+const char* VK_BUFFER_CREATE_FLAG_NAMES[] = {
+ "VK_BUFFER_CREATE_SPARSE_BINDING_BIT",
+ "VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT",
+ "VK_BUFFER_CREATE_SPARSE_ALIASED_BIT",
+ "VK_BUFFER_CREATE_PROTECTED_BIT",
+};
+const uint32_t VK_BUFFER_CREATE_FLAG_VALUES[] = {
+ VK_BUFFER_CREATE_SPARSE_BINDING_BIT,
+ VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT,
+ VK_BUFFER_CREATE_SPARSE_ALIASED_BIT,
+ VK_BUFFER_CREATE_PROTECTED_BIT,
+};
+const size_t VK_BUFFER_CREATE_FLAG_COUNT = _countof(VK_BUFFER_CREATE_FLAG_NAMES);
+static_assert(
+ _countof(VK_BUFFER_CREATE_FLAG_NAMES) == _countof(VK_BUFFER_CREATE_FLAG_VALUES),
+ "VK_BUFFER_CREATE_FLAG_NAMES array doesn't match VK_BUFFER_CREATE_FLAG_VALUES.");
+
+const char* VK_BUFFER_USAGE_FLAG_NAMES[] = {
+ "VK_BUFFER_USAGE_TRANSFER_SRC_BIT",
+ "VK_BUFFER_USAGE_TRANSFER_DST_BIT",
+ "VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT",
+ "VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT",
+ "VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT",
+ "VK_BUFFER_USAGE_STORAGE_BUFFER_BIT",
+ "VK_BUFFER_USAGE_INDEX_BUFFER_BIT",
+ "VK_BUFFER_USAGE_VERTEX_BUFFER_BIT",
+ "VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT",
+ "VK_BUFFER_USAGE_CONDITIONAL_RENDERING_BIT_EXT",
+ "VK_BUFFER_USAGE_RAYTRACING_BIT_NVX",
+};
+const uint32_t VK_BUFFER_USAGE_FLAG_VALUES[] = {
+ VK_BUFFER_USAGE_TRANSFER_SRC_BIT,
+ VK_BUFFER_USAGE_TRANSFER_DST_BIT,
+ VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT,
+ VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT,
+ VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,
+ VK_BUFFER_USAGE_STORAGE_BUFFER_BIT,
+ VK_BUFFER_USAGE_INDEX_BUFFER_BIT,
+ VK_BUFFER_USAGE_VERTEX_BUFFER_BIT,
+ VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT,
+ VK_BUFFER_USAGE_CONDITIONAL_RENDERING_BIT_EXT,
+ VK_BUFFER_USAGE_RAYTRACING_BIT_NVX,
+};
+const size_t VK_BUFFER_USAGE_FLAG_COUNT = _countof(VK_BUFFER_USAGE_FLAG_NAMES);
+static_assert(
+ _countof(VK_BUFFER_USAGE_FLAG_NAMES) == _countof(VK_BUFFER_USAGE_FLAG_VALUES),
+ "VK_BUFFER_USAGE_FLAG_NAMES array doesn't match VK_BUFFER_USAGE_FLAG_VALUES.");
+
+const char* VK_SHARING_MODE_NAMES[] = {
+ "VK_SHARING_MODE_EXCLUSIVE",
+ "VK_SHARING_MODE_CONCURRENT",
+};
+const size_t VK_SHARING_MODE_COUNT = _countof(VK_SHARING_MODE_NAMES);
+
+const char* VK_IMAGE_CREATE_FLAG_NAMES[] = {
+ "VK_IMAGE_CREATE_SPARSE_BINDING_BIT",
+ "VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT",
+ "VK_IMAGE_CREATE_SPARSE_ALIASED_BIT",
+ "VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT",
+ "VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT",
+ "VK_IMAGE_CREATE_ALIAS_BIT",
+ "VK_IMAGE_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT",
+ "VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT",
+ "VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT",
+ "VK_IMAGE_CREATE_EXTENDED_USAGE_BIT",
+ "VK_IMAGE_CREATE_PROTECTED_BIT",
+ "VK_IMAGE_CREATE_DISJOINT_BIT",
+ "VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV",
+ "VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT",
+};
+const uint32_t VK_IMAGE_CREATE_FLAG_VALUES[] = {
+ VK_IMAGE_CREATE_SPARSE_BINDING_BIT,
+ VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT,
+ VK_IMAGE_CREATE_SPARSE_ALIASED_BIT,
+ VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT,
+ VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT,
+ VK_IMAGE_CREATE_ALIAS_BIT,
+ VK_IMAGE_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT,
+ VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT,
+ VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT,
+ VK_IMAGE_CREATE_EXTENDED_USAGE_BIT,
+ VK_IMAGE_CREATE_PROTECTED_BIT,
+ VK_IMAGE_CREATE_DISJOINT_BIT,
+ VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV,
+ VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT,
+};
+const size_t VK_IMAGE_CREATE_FLAG_COUNT = _countof(VK_IMAGE_CREATE_FLAG_NAMES);
+static_assert(
+ _countof(VK_IMAGE_CREATE_FLAG_NAMES) == _countof(VK_IMAGE_CREATE_FLAG_VALUES),
+ "VK_IMAGE_CREATE_FLAG_NAMES array doesn't match VK_IMAGE_CREATE_FLAG_VALUES.");
+
+const char* VK_IMAGE_TYPE_NAMES[] = {
+ "VK_IMAGE_TYPE_1D",
+ "VK_IMAGE_TYPE_2D",
+ "VK_IMAGE_TYPE_3D",
+};
+const size_t VK_IMAGE_TYPE_COUNT = _countof(VK_IMAGE_TYPE_NAMES);
+
+const char* VK_FORMAT_NAMES[] = {
+ "VK_FORMAT_UNDEFINED",
+ "VK_FORMAT_R4G4_UNORM_PACK8",
+ "VK_FORMAT_R4G4B4A4_UNORM_PACK16",
+ "VK_FORMAT_B4G4R4A4_UNORM_PACK16",
+ "VK_FORMAT_R5G6B5_UNORM_PACK16",
+ "VK_FORMAT_B5G6R5_UNORM_PACK16",
+ "VK_FORMAT_R5G5B5A1_UNORM_PACK16",
+ "VK_FORMAT_B5G5R5A1_UNORM_PACK16",
+ "VK_FORMAT_A1R5G5B5_UNORM_PACK16",
+ "VK_FORMAT_R8_UNORM",
+ "VK_FORMAT_R8_SNORM",
+ "VK_FORMAT_R8_USCALED",
+ "VK_FORMAT_R8_SSCALED",
+ "VK_FORMAT_R8_UINT",
+ "VK_FORMAT_R8_SINT",
+ "VK_FORMAT_R8_SRGB",
+ "VK_FORMAT_R8G8_UNORM",
+ "VK_FORMAT_R8G8_SNORM",
+ "VK_FORMAT_R8G8_USCALED",
+ "VK_FORMAT_R8G8_SSCALED",
+ "VK_FORMAT_R8G8_UINT",
+ "VK_FORMAT_R8G8_SINT",
+ "VK_FORMAT_R8G8_SRGB",
+ "VK_FORMAT_R8G8B8_UNORM",
+ "VK_FORMAT_R8G8B8_SNORM",
+ "VK_FORMAT_R8G8B8_USCALED",
+ "VK_FORMAT_R8G8B8_SSCALED",
+ "VK_FORMAT_R8G8B8_UINT",
+ "VK_FORMAT_R8G8B8_SINT",
+ "VK_FORMAT_R8G8B8_SRGB",
+ "VK_FORMAT_B8G8R8_UNORM",
+ "VK_FORMAT_B8G8R8_SNORM",
+ "VK_FORMAT_B8G8R8_USCALED",
+ "VK_FORMAT_B8G8R8_SSCALED",
+ "VK_FORMAT_B8G8R8_UINT",
+ "VK_FORMAT_B8G8R8_SINT",
+ "VK_FORMAT_B8G8R8_SRGB",
+ "VK_FORMAT_R8G8B8A8_UNORM",
+ "VK_FORMAT_R8G8B8A8_SNORM",
+ "VK_FORMAT_R8G8B8A8_USCALED",
+ "VK_FORMAT_R8G8B8A8_SSCALED",
+ "VK_FORMAT_R8G8B8A8_UINT",
+ "VK_FORMAT_R8G8B8A8_SINT",
+ "VK_FORMAT_R8G8B8A8_SRGB",
+ "VK_FORMAT_B8G8R8A8_UNORM",
+ "VK_FORMAT_B8G8R8A8_SNORM",
+ "VK_FORMAT_B8G8R8A8_USCALED",
+ "VK_FORMAT_B8G8R8A8_SSCALED",
+ "VK_FORMAT_B8G8R8A8_UINT",
+ "VK_FORMAT_B8G8R8A8_SINT",
+ "VK_FORMAT_B8G8R8A8_SRGB",
+ "VK_FORMAT_A8B8G8R8_UNORM_PACK32",
+ "VK_FORMAT_A8B8G8R8_SNORM_PACK32",
+ "VK_FORMAT_A8B8G8R8_USCALED_PACK32",
+ "VK_FORMAT_A8B8G8R8_SSCALED_PACK32",
+ "VK_FORMAT_A8B8G8R8_UINT_PACK32",
+ "VK_FORMAT_A8B8G8R8_SINT_PACK32",
+ "VK_FORMAT_A8B8G8R8_SRGB_PACK32",
+ "VK_FORMAT_A2R10G10B10_UNORM_PACK32",
+ "VK_FORMAT_A2R10G10B10_SNORM_PACK32",
+ "VK_FORMAT_A2R10G10B10_USCALED_PACK32",
+ "VK_FORMAT_A2R10G10B10_SSCALED_PACK32",
+ "VK_FORMAT_A2R10G10B10_UINT_PACK32",
+ "VK_FORMAT_A2R10G10B10_SINT_PACK32",
+ "VK_FORMAT_A2B10G10R10_UNORM_PACK32",
+ "VK_FORMAT_A2B10G10R10_SNORM_PACK32",
+ "VK_FORMAT_A2B10G10R10_USCALED_PACK32",
+ "VK_FORMAT_A2B10G10R10_SSCALED_PACK32",
+ "VK_FORMAT_A2B10G10R10_UINT_PACK32",
+ "VK_FORMAT_A2B10G10R10_SINT_PACK32",
+ "VK_FORMAT_R16_UNORM",
+ "VK_FORMAT_R16_SNORM",
+ "VK_FORMAT_R16_USCALED",
+ "VK_FORMAT_R16_SSCALED",
+ "VK_FORMAT_R16_UINT",
+ "VK_FORMAT_R16_SINT",
+ "VK_FORMAT_R16_SFLOAT",
+ "VK_FORMAT_R16G16_UNORM",
+ "VK_FORMAT_R16G16_SNORM",
+ "VK_FORMAT_R16G16_USCALED",
+ "VK_FORMAT_R16G16_SSCALED",
+ "VK_FORMAT_R16G16_UINT",
+ "VK_FORMAT_R16G16_SINT",
+ "VK_FORMAT_R16G16_SFLOAT",
+ "VK_FORMAT_R16G16B16_UNORM",
+ "VK_FORMAT_R16G16B16_SNORM",
+ "VK_FORMAT_R16G16B16_USCALED",
+ "VK_FORMAT_R16G16B16_SSCALED",
+ "VK_FORMAT_R16G16B16_UINT",
+ "VK_FORMAT_R16G16B16_SINT",
+ "VK_FORMAT_R16G16B16_SFLOAT",
+ "VK_FORMAT_R16G16B16A16_UNORM",
+ "VK_FORMAT_R16G16B16A16_SNORM",
+ "VK_FORMAT_R16G16B16A16_USCALED",
+ "VK_FORMAT_R16G16B16A16_SSCALED",
+ "VK_FORMAT_R16G16B16A16_UINT",
+ "VK_FORMAT_R16G16B16A16_SINT",
+ "VK_FORMAT_R16G16B16A16_SFLOAT",
+ "VK_FORMAT_R32_UINT",
+ "VK_FORMAT_R32_SINT",
+ "VK_FORMAT_R32_SFLOAT",
+ "VK_FORMAT_R32G32_UINT",
+ "VK_FORMAT_R32G32_SINT",
+ "VK_FORMAT_R32G32_SFLOAT",
+ "VK_FORMAT_R32G32B32_UINT",
+ "VK_FORMAT_R32G32B32_SINT",
+ "VK_FORMAT_R32G32B32_SFLOAT",
+ "VK_FORMAT_R32G32B32A32_UINT",
+ "VK_FORMAT_R32G32B32A32_SINT",
+ "VK_FORMAT_R32G32B32A32_SFLOAT",
+ "VK_FORMAT_R64_UINT",
+ "VK_FORMAT_R64_SINT",
+ "VK_FORMAT_R64_SFLOAT",
+ "VK_FORMAT_R64G64_UINT",
+ "VK_FORMAT_R64G64_SINT",
+ "VK_FORMAT_R64G64_SFLOAT",
+ "VK_FORMAT_R64G64B64_UINT",
+ "VK_FORMAT_R64G64B64_SINT",
+ "VK_FORMAT_R64G64B64_SFLOAT",
+ "VK_FORMAT_R64G64B64A64_UINT",
+ "VK_FORMAT_R64G64B64A64_SINT",
+ "VK_FORMAT_R64G64B64A64_SFLOAT",
+ "VK_FORMAT_B10G11R11_UFLOAT_PACK32",
+ "VK_FORMAT_E5B9G9R9_UFLOAT_PACK32",
+ "VK_FORMAT_D16_UNORM",
+ "VK_FORMAT_X8_D24_UNORM_PACK32",
+ "VK_FORMAT_D32_SFLOAT",
+ "VK_FORMAT_S8_UINT",
+ "VK_FORMAT_D16_UNORM_S8_UINT",
+ "VK_FORMAT_D24_UNORM_S8_UINT",
+ "VK_FORMAT_D32_SFLOAT_S8_UINT",
+ "VK_FORMAT_BC1_RGB_UNORM_BLOCK",
+ "VK_FORMAT_BC1_RGB_SRGB_BLOCK",
+ "VK_FORMAT_BC1_RGBA_UNORM_BLOCK",
+ "VK_FORMAT_BC1_RGBA_SRGB_BLOCK",
+ "VK_FORMAT_BC2_UNORM_BLOCK",
+ "VK_FORMAT_BC2_SRGB_BLOCK",
+ "VK_FORMAT_BC3_UNORM_BLOCK",
+ "VK_FORMAT_BC3_SRGB_BLOCK",
+ "VK_FORMAT_BC4_UNORM_BLOCK",
+ "VK_FORMAT_BC4_SNORM_BLOCK",
+ "VK_FORMAT_BC5_UNORM_BLOCK",
+ "VK_FORMAT_BC5_SNORM_BLOCK",
+ "VK_FORMAT_BC6H_UFLOAT_BLOCK",
+ "VK_FORMAT_BC6H_SFLOAT_BLOCK",
+ "VK_FORMAT_BC7_UNORM_BLOCK",
+ "VK_FORMAT_BC7_SRGB_BLOCK",
+ "VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK",
+ "VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK",
+ "VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK",
+ "VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK",
+ "VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK",
+ "VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK",
+ "VK_FORMAT_EAC_R11_UNORM_BLOCK",
+ "VK_FORMAT_EAC_R11_SNORM_BLOCK",
+ "VK_FORMAT_EAC_R11G11_UNORM_BLOCK",
+ "VK_FORMAT_EAC_R11G11_SNORM_BLOCK",
+ "VK_FORMAT_ASTC_4x4_UNORM_BLOCK",
+ "VK_FORMAT_ASTC_4x4_SRGB_BLOCK",
+ "VK_FORMAT_ASTC_5x4_UNORM_BLOCK",
+ "VK_FORMAT_ASTC_5x4_SRGB_BLOCK",
+ "VK_FORMAT_ASTC_5x5_UNORM_BLOCK",
+ "VK_FORMAT_ASTC_5x5_SRGB_BLOCK",
+ "VK_FORMAT_ASTC_6x5_UNORM_BLOCK",
+ "VK_FORMAT_ASTC_6x5_SRGB_BLOCK",
+ "VK_FORMAT_ASTC_6x6_UNORM_BLOCK",
+ "VK_FORMAT_ASTC_6x6_SRGB_BLOCK",
+ "VK_FORMAT_ASTC_8x5_UNORM_BLOCK",
+ "VK_FORMAT_ASTC_8x5_SRGB_BLOCK",
+ "VK_FORMAT_ASTC_8x6_UNORM_BLOCK",
+ "VK_FORMAT_ASTC_8x6_SRGB_BLOCK",
+ "VK_FORMAT_ASTC_8x8_UNORM_BLOCK",
+ "VK_FORMAT_ASTC_8x8_SRGB_BLOCK",
+ "VK_FORMAT_ASTC_10x5_UNORM_BLOCK",
+ "VK_FORMAT_ASTC_10x5_SRGB_BLOCK",
+ "VK_FORMAT_ASTC_10x6_UNORM_BLOCK",
+ "VK_FORMAT_ASTC_10x6_SRGB_BLOCK",
+ "VK_FORMAT_ASTC_10x8_UNORM_BLOCK",
+ "VK_FORMAT_ASTC_10x8_SRGB_BLOCK",
+ "VK_FORMAT_ASTC_10x10_UNORM_BLOCK",
+ "VK_FORMAT_ASTC_10x10_SRGB_BLOCK",
+ "VK_FORMAT_ASTC_12x10_UNORM_BLOCK",
+ "VK_FORMAT_ASTC_12x10_SRGB_BLOCK",
+ "VK_FORMAT_ASTC_12x12_UNORM_BLOCK",
+ "VK_FORMAT_ASTC_12x12_SRGB_BLOCK",
+ "VK_FORMAT_G8B8G8R8_422_UNORM",
+ "VK_FORMAT_B8G8R8G8_422_UNORM",
+ "VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM",
+ "VK_FORMAT_G8_B8R8_2PLANE_420_UNORM",
+ "VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM",
+ "VK_FORMAT_G8_B8R8_2PLANE_422_UNORM",
+ "VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM",
+ "VK_FORMAT_R10X6_UNORM_PACK16",
+ "VK_FORMAT_R10X6G10X6_UNORM_2PACK16",
+ "VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16",
+ "VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16",
+ "VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16",
+ "VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16",
+ "VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16",
+ "VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16",
+ "VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16",
+ "VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16",
+ "VK_FORMAT_R12X4_UNORM_PACK16",
+ "VK_FORMAT_R12X4G12X4_UNORM_2PACK16",
+ "VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16",
+ "VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16",
+ "VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16",
+ "VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16",
+ "VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16",
+ "VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16",
+ "VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16",
+ "VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16",
+ "VK_FORMAT_G16B16G16R16_422_UNORM",
+ "VK_FORMAT_B16G16R16G16_422_UNORM",
+ "VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM",
+ "VK_FORMAT_G16_B16R16_2PLANE_420_UNORM",
+ "VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM",
+ "VK_FORMAT_G16_B16R16_2PLANE_422_UNORM",
+ "VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM",
+ "VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG",
+ "VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG",
+ "VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG",
+ "VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG",
+ "VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG",
+ "VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG",
+ "VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG",
+ "VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG",
+};
+const uint32_t VK_FORMAT_VALUES[] = {
+ VK_FORMAT_UNDEFINED,
+ VK_FORMAT_R4G4_UNORM_PACK8,
+ VK_FORMAT_R4G4B4A4_UNORM_PACK16,
+ VK_FORMAT_B4G4R4A4_UNORM_PACK16,
+ VK_FORMAT_R5G6B5_UNORM_PACK16,
+ VK_FORMAT_B5G6R5_UNORM_PACK16,
+ VK_FORMAT_R5G5B5A1_UNORM_PACK16,
+ VK_FORMAT_B5G5R5A1_UNORM_PACK16,
+ VK_FORMAT_A1R5G5B5_UNORM_PACK16,
+ VK_FORMAT_R8_UNORM,
+ VK_FORMAT_R8_SNORM,
+ VK_FORMAT_R8_USCALED,
+ VK_FORMAT_R8_SSCALED,
+ VK_FORMAT_R8_UINT,
+ VK_FORMAT_R8_SINT,
+ VK_FORMAT_R8_SRGB,
+ VK_FORMAT_R8G8_UNORM,
+ VK_FORMAT_R8G8_SNORM,
+ VK_FORMAT_R8G8_USCALED,
+ VK_FORMAT_R8G8_SSCALED,
+ VK_FORMAT_R8G8_UINT,
+ VK_FORMAT_R8G8_SINT,
+ VK_FORMAT_R8G8_SRGB,
+ VK_FORMAT_R8G8B8_UNORM,
+ VK_FORMAT_R8G8B8_SNORM,
+ VK_FORMAT_R8G8B8_USCALED,
+ VK_FORMAT_R8G8B8_SSCALED,
+ VK_FORMAT_R8G8B8_UINT,
+ VK_FORMAT_R8G8B8_SINT,
+ VK_FORMAT_R8G8B8_SRGB,
+ VK_FORMAT_B8G8R8_UNORM,
+ VK_FORMAT_B8G8R8_SNORM,
+ VK_FORMAT_B8G8R8_USCALED,
+ VK_FORMAT_B8G8R8_SSCALED,
+ VK_FORMAT_B8G8R8_UINT,
+ VK_FORMAT_B8G8R8_SINT,
+ VK_FORMAT_B8G8R8_SRGB,
+ VK_FORMAT_R8G8B8A8_UNORM,
+ VK_FORMAT_R8G8B8A8_SNORM,
+ VK_FORMAT_R8G8B8A8_USCALED,
+ VK_FORMAT_R8G8B8A8_SSCALED,
+ VK_FORMAT_R8G8B8A8_UINT,
+ VK_FORMAT_R8G8B8A8_SINT,
+ VK_FORMAT_R8G8B8A8_SRGB,
+ VK_FORMAT_B8G8R8A8_UNORM,
+ VK_FORMAT_B8G8R8A8_SNORM,
+ VK_FORMAT_B8G8R8A8_USCALED,
+ VK_FORMAT_B8G8R8A8_SSCALED,
+ VK_FORMAT_B8G8R8A8_UINT,
+ VK_FORMAT_B8G8R8A8_SINT,
+ VK_FORMAT_B8G8R8A8_SRGB,
+ VK_FORMAT_A8B8G8R8_UNORM_PACK32,
+ VK_FORMAT_A8B8G8R8_SNORM_PACK32,
+ VK_FORMAT_A8B8G8R8_USCALED_PACK32,
+ VK_FORMAT_A8B8G8R8_SSCALED_PACK32,
+ VK_FORMAT_A8B8G8R8_UINT_PACK32,
+ VK_FORMAT_A8B8G8R8_SINT_PACK32,
+ VK_FORMAT_A8B8G8R8_SRGB_PACK32,
+ VK_FORMAT_A2R10G10B10_UNORM_PACK32,
+ VK_FORMAT_A2R10G10B10_SNORM_PACK32,
+ VK_FORMAT_A2R10G10B10_USCALED_PACK32,
+ VK_FORMAT_A2R10G10B10_SSCALED_PACK32,
+ VK_FORMAT_A2R10G10B10_UINT_PACK32,
+ VK_FORMAT_A2R10G10B10_SINT_PACK32,
+ VK_FORMAT_A2B10G10R10_UNORM_PACK32,
+ VK_FORMAT_A2B10G10R10_SNORM_PACK32,
+ VK_FORMAT_A2B10G10R10_USCALED_PACK32,
+ VK_FORMAT_A2B10G10R10_SSCALED_PACK32,
+ VK_FORMAT_A2B10G10R10_UINT_PACK32,
+ VK_FORMAT_A2B10G10R10_SINT_PACK32,
+ VK_FORMAT_R16_UNORM,
+ VK_FORMAT_R16_SNORM,
+ VK_FORMAT_R16_USCALED,
+ VK_FORMAT_R16_SSCALED,
+ VK_FORMAT_R16_UINT,
+ VK_FORMAT_R16_SINT,
+ VK_FORMAT_R16_SFLOAT,
+ VK_FORMAT_R16G16_UNORM,
+ VK_FORMAT_R16G16_SNORM,
+ VK_FORMAT_R16G16_USCALED,
+ VK_FORMAT_R16G16_SSCALED,
+ VK_FORMAT_R16G16_UINT,
+ VK_FORMAT_R16G16_SINT,
+ VK_FORMAT_R16G16_SFLOAT,
+ VK_FORMAT_R16G16B16_UNORM,
+ VK_FORMAT_R16G16B16_SNORM,
+ VK_FORMAT_R16G16B16_USCALED,
+ VK_FORMAT_R16G16B16_SSCALED,
+ VK_FORMAT_R16G16B16_UINT,
+ VK_FORMAT_R16G16B16_SINT,
+ VK_FORMAT_R16G16B16_SFLOAT,
+ VK_FORMAT_R16G16B16A16_UNORM,
+ VK_FORMAT_R16G16B16A16_SNORM,
+ VK_FORMAT_R16G16B16A16_USCALED,
+ VK_FORMAT_R16G16B16A16_SSCALED,
+ VK_FORMAT_R16G16B16A16_UINT,
+ VK_FORMAT_R16G16B16A16_SINT,
+ VK_FORMAT_R16G16B16A16_SFLOAT,
+ VK_FORMAT_R32_UINT,
+ VK_FORMAT_R32_SINT,
+ VK_FORMAT_R32_SFLOAT,
+ VK_FORMAT_R32G32_UINT,
+ VK_FORMAT_R32G32_SINT,
+ VK_FORMAT_R32G32_SFLOAT,
+ VK_FORMAT_R32G32B32_UINT,
+ VK_FORMAT_R32G32B32_SINT,
+ VK_FORMAT_R32G32B32_SFLOAT,
+ VK_FORMAT_R32G32B32A32_UINT,
+ VK_FORMAT_R32G32B32A32_SINT,
+ VK_FORMAT_R32G32B32A32_SFLOAT,
+ VK_FORMAT_R64_UINT,
+ VK_FORMAT_R64_SINT,
+ VK_FORMAT_R64_SFLOAT,
+ VK_FORMAT_R64G64_UINT,
+ VK_FORMAT_R64G64_SINT,
+ VK_FORMAT_R64G64_SFLOAT,
+ VK_FORMAT_R64G64B64_UINT,
+ VK_FORMAT_R64G64B64_SINT,
+ VK_FORMAT_R64G64B64_SFLOAT,
+ VK_FORMAT_R64G64B64A64_UINT,
+ VK_FORMAT_R64G64B64A64_SINT,
+ VK_FORMAT_R64G64B64A64_SFLOAT,
+ VK_FORMAT_B10G11R11_UFLOAT_PACK32,
+ VK_FORMAT_E5B9G9R9_UFLOAT_PACK32,
+ VK_FORMAT_D16_UNORM,
+ VK_FORMAT_X8_D24_UNORM_PACK32,
+ VK_FORMAT_D32_SFLOAT,
+ VK_FORMAT_S8_UINT,
+ VK_FORMAT_D16_UNORM_S8_UINT,
+ VK_FORMAT_D24_UNORM_S8_UINT,
+ VK_FORMAT_D32_SFLOAT_S8_UINT,
+ VK_FORMAT_BC1_RGB_UNORM_BLOCK,
+ VK_FORMAT_BC1_RGB_SRGB_BLOCK,
+ VK_FORMAT_BC1_RGBA_UNORM_BLOCK,
+ VK_FORMAT_BC1_RGBA_SRGB_BLOCK,
+ VK_FORMAT_BC2_UNORM_BLOCK,
+ VK_FORMAT_BC2_SRGB_BLOCK,
+ VK_FORMAT_BC3_UNORM_BLOCK,
+ VK_FORMAT_BC3_SRGB_BLOCK,
+ VK_FORMAT_BC4_UNORM_BLOCK,
+ VK_FORMAT_BC4_SNORM_BLOCK,
+ VK_FORMAT_BC5_UNORM_BLOCK,
+ VK_FORMAT_BC5_SNORM_BLOCK,
+ VK_FORMAT_BC6H_UFLOAT_BLOCK,
+ VK_FORMAT_BC6H_SFLOAT_BLOCK,
+ VK_FORMAT_BC7_UNORM_BLOCK,
+ VK_FORMAT_BC7_SRGB_BLOCK,
+ VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK,
+ VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK,
+ VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK,
+ VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK,
+ VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK,
+ VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK,
+ VK_FORMAT_EAC_R11_UNORM_BLOCK,
+ VK_FORMAT_EAC_R11_SNORM_BLOCK,
+ VK_FORMAT_EAC_R11G11_UNORM_BLOCK,
+ VK_FORMAT_EAC_R11G11_SNORM_BLOCK,
+ VK_FORMAT_ASTC_4x4_UNORM_BLOCK,
+ VK_FORMAT_ASTC_4x4_SRGB_BLOCK,
+ VK_FORMAT_ASTC_5x4_UNORM_BLOCK,
+ VK_FORMAT_ASTC_5x4_SRGB_BLOCK,
+ VK_FORMAT_ASTC_5x5_UNORM_BLOCK,
+ VK_FORMAT_ASTC_5x5_SRGB_BLOCK,
+ VK_FORMAT_ASTC_6x5_UNORM_BLOCK,
+ VK_FORMAT_ASTC_6x5_SRGB_BLOCK,
+ VK_FORMAT_ASTC_6x6_UNORM_BLOCK,
+ VK_FORMAT_ASTC_6x6_SRGB_BLOCK,
+ VK_FORMAT_ASTC_8x5_UNORM_BLOCK,
+ VK_FORMAT_ASTC_8x5_SRGB_BLOCK,
+ VK_FORMAT_ASTC_8x6_UNORM_BLOCK,
+ VK_FORMAT_ASTC_8x6_SRGB_BLOCK,
+ VK_FORMAT_ASTC_8x8_UNORM_BLOCK,
+ VK_FORMAT_ASTC_8x8_SRGB_BLOCK,
+ VK_FORMAT_ASTC_10x5_UNORM_BLOCK,
+ VK_FORMAT_ASTC_10x5_SRGB_BLOCK,
+ VK_FORMAT_ASTC_10x6_UNORM_BLOCK,
+ VK_FORMAT_ASTC_10x6_SRGB_BLOCK,
+ VK_FORMAT_ASTC_10x8_UNORM_BLOCK,
+ VK_FORMAT_ASTC_10x8_SRGB_BLOCK,
+ VK_FORMAT_ASTC_10x10_UNORM_BLOCK,
+ VK_FORMAT_ASTC_10x10_SRGB_BLOCK,
+ VK_FORMAT_ASTC_12x10_UNORM_BLOCK,
+ VK_FORMAT_ASTC_12x10_SRGB_BLOCK,
+ VK_FORMAT_ASTC_12x12_UNORM_BLOCK,
+ VK_FORMAT_ASTC_12x12_SRGB_BLOCK,
+ VK_FORMAT_G8B8G8R8_422_UNORM,
+ VK_FORMAT_B8G8R8G8_422_UNORM,
+ VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM,
+ VK_FORMAT_G8_B8R8_2PLANE_420_UNORM,
+ VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM,
+ VK_FORMAT_G8_B8R8_2PLANE_422_UNORM,
+ VK_FORMAT_G8_B8_R8_3PLANE_444_UNORM,
+ VK_FORMAT_R10X6_UNORM_PACK16,
+ VK_FORMAT_R10X6G10X6_UNORM_2PACK16,
+ VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16,
+ VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16,
+ VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16,
+ VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_420_UNORM_3PACK16,
+ VK_FORMAT_G10X6_B10X6R10X6_2PLANE_420_UNORM_3PACK16,
+ VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_422_UNORM_3PACK16,
+ VK_FORMAT_G10X6_B10X6R10X6_2PLANE_422_UNORM_3PACK16,
+ VK_FORMAT_G10X6_B10X6_R10X6_3PLANE_444_UNORM_3PACK16,
+ VK_FORMAT_R12X4_UNORM_PACK16,
+ VK_FORMAT_R12X4G12X4_UNORM_2PACK16,
+ VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16,
+ VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16,
+ VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16,
+ VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_420_UNORM_3PACK16,
+ VK_FORMAT_G12X4_B12X4R12X4_2PLANE_420_UNORM_3PACK16,
+ VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_422_UNORM_3PACK16,
+ VK_FORMAT_G12X4_B12X4R12X4_2PLANE_422_UNORM_3PACK16,
+ VK_FORMAT_G12X4_B12X4_R12X4_3PLANE_444_UNORM_3PACK16,
+ VK_FORMAT_G16B16G16R16_422_UNORM,
+ VK_FORMAT_B16G16R16G16_422_UNORM,
+ VK_FORMAT_G16_B16_R16_3PLANE_420_UNORM,
+ VK_FORMAT_G16_B16R16_2PLANE_420_UNORM,
+ VK_FORMAT_G16_B16_R16_3PLANE_422_UNORM,
+ VK_FORMAT_G16_B16R16_2PLANE_422_UNORM,
+ VK_FORMAT_G16_B16_R16_3PLANE_444_UNORM,
+ VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG,
+ VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG,
+ VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG,
+ VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG,
+ VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG,
+ VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG,
+ VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG,
+ VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG,
+};
+const size_t VK_FORMAT_COUNT = _countof(VK_FORMAT_NAMES);
+static_assert(
+ _countof(VK_FORMAT_NAMES) == _countof(VK_FORMAT_VALUES),
+ "VK_FORMAT_NAMES array doesn't match VK_FORMAT_VALUES.");
+
+const char* VK_SAMPLE_COUNT_NAMES[] = {
+ "VK_SAMPLE_COUNT_1_BIT",
+ "VK_SAMPLE_COUNT_2_BIT",
+ "VK_SAMPLE_COUNT_4_BIT",
+ "VK_SAMPLE_COUNT_8_BIT",
+ "VK_SAMPLE_COUNT_16_BIT",
+ "VK_SAMPLE_COUNT_32_BIT",
+ "VK_SAMPLE_COUNT_64_BIT",
+};
+const uint32_t VK_SAMPLE_COUNT_VALUES[] = {
+ VK_SAMPLE_COUNT_1_BIT,
+ VK_SAMPLE_COUNT_2_BIT,
+ VK_SAMPLE_COUNT_4_BIT,
+ VK_SAMPLE_COUNT_8_BIT,
+ VK_SAMPLE_COUNT_16_BIT,
+ VK_SAMPLE_COUNT_32_BIT,
+ VK_SAMPLE_COUNT_64_BIT,
+};
+const size_t VK_SAMPLE_COUNT_COUNT = _countof(VK_SAMPLE_COUNT_NAMES);
+static_assert(
+ _countof(VK_SAMPLE_COUNT_NAMES) == _countof(VK_SAMPLE_COUNT_VALUES),
+ "VK_SAMPLE_COUNT_NAMES array doesn't match VK_SAMPLE_COUNT_VALUES.");
+
+const char* VK_IMAGE_TILING_NAMES[] = {
+ "VK_IMAGE_TILING_OPTIMAL",
+ "VK_IMAGE_TILING_LINEAR",
+};
+const size_t VK_IMAGE_TILING_COUNT = _countof(VK_IMAGE_TILING_NAMES);
+
+const char* VK_IMAGE_USAGE_FLAG_NAMES[] = {
+ "VK_IMAGE_USAGE_TRANSFER_SRC_BIT",
+ "VK_IMAGE_USAGE_TRANSFER_DST_BIT",
+ "VK_IMAGE_USAGE_SAMPLED_BIT",
+ "VK_IMAGE_USAGE_STORAGE_BIT",
+ "VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT",
+ "VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT",
+ "VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT",
+ "VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT",
+ "VK_IMAGE_USAGE_SHADING_RATE_IMAGE_BIT_NV",
+};
+const uint32_t VK_IMAGE_USAGE_FLAG_VALUES[] = {
+ VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
+ VK_IMAGE_USAGE_TRANSFER_DST_BIT,
+ VK_IMAGE_USAGE_SAMPLED_BIT,
+ VK_IMAGE_USAGE_STORAGE_BIT,
+ VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
+ VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
+ VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT,
+ VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT,
+ VK_IMAGE_USAGE_SHADING_RATE_IMAGE_BIT_NV,
+};
+const size_t VK_IMAGE_USAGE_FLAG_COUNT = _countof(VK_IMAGE_USAGE_FLAG_NAMES);
+static_assert(
+ _countof(VK_IMAGE_USAGE_FLAG_NAMES) == _countof(VK_IMAGE_USAGE_FLAG_VALUES),
+ "VK_IMAGE_USAGE_FLAG_NAMES array doesn't match VK_IMAGE_USAGE_FLAG_VALUES.");
+
+const char* VK_IMAGE_LAYOUT_NAMES[] = {
+ "VK_IMAGE_LAYOUT_UNDEFINED",
+ "VK_IMAGE_LAYOUT_GENERAL",
+ "VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL",
+ "VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL",
+ "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL",
+ "VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL",
+ "VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL",
+ "VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL",
+ "VK_IMAGE_LAYOUT_PREINITIALIZED",
+ "VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL",
+ "VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL",
+ "VK_IMAGE_LAYOUT_PRESENT_SRC_KHR",
+ "VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR",
+ "VK_IMAGE_LAYOUT_SHADING_RATE_OPTIMAL_NV",
+};
+const uint32_t VK_IMAGE_LAYOUT_VALUES[] = {
+ VK_IMAGE_LAYOUT_UNDEFINED,
+ VK_IMAGE_LAYOUT_GENERAL,
+ VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
+ VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
+ VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL,
+ VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,
+ VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
+ VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
+ VK_IMAGE_LAYOUT_PREINITIALIZED,
+ VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL,
+ VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL,
+ VK_IMAGE_LAYOUT_PRESENT_SRC_KHR,
+ VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR,
+ VK_IMAGE_LAYOUT_SHADING_RATE_OPTIMAL_NV,
+};
+const size_t VK_IMAGE_LAYOUT_COUNT = _countof(VK_IMAGE_LAYOUT_NAMES);
+static_assert(
+ _countof(VK_IMAGE_LAYOUT_NAMES) == _countof(VK_IMAGE_LAYOUT_VALUES),
+ "VK_IMAGE_LAYOUT_NAMES array doesn't match VK_IMAGE_LAYOUT_VALUES.");
+
+const char* VMA_ALLOCATION_CREATE_FLAG_NAMES[] = {
+ "VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT",
+ "VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT",
+ "VMA_ALLOCATION_CREATE_MAPPED_BIT",
+ "VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT",
+ "VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT",
+ "VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT",
+ "VMA_ALLOCATION_CREATE_UPPER_ADDRESS_BIT",
+ "VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT",
+ "VMA_ALLOCATION_CREATE_STRATEGY_WORST_FIT_BIT",
+ "VMA_ALLOCATION_CREATE_STRATEGY_FIRST_FIT_BIT",
+};
+const uint32_t VMA_ALLOCATION_CREATE_FLAG_VALUES[] = {
+ VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT,
+ VMA_ALLOCATION_CREATE_NEVER_ALLOCATE_BIT,
+ VMA_ALLOCATION_CREATE_MAPPED_BIT,
+ VMA_ALLOCATION_CREATE_CAN_BECOME_LOST_BIT,
+ VMA_ALLOCATION_CREATE_CAN_MAKE_OTHER_LOST_BIT,
+ VMA_ALLOCATION_CREATE_USER_DATA_COPY_STRING_BIT,
+ VMA_ALLOCATION_CREATE_UPPER_ADDRESS_BIT,
+ VMA_ALLOCATION_CREATE_STRATEGY_BEST_FIT_BIT,
+ VMA_ALLOCATION_CREATE_STRATEGY_WORST_FIT_BIT,
+ VMA_ALLOCATION_CREATE_STRATEGY_FIRST_FIT_BIT,
+};
+const size_t VMA_ALLOCATION_CREATE_FLAG_COUNT = _countof(VMA_ALLOCATION_CREATE_FLAG_NAMES);
+static_assert(
+ _countof(VMA_ALLOCATION_CREATE_FLAG_NAMES) == _countof(VMA_ALLOCATION_CREATE_FLAG_VALUES),
+ "VMA_ALLOCATION_CREATE_FLAG_NAMES array doesn't match VMA_ALLOCATION_CREATE_FLAG_VALUES.");
+
+const char* VMA_MEMORY_USAGE_NAMES[] = {
+ "VMA_MEMORY_USAGE_UNKNOWN",
+ "VMA_MEMORY_USAGE_GPU_ONLY",
+ "VMA_MEMORY_USAGE_CPU_ONLY",
+ "VMA_MEMORY_USAGE_CPU_TO_GPU",
+ "VMA_MEMORY_USAGE_GPU_TO_CPU",
+};
+const size_t VMA_MEMORY_USAGE_COUNT = _countof(VMA_MEMORY_USAGE_NAMES);
+
+const char* VK_MEMORY_PROPERTY_FLAG_NAMES[] = {
+ "VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT",
+ "VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT",
+ "VK_MEMORY_PROPERTY_HOST_COHERENT_BIT",
+ "VK_MEMORY_PROPERTY_HOST_CACHED_BIT",
+ "VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT",
+ "VK_MEMORY_PROPERTY_PROTECTED_BIT",
+};
+const uint32_t VK_MEMORY_PROPERTY_FLAG_VALUES[] = {
+ VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
+ VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
+ VK_MEMORY_PROPERTY_HOST_COHERENT_BIT,
+ VK_MEMORY_PROPERTY_HOST_CACHED_BIT,
+ VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT,
+ VK_MEMORY_PROPERTY_PROTECTED_BIT,
+};
+const size_t VK_MEMORY_PROPERTY_FLAG_COUNT = _countof(VK_MEMORY_PROPERTY_FLAG_NAMES);
+static_assert(
+ _countof(VK_MEMORY_PROPERTY_FLAG_NAMES) == _countof(VK_MEMORY_PROPERTY_FLAG_VALUES),
+ "VK_MEMORY_PROPERTY_FLAG_NAMES array doesn't match VK_MEMORY_PROPERTY_FLAG_VALUES.");
diff --git a/src/VmaReplay/Constants.h b/src/VmaReplay/Constants.h
new file mode 100644
index 0000000..2c58f68
--- /dev/null
+++ b/src/VmaReplay/Constants.h
@@ -0,0 +1,125 @@
+#pragma once
+
+extern const int RESULT_EXCEPTION;
+extern const int RESULT_ERROR_COMMAND_LINE;
+extern const int RESULT_ERROR_SOURCE_FILE;
+extern const int RESULT_ERROR_FORMAT;
+extern const int RESULT_ERROR_VULKAN;
+
+enum CMD_LINE_OPT
+{
+ CMD_LINE_OPT_VERBOSITY,
+ CMD_LINE_OPT_ITERATIONS,
+ CMD_LINE_OPT_LINES,
+ CMD_LINE_OPT_PHYSICAL_DEVICE,
+ CMD_LINE_OPT_USER_DATA,
+ CMD_LINE_OPT_VK_KHR_DEDICATED_ALLOCATION,
+ CMD_LINE_OPT_VK_LAYER_LUNARG_STANDARD_VALIDATION,
+ CMD_LINE_OPT_MEM_STATS,
+ CMD_LINE_OPT_DUMP_STATS_AFTER_LINE,
+ CMD_LINE_OPT_DEFRAGMENT_AFTER_LINE,
+ CMD_LINE_OPT_DEFRAGMENTATION_FLAGS,
+ CMD_LINE_OPT_DUMP_DETAILED_STATS_AFTER_LINE,
+};
+
+enum class VERBOSITY
+{
+ MINIMUM = 0,
+ DEFAULT,
+ MAXIMUM,
+ COUNT,
+};
+
+enum class VULKAN_EXTENSION_REQUEST
+{
+ DISABLED,
+ ENABLED,
+ DEFAULT
+};
+
+enum class OBJECT_TYPE { BUFFER, IMAGE };
+
+enum class VMA_FUNCTION
+{
+ CreatePool,
+ DestroyPool,
+ SetAllocationUserData,
+ CreateBuffer,
+ DestroyBuffer,
+ CreateImage,
+ DestroyImage,
+ FreeMemory,
+ FreeMemoryPages,
+ CreateLostAllocation,
+ AllocateMemory,
+ AllocateMemoryPages,
+ AllocateMemoryForBuffer,
+ AllocateMemoryForImage,
+ MapMemory,
+ UnmapMemory,
+ FlushAllocation,
+ InvalidateAllocation,
+ TouchAllocation,
+ GetAllocationInfo,
+ MakePoolAllocationsLost,
+ ResizeAllocation,
+ DefragmentationBegin,
+ DefragmentationEnd,
+ Count
+};
+extern const char* VMA_FUNCTION_NAMES[];
+
+extern const char* VMA_POOL_CREATE_FLAG_NAMES[];
+extern const uint32_t VMA_POOL_CREATE_FLAG_VALUES[];
+extern const size_t VMA_POOL_CREATE_FLAG_COUNT;
+
+extern const char* VK_BUFFER_CREATE_FLAG_NAMES[];
+extern const uint32_t VK_BUFFER_CREATE_FLAG_VALUES[];
+extern const size_t VK_BUFFER_CREATE_FLAG_COUNT;
+
+extern const char* VK_BUFFER_USAGE_FLAG_NAMES[];
+extern const uint32_t VK_BUFFER_USAGE_FLAG_VALUES[];
+extern const size_t VK_BUFFER_USAGE_FLAG_COUNT;
+
+extern const char* VK_SHARING_MODE_NAMES[];
+extern const size_t VK_SHARING_MODE_COUNT;
+
+extern const char* VK_IMAGE_CREATE_FLAG_NAMES[];
+extern const uint32_t VK_IMAGE_CREATE_FLAG_VALUES[];
+extern const size_t VK_IMAGE_CREATE_FLAG_COUNT;
+
+extern const char* VK_IMAGE_TYPE_NAMES[];
+extern const size_t VK_IMAGE_TYPE_COUNT;
+
+extern const char* VK_FORMAT_NAMES[];
+extern const uint32_t VK_FORMAT_VALUES[];
+extern const size_t VK_FORMAT_COUNT;
+
+extern const char* VK_SAMPLE_COUNT_NAMES[];
+extern const uint32_t VK_SAMPLE_COUNT_VALUES[];
+extern const size_t VK_SAMPLE_COUNT_COUNT;
+
+extern const char* VK_IMAGE_TILING_NAMES[];
+extern const size_t VK_IMAGE_TILING_COUNT;
+
+extern const char* VK_IMAGE_USAGE_FLAG_NAMES[];
+extern const uint32_t VK_IMAGE_USAGE_FLAG_VALUES[];
+extern const size_t VK_IMAGE_USAGE_FLAG_COUNT;
+
+extern const char* VK_IMAGE_TILING_NAMES[];
+extern const size_t VK_IMAGE_TILING_COUNT;
+
+extern const char* VK_IMAGE_LAYOUT_NAMES[];
+extern const uint32_t VK_IMAGE_LAYOUT_VALUES[];
+extern const size_t VK_IMAGE_LAYOUT_COUNT;
+
+extern const char* VMA_ALLOCATION_CREATE_FLAG_NAMES[];
+extern const uint32_t VMA_ALLOCATION_CREATE_FLAG_VALUES[];
+extern const size_t VMA_ALLOCATION_CREATE_FLAG_COUNT;
+
+extern const char* VMA_MEMORY_USAGE_NAMES[];
+extern const size_t VMA_MEMORY_USAGE_COUNT;
+
+extern const char* VK_MEMORY_PROPERTY_FLAG_NAMES[];
+extern const uint32_t VK_MEMORY_PROPERTY_FLAG_VALUES[];
+extern const size_t VK_MEMORY_PROPERTY_FLAG_COUNT;
diff --git a/src/VmaReplay/VmaReplay.cpp b/src/VmaReplay/VmaReplay.cpp
index f830176..4228009 100644
--- a/src/VmaReplay/VmaReplay.cpp
+++ b/src/VmaReplay/VmaReplay.cpp
@@ -22,104 +22,634 @@
#include "VmaUsage.h"
#include "Common.h"
+#include "Constants.h"
#include <unordered_map>
+#include <map>
+#include <algorithm>
-static const int RESULT_EXCEPTION = -1000;
-static const int RESULT_ERROR_COMMAND_LINE = -1;
-static const int RESULT_ERROR_SOURCE_FILE = -2;
-static const int RESULT_ERROR_FORMAT = -3;
-static const int RESULT_ERROR_VULKAN = -4;
+static VERBOSITY g_Verbosity = VERBOSITY::DEFAULT;
-enum CMD_LINE_OPT
+namespace DetailedStats
{
- CMD_LINE_OPT_VERBOSITY,
- CMD_LINE_OPT_ITERATIONS,
- CMD_LINE_OPT_LINES,
- CMD_LINE_OPT_PHYSICAL_DEVICE,
- CMD_LINE_OPT_USER_DATA,
- CMD_LINE_OPT_VK_KHR_DEDICATED_ALLOCATION,
- CMD_LINE_OPT_VK_LAYER_LUNARG_STANDARD_VALIDATION,
- CMD_LINE_OPT_MEM_STATS,
- CMD_LINE_OPT_DUMP_STATS_AFTER_LINE,
- CMD_LINE_OPT_DEFRAGMENT_AFTER_LINE,
- CMD_LINE_OPT_DEFRAGMENTATION_FLAGS,
- CMD_LINE_OPT_DUMP_DETAILED_STATS_AFTER_LINE,
+
+struct Flag
+{
+ uint32_t setCount = 0;
+
+ void PostValue(bool v)
+ {
+ if(v)
+ {
+ ++setCount;
+ }
+ }
+
+ void Print(uint32_t totalCount) const
+ {
+ if(setCount)
+ {
+ printf(" %u (%.2f%%)\n", setCount, (double)setCount * 100.0 / (double)totalCount);
+ }
+ else
+ {
+ printf(" 0\n");
+ }
+ }
};
-static enum class VERBOSITY
+struct Enum
{
- MINIMUM = 0,
- DEFAULT,
- MAXIMUM,
- COUNT,
-} g_Verbosity = VERBOSITY::DEFAULT;
+ Enum(size_t itemCount, const char* const* itemNames, const uint32_t* itemValues = nullptr) :
+ m_ItemCount(itemCount),
+ m_ItemNames(itemNames),
+ m_ItemValues(itemValues)
+ {
+ }
-enum class VULKAN_EXTENSION_REQUEST
-{
- DISABLED,
- ENABLED,
- DEFAULT
+ void PostValue(uint32_t v)
+ {
+ if(v < _countof(m_BaseCount))
+ {
+ ++m_BaseCount[v];
+ }
+ else
+ {
+ auto it = m_ExtendedCount.find(v);
+ if(it != m_ExtendedCount.end())
+ {
+ ++it->second;
+ }
+ else
+ {
+ m_ExtendedCount.insert(std::make_pair(v, 1u));
+ }
+ }
+ }
+
+ void Print(uint32_t totalCount) const
+ {
+ if(totalCount &&
+ (!m_ExtendedCount.empty() || std::count_if(m_BaseCount, m_BaseCount + _countof(m_BaseCount), [](uint32_t v) { return v > 0; })))
+ {
+ printf("\n");
+
+ for(size_t i = 0; i < _countof(m_BaseCount); ++i)
+ {
+ const uint32_t currCount = m_BaseCount[i];
+ if(currCount)
+ {
+ PrintItem((uint32_t)i, currCount, totalCount);
+ }
+ }
+
+ for(const auto& it : m_ExtendedCount)
+ {
+ PrintItem(it.first, it.second, totalCount);
+ }
+ }
+ else
+ {
+ printf(" 0\n");
+ }
+ }
+
+private:
+ const size_t m_ItemCount;
+ const char* const* const m_ItemNames;
+ const uint32_t* const m_ItemValues;
+
+ uint32_t m_BaseCount[32] = {};
+ std::map<uint32_t, uint32_t> m_ExtendedCount;
+
+ void PrintItem(uint32_t value, uint32_t count, uint32_t totalCount) const
+ {
+ size_t itemIndex = m_ItemCount;
+ if(m_ItemValues)
+ {
+ for(itemIndex = 0; itemIndex < m_ItemCount; ++itemIndex)
+ {
+ if(m_ItemValues[itemIndex] == value)
+ {
+ break;
+ }
+ }
+ }
+ else
+ {
+ if(value < m_ItemCount)
+ {
+ itemIndex = value;
+ }
+ }
+
+ if(itemIndex < m_ItemCount)
+ {
+ printf(" %s: ", m_ItemNames[itemIndex]);
+ }
+ else
+ {
+ printf(" 0x%X: ", value);
+ }
+
+ printf("%u (%.2f%%)\n", count, (double)count * 100.0 / (double)totalCount);
+ }
};
-enum class OBJECT_TYPE { BUFFER, IMAGE };
-
-enum class VMA_FUNCTION
+struct FlagSet
{
- CreatePool,
- DestroyPool,
- SetAllocationUserData,
- CreateBuffer,
- DestroyBuffer,
- CreateImage,
- DestroyImage,
- FreeMemory,
- FreeMemoryPages,
- CreateLostAllocation,
- AllocateMemory,
- AllocateMemoryPages,
- AllocateMemoryForBuffer,
- AllocateMemoryForImage,
- MapMemory,
- UnmapMemory,
- FlushAllocation,
- InvalidateAllocation,
- TouchAllocation,
- GetAllocationInfo,
- MakePoolAllocationsLost,
- ResizeAllocation,
- DefragmentationBegin,
- DefragmentationEnd,
- Count
+ uint32_t count[32] = {};
+
+ FlagSet(size_t count, const char* const* names, const uint32_t* values = nullptr) :
+ m_Count(count),
+ m_Names(names),
+ m_Values(values)
+ {
+ }
+
+ void PostValue(uint32_t v)
+ {
+ for(size_t i = 0; i < 32; ++i)
+ {
+ if((v & (1u << i)) != 0)
+ {
+ ++count[i];
+ }
+ }
+ }
+
+ void Print(uint32_t totalCount) const
+ {
+ if(totalCount &&
+ std::count_if(count, count + _countof(count), [](uint32_t v) { return v > 0; }))
+ {
+ printf("\n");
+ for(uint32_t bitIndex = 0; bitIndex < 32; ++bitIndex)
+ {
+ const uint32_t currCount = count[bitIndex];
+ if(currCount)
+ {
+ size_t itemIndex = m_Count;
+ if(m_Values)
+ {
+ for(itemIndex = 0; itemIndex < m_Count; ++itemIndex)
+ {
+ if(m_Values[itemIndex] == (1u << bitIndex))
+ {
+ break;
+ }
+ }
+ }
+ else
+ {
+ if(bitIndex < m_Count)
+ {
+ itemIndex = bitIndex;
+ }
+ }
+
+ if(itemIndex < m_Count)
+ {
+ printf(" %s: ", m_Names[itemIndex]);
+ }
+ else
+ {
+ printf(" 0x%X: ", 1u << bitIndex);
+ }
+
+ printf("%u (%.2f%%)\n", currCount, (double)currCount * 100.0 / (double)totalCount);
+ }
+ }
+ }
+ else
+ {
+ printf(" 0\n");
+ }
+ }
+
+private:
+ const size_t m_Count;
+ const char* const* const m_Names;
+ const uint32_t* const m_Values;
};
-static const char* VMA_FUNCTION_NAMES[] = {
- "vmaCreatePool",
- "vmaDestroyPool",
- "vmaSetAllocationUserData",
- "vmaCreateBuffer",
- "vmaDestroyBuffer",
- "vmaCreateImage",
- "vmaDestroyImage",
- "vmaFreeMemory",
- "vmaFreeMemoryPages",
- "vmaCreateLostAllocation",
- "vmaAllocateMemory",
- "vmaAllocateMemoryPages",
- "vmaAllocateMemoryForBuffer",
- "vmaAllocateMemoryForImage",
- "vmaMapMemory",
- "vmaUnmapMemory",
- "vmaFlushAllocation",
- "vmaInvalidateAllocation",
- "vmaTouchAllocation",
- "vmaGetAllocationInfo",
- "vmaMakePoolAllocationsLost",
- "vmaResizeAllocation",
- "vmaDefragmentationBegin",
- "vmaDefragmentationEnd",
+
+// T should be unsigned int
+template<typename T>
+struct MinMaxAvg
+{
+ T min = std::numeric_limits<T>::max();
+ T max = 0;
+ T sum = T();
+
+ void PostValue(T v)
+ {
+ this->min = std::min(this->min, v);
+ this->max = std::max(this->max, v);
+ sum += v;
+ }
+
+ void Print(uint32_t totalCount) const
+ {
+ if(totalCount && sum > T())
+ {
+ if(this->min == this->max)
+ {
+ printf(" %llu\n", (uint64_t)this->max);
+ }
+ else
+ {
+ printf("\n Min: %llu\n Max: %llu\n Avg: %llu\n",
+ (uint64_t)this->min,
+ (uint64_t)this->max,
+ round_div<uint64_t>(this->sum, totalCount));
+ }
+ }
+ else
+ {
+ printf(" 0\n");
+ }
+ }
};
-static_assert(
- _countof(VMA_FUNCTION_NAMES) == (size_t)VMA_FUNCTION::Count,
- "VMA_FUNCTION_NAMES array doesn't match VMA_FUNCTION enum.");
+
+template<typename T>
+struct BitMask
+{
+ uint32_t zeroCount = 0;
+ uint32_t maxCount = 0;
+
+ void PostValue(T v)
+ {
+ if(v)
+ {
+ if(v == std::numeric_limits<T>::max())
+ {
+ ++maxCount;
+ }
+ }
+ else
+ {
+ ++zeroCount;
+ }
+ }
+
+ void Print(uint32_t totalCount) const
+ {
+ if(totalCount > 0 && zeroCount < totalCount)
+ {
+ const uint32_t otherCount = totalCount - (zeroCount + maxCount);
+
+ printf("\n 0: %u (%.2f%%)\n Max: %u (%.2f%%)\n Other: %u (%.2f%%)\n",
+ zeroCount, (double)zeroCount * 100.0 / (double)totalCount,
+ maxCount, (double)maxCount * 100.0 / (double)totalCount,
+ otherCount, (double)otherCount * 100.0 / (double)totalCount);
+ }
+ else
+ {
+ printf(" 0\n");
+ }
+ }
+};
+
+struct CountPerMemType
+{
+ uint32_t count[VK_MAX_MEMORY_TYPES] = {};
+
+ void PostValue(uint32_t v)
+ {
+ for(uint32_t i = 0; i < VK_MAX_MEMORY_TYPES; ++i)
+ {
+ if((v & (1u << i)) != 0)
+ {
+ ++count[i];
+ }
+ }
+ }
+
+ void Print(uint32_t totalCount) const
+ {
+ if(totalCount)
+ {
+ printf("\n");
+ for(uint32_t i = 0; i < VK_MAX_MEMORY_TYPES; ++i)
+ {
+ if(count[i])
+ {
+ printf(" %u: %u (%.2f%%)\n", i, count[i],
+ (double)count[i] * 100.0 / (double)totalCount);
+ }
+ }
+ }
+ else
+ {
+ printf(" 0\n");
+ }
+ }
+};
+
+struct StructureStats
+{
+ uint32_t totalCount = 0;
+};
+
+#define PRINT_FIELD(name) \
+ printf(" " #name ":"); \
+ (name).Print(totalCount);
+#define PRINT_FIELD_NAMED(name, nameStr) \
+ printf(" " nameStr ":"); \
+ (name).Print(totalCount);
+
+struct VmaPoolCreateInfoStats : public StructureStats
+{
+ CountPerMemType memoryTypeIndex;
+ FlagSet flags;
+ MinMaxAvg<VkDeviceSize> blockSize;
+ MinMaxAvg<size_t> minBlockCount;
+ MinMaxAvg<size_t> maxBlockCount;
+ Flag minMaxBlockCountEqual;
+ MinMaxAvg<uint32_t> frameInUseCount;
+
+ VmaPoolCreateInfoStats() :
+ flags(VMA_POOL_CREATE_FLAG_COUNT, VMA_POOL_CREATE_FLAG_NAMES, VMA_POOL_CREATE_FLAG_VALUES)
+ {
+ }
+
+ void PostValue(const VmaPoolCreateInfo& v)
+ {
+ ++totalCount;
+
+ memoryTypeIndex.PostValue(v.memoryTypeIndex);
+ flags.PostValue(v.flags);
+ blockSize.PostValue(v.blockSize);
+ minBlockCount.PostValue(v.minBlockCount);
+ maxBlockCount.PostValue(v.maxBlockCount);
+ minMaxBlockCountEqual.PostValue(v.minBlockCount == v.maxBlockCount);
+ frameInUseCount.PostValue(v.frameInUseCount);
+ }
+
+ void Print() const
+ {
+ if(totalCount == 0)
+ {
+ return;
+ }
+
+ printf("VmaPoolCreateInfo (%u):\n", totalCount);
+
+ PRINT_FIELD(memoryTypeIndex);
+ PRINT_FIELD(flags);
+ PRINT_FIELD(blockSize);
+ PRINT_FIELD(minBlockCount);
+ PRINT_FIELD(maxBlockCount);
+ PRINT_FIELD_NAMED(minMaxBlockCountEqual, "minBlockCount == maxBlockCount");
+ PRINT_FIELD(frameInUseCount);
+ }
+};
+
+struct VkBufferCreateInfoStats : public StructureStats
+{
+ FlagSet flags;
+ MinMaxAvg<VkDeviceSize> size;
+ FlagSet usage;
+ Enum sharingMode;
+
+ VkBufferCreateInfoStats() :
+ flags(VK_BUFFER_CREATE_FLAG_COUNT, VK_BUFFER_CREATE_FLAG_NAMES, VK_BUFFER_CREATE_FLAG_VALUES),
+ usage(VK_BUFFER_USAGE_FLAG_COUNT, VK_BUFFER_USAGE_FLAG_NAMES, VK_BUFFER_USAGE_FLAG_VALUES),
+ sharingMode(VK_SHARING_MODE_COUNT, VK_SHARING_MODE_NAMES)
+ {
+ }
+
+ void PostValue(const VkBufferCreateInfo& v)
+ {
+ ++totalCount;
+
+ flags.PostValue(v.flags);
+ size.PostValue(v.size);
+ usage.PostValue(v.usage);
+ sharingMode.PostValue(v.sharingMode);
+ }
+
+ void Print() const
+ {
+ if(totalCount == 0)
+ {
+ return;
+ }
+
+ printf("VkBufferCreateInfo (%u):\n", totalCount);
+
+ PRINT_FIELD(flags);
+ PRINT_FIELD(size);
+ PRINT_FIELD(usage);
+ PRINT_FIELD(sharingMode);
+ }
+};
+
+struct VkImageCreateInfoStats : public StructureStats
+{
+ FlagSet flags;
+ Enum imageType;
+ Enum format;
+ MinMaxAvg<uint32_t> width, height, depth, mipLevels, arrayLayers;
+ Flag depthGreaterThanOne, mipLevelsGreaterThanOne, arrayLayersGreaterThanOne;
+ Enum samples;
+ Enum tiling;
+ FlagSet usage;
+ Enum sharingMode;
+ Enum initialLayout;
+
+ VkImageCreateInfoStats() :
+ flags(VK_IMAGE_CREATE_FLAG_COUNT, VK_IMAGE_CREATE_FLAG_NAMES, VK_IMAGE_CREATE_FLAG_VALUES),
+ imageType(VK_IMAGE_TYPE_COUNT, VK_IMAGE_TYPE_NAMES),
+ format(VK_FORMAT_COUNT, VK_FORMAT_NAMES, VK_FORMAT_VALUES),
+ samples(VK_SAMPLE_COUNT_COUNT, VK_SAMPLE_COUNT_NAMES, VK_SAMPLE_COUNT_VALUES),
+ tiling(VK_IMAGE_TILING_COUNT, VK_IMAGE_TILING_NAMES),
+ usage(VK_IMAGE_USAGE_FLAG_COUNT, VK_IMAGE_USAGE_FLAG_NAMES, VK_IMAGE_USAGE_FLAG_VALUES),
+ sharingMode(VK_SHARING_MODE_COUNT, VK_SHARING_MODE_NAMES),
+ initialLayout(VK_IMAGE_LAYOUT_COUNT, VK_IMAGE_LAYOUT_NAMES, VK_IMAGE_LAYOUT_VALUES)
+ {
+ }
+
+ void PostValue(const VkImageCreateInfo& v)
+ {
+ ++totalCount;
+
+ flags.PostValue(v.flags);
+ imageType.PostValue(v.imageType);
+ format.PostValue(v.format);
+ width.PostValue(v.extent.width);
+ height.PostValue(v.extent.height);
+ depth.PostValue(v.extent.depth);
+ mipLevels.PostValue(v.mipLevels);
+ arrayLayers.PostValue(v.arrayLayers);
+ depthGreaterThanOne.PostValue(v.extent.depth > 1);
+ mipLevelsGreaterThanOne.PostValue(v.mipLevels > 1);
+ arrayLayersGreaterThanOne.PostValue(v.arrayLayers > 1);
+ samples.PostValue(v.samples);
+ tiling.PostValue(v.tiling);
+ usage.PostValue(v.usage);
+ sharingMode.PostValue(v.sharingMode);
+ initialLayout.PostValue(v.initialLayout);
+ }
+
+ void Print() const
+ {
+ if(totalCount == 0)
+ {
+ return;
+ }
+
+ printf("VkImageCreateInfo (%u):\n", totalCount);
+
+ PRINT_FIELD(flags);
+ PRINT_FIELD(imageType);
+ PRINT_FIELD(format);
+ PRINT_FIELD(width);
+ PRINT_FIELD(height);
+ PRINT_FIELD(depth);
+ PRINT_FIELD(mipLevels);
+ PRINT_FIELD(arrayLayers);
+ PRINT_FIELD_NAMED(depthGreaterThanOne, "depth > 1");
+ PRINT_FIELD_NAMED(mipLevelsGreaterThanOne, "mipLevels > 1");
+ PRINT_FIELD_NAMED(arrayLayersGreaterThanOne, "arrayLayers > 1");
+ PRINT_FIELD(samples);
+ PRINT_FIELD(tiling);
+ PRINT_FIELD(usage);
+ PRINT_FIELD(sharingMode);
+ PRINT_FIELD(initialLayout);
+ }
+};
+
+struct VmaAllocationCreateInfoStats : public StructureStats
+{
+ FlagSet flags;
+ Enum usage;
+ FlagSet requiredFlags, preferredFlags;
+ Flag requiredFlagsNotZero, preferredFlagsNotZero;
+ BitMask<uint32_t> memoryTypeBits;
+ Flag poolNotNull;
+ Flag userDataNotNull;
+
+ VmaAllocationCreateInfoStats() :
+ flags(VMA_ALLOCATION_CREATE_FLAG_COUNT, VMA_ALLOCATION_CREATE_FLAG_NAMES, VMA_ALLOCATION_CREATE_FLAG_VALUES),
+ usage(VMA_MEMORY_USAGE_COUNT, VMA_MEMORY_USAGE_NAMES),
+ requiredFlags(VK_MEMORY_PROPERTY_FLAG_COUNT, VK_MEMORY_PROPERTY_FLAG_NAMES, VK_MEMORY_PROPERTY_FLAG_VALUES),
+ preferredFlags(VK_MEMORY_PROPERTY_FLAG_COUNT, VK_MEMORY_PROPERTY_FLAG_NAMES, VK_MEMORY_PROPERTY_FLAG_VALUES)
+ {
+ }
+
+ void PostValue(const VmaAllocationCreateInfo& v, size_t count = 1)
+ {
+ totalCount += (uint32_t)count;
+
+ for(size_t i = 0; i < count; ++i)
+ {
+ flags.PostValue(v.flags);
+ usage.PostValue(v.usage);
+ requiredFlags.PostValue(v.requiredFlags);
+ preferredFlags.PostValue(v.preferredFlags);
+ requiredFlagsNotZero.PostValue(v.requiredFlags != 0);
+ preferredFlagsNotZero.PostValue(v.preferredFlags != 0);
+ memoryTypeBits.PostValue(v.memoryTypeBits);
+ poolNotNull.PostValue(v.pool != VK_NULL_HANDLE);
+ userDataNotNull.PostValue(v.pUserData != nullptr);
+ }
+ }
+
+ void Print() const
+ {
+ if(totalCount == 0)
+ {
+ return;
+ }
+
+ printf("VmaAllocationCreateInfo (%u):\n", totalCount);
+
+ PRINT_FIELD(flags);
+ PRINT_FIELD(usage);
+ PRINT_FIELD(requiredFlags);
+ PRINT_FIELD(preferredFlags);
+ PRINT_FIELD_NAMED(requiredFlagsNotZero, "requiredFlags != 0");
+ PRINT_FIELD_NAMED(preferredFlagsNotZero, "preferredFlags != 0");
+ PRINT_FIELD(memoryTypeBits);
+ PRINT_FIELD_NAMED(poolNotNull, "pool != VK_NULL_HANDLE");
+ PRINT_FIELD_NAMED(userDataNotNull, "pUserData != nullptr");
+ }
+};
+
+struct VmaAllocateMemoryPagesStats : public StructureStats
+{
+ MinMaxAvg<size_t> allocationCount;
+
+ void PostValue(size_t allocationCount)
+ {
+ this->allocationCount.PostValue(allocationCount);
+ }
+
+ void Print() const
+ {
+ if(totalCount == 0)
+ {
+ return;
+ }
+
+ printf("vmaAllocateMemoryPages (%u):\n", totalCount);
+
+ PRINT_FIELD(allocationCount);
+ }
+};
+
+struct VmaDefragmentationInfo2Stats : public StructureStats
+{
+ BitMask<VkDeviceSize> maxCpuBytesToMove;
+ BitMask<uint32_t> maxCpuAllocationsToMove;
+ BitMask<VkDeviceSize> maxGpuBytesToMove;
+ BitMask<uint32_t> maxGpuAllocationsToMove;
+ Flag commandBufferNotNull;
+ MinMaxAvg<uint32_t> allocationCount;
+ Flag allocationCountNotZero;
+ MinMaxAvg<uint32_t> poolCount;
+ Flag poolCountNotZero;
+
+ void PostValue(const VmaDefragmentationInfo2& info)
+ {
+ ++totalCount;
+
+ maxCpuBytesToMove.PostValue(info.maxCpuBytesToMove);
+ maxCpuAllocationsToMove.PostValue(info.maxCpuAllocationsToMove);
+ maxGpuBytesToMove.PostValue(info.maxGpuBytesToMove);
+ maxGpuAllocationsToMove.PostValue(info.maxGpuAllocationsToMove);
+ commandBufferNotNull.PostValue(info.commandBuffer != VK_NULL_HANDLE);
+ allocationCount.PostValue(info.allocationCount);
+ allocationCountNotZero.PostValue(info.allocationCount != 0);
+ poolCount.PostValue(info.poolCount);
+ poolCountNotZero.PostValue(info.poolCount != 0);
+ }
+
+ void Print() const
+ {
+ if(totalCount == 0)
+ {
+ return;
+ }
+
+ printf("VmaDefragmentationInfo2 (%u):\n", totalCount);
+
+ PRINT_FIELD(maxCpuBytesToMove);
+ PRINT_FIELD(maxCpuAllocationsToMove);
+ PRINT_FIELD(maxGpuBytesToMove);
+ PRINT_FIELD(maxGpuAllocationsToMove);
+ PRINT_FIELD_NAMED(commandBufferNotNull, "commandBuffer != VK_NULL_HANDLE");
+ PRINT_FIELD(allocationCount);
+ PRINT_FIELD_NAMED(allocationCountNotZero, "allocationCount > 0");
+ PRINT_FIELD(poolCount);
+ PRINT_FIELD_NAMED(poolCountNotZero, "poolCount > 0");
+ }
+};
+
+#undef PRINT_FIELD_NAMED
+#undef PRINT_FIELD
+
+} // namespace DetailedStats
// Set this to false to disable deleting leaked VmaAllocation, VmaPool objects
// and let VMA report asserts about them.
@@ -196,19 +726,24 @@
Statistics();
void Init(uint32_t memHeapCount, uint32_t memTypeCount);
void PrintMemStats() const;
+ void PrintDetailedStats() const;
const size_t* GetFunctionCallCount() const { return m_FunctionCallCount; }
size_t GetImageCreationCount(uint32_t imgClass) const { return m_ImageCreationCount[imgClass]; }
size_t GetLinearImageCreationCount() const { return m_LinearImageCreationCount; }
size_t GetBufferCreationCount(uint32_t bufClass) const { return m_BufferCreationCount[bufClass]; }
- size_t GetAllocationCreationCount() const { return m_AllocationCreationCount; }
- size_t GetPoolCreationCount() const { return m_PoolCreationCount; }
+ size_t GetAllocationCreationCount() const { return (size_t)m_VmaAllocationCreateInfo.totalCount + m_CreateLostAllocationCount; }
+ size_t GetPoolCreationCount() const { return m_VmaPoolCreateInfo.totalCount; }
+ size_t GetBufferCreationCount() const { return (size_t)m_VkBufferCreateInfo.totalCount; }
void RegisterFunctionCall(VMA_FUNCTION func);
- void RegisterCreateImage(uint32_t usage, uint32_t tiling);
- void RegisterCreateBuffer(uint32_t usage);
- void RegisterCreatePool();
- void RegisterCreateAllocation(size_t allocCount = 1);
+ void RegisterCreateImage(const VkImageCreateInfo& info);
+ void RegisterCreateBuffer(const VkBufferCreateInfo& info);
+ void RegisterCreatePool(const VmaPoolCreateInfo& info);
+ void RegisterCreateAllocation(const VmaAllocationCreateInfo& info, size_t allocCount = 1);
+ void RegisterCreateLostAllocation() { ++m_CreateLostAllocationCount; }
+ void RegisterAllocateMemoryPages(size_t allocCount) { m_VmaAllocateMemoryPages.PostValue(allocCount); }
+ void RegisterDefragmentation(const VmaDefragmentationInfo2& info);
void UpdateMemStats(const VmaStats& currStats);
@@ -220,8 +755,6 @@
size_t m_ImageCreationCount[4] = { };
size_t m_LinearImageCreationCount = 0;
size_t m_BufferCreationCount[4] = { };
- size_t m_AllocationCreationCount = 0; // Also includes buffers and images, and lost allocations.
- size_t m_PoolCreationCount = 0;
// Structure similar to VmaStatInfo, but not the same.
struct MemStatInfo
@@ -240,6 +773,14 @@
MemStatInfo total;
} m_PeakMemStats;
+ DetailedStats::VmaPoolCreateInfoStats m_VmaPoolCreateInfo;
+ DetailedStats::VkBufferCreateInfoStats m_VkBufferCreateInfo;
+ DetailedStats::VkImageCreateInfoStats m_VkImageCreateInfo;
+ DetailedStats::VmaAllocationCreateInfoStats m_VmaAllocationCreateInfo;
+ size_t m_CreateLostAllocationCount = 0;
+ DetailedStats::VmaAllocateMemoryPagesStats m_VmaAllocateMemoryPages;
+ DetailedStats::VmaDefragmentationInfo2Stats m_VmaDefragmentationInfo2;
+
void UpdateMemStatInfo(MemStatInfo& inoutPeakInfo, const VmaStatInfo& currInfo);
static void PrintMemStatInfo(const MemStatInfo& info);
};
@@ -346,40 +887,55 @@
}
}
+void Statistics::PrintDetailedStats() const
+{
+ m_VmaPoolCreateInfo.Print();
+ m_VmaAllocationCreateInfo.Print();
+ m_VmaAllocateMemoryPages.Print();
+ m_VkBufferCreateInfo.Print();
+ m_VkImageCreateInfo.Print();
+ m_VmaDefragmentationInfo2.Print();
+}
+
void Statistics::RegisterFunctionCall(VMA_FUNCTION func)
{
++m_FunctionCallCount[(size_t)func];
}
-void Statistics::RegisterCreateImage(uint32_t usage, uint32_t tiling)
+void Statistics::RegisterCreateImage(const VkImageCreateInfo& info)
{
- if(tiling == VK_IMAGE_TILING_LINEAR)
+ if(info.tiling == VK_IMAGE_TILING_LINEAR)
++m_LinearImageCreationCount;
else
{
- const uint32_t imgClass = ImageUsageToClass(usage);
+ const uint32_t imgClass = ImageUsageToClass(info.usage);
++m_ImageCreationCount[imgClass];
}
- ++m_AllocationCreationCount;
+ m_VkImageCreateInfo.PostValue(info);
}
-void Statistics::RegisterCreateBuffer(uint32_t usage)
+void Statistics::RegisterCreateBuffer(const VkBufferCreateInfo& info)
{
- const uint32_t bufClass = BufferUsageToClass(usage);
+ const uint32_t bufClass = BufferUsageToClass(info.usage);
++m_BufferCreationCount[bufClass];
- ++m_AllocationCreationCount;
+ m_VkBufferCreateInfo.PostValue(info);
}
-void Statistics::RegisterCreatePool()
+void Statistics::RegisterCreatePool(const VmaPoolCreateInfo& info)
{
- ++m_PoolCreationCount;
+ m_VmaPoolCreateInfo.PostValue(info);
}
-void Statistics::RegisterCreateAllocation(size_t allocCount)
+void Statistics::RegisterCreateAllocation(const VmaAllocationCreateInfo& info, size_t allocCount)
{
- m_AllocationCreationCount += allocCount;
+ m_VmaAllocationCreateInfo.PostValue(info, allocCount);
+}
+
+void Statistics::RegisterDefragmentation(const VmaDefragmentationInfo2& info)
+{
+ m_VmaDefragmentationInfo2.PostValue(info);
}
void Statistics::UpdateMemStats(const VmaStats& currStats)
@@ -1885,14 +2441,9 @@
}
// Buffers
- const size_t bufferCreationCount =
- m_Stats.GetBufferCreationCount(0) +
- m_Stats.GetBufferCreationCount(1) +
- m_Stats.GetBufferCreationCount(2) +
- m_Stats.GetBufferCreationCount(3);
- if(bufferCreationCount > 0)
+ if(m_Stats.GetBufferCreationCount())
{
- printf(" Total buffers created: %zu\n", bufferCreationCount);
+ printf(" Total buffers created: %zu\n", m_Stats.GetBufferCreationCount());
if(g_Verbosity == VERBOSITY::MAXIMUM)
{
printf(" Class 0 (indirect/vertex/index): %zu\n", m_Stats.GetBufferCreationCount(0));
@@ -1972,6 +2523,12 @@
}
}
+ // Detailed stats
+ if(g_Verbosity == VERBOSITY::MAXIMUM)
+ {
+ m_Stats.PrintDetailedStats();
+ }
+
if(g_MemStatsEnabled)
{
m_Stats.PrintMemStats();
@@ -2063,7 +2620,7 @@
StrRangeToUint(csvSplit.GetRange(FIRST_PARAM_INDEX + 5), poolCreateInfo.frameInUseCount) &&
StrRangeToPtr(csvSplit.GetRange(FIRST_PARAM_INDEX + 6), origPtr))
{
- m_Stats.RegisterCreatePool();
+ m_Stats.RegisterCreatePool(poolCreateInfo);
Pool poolDesc = {};
VkResult res = vmaCreatePool(m_Allocator, &poolCreateInfo, &poolDesc.pool);
@@ -2242,9 +2799,6 @@
{
FindPool(lineNumber, origPool, allocCreateInfo.pool);
- // Forcing VK_SHARING_MODE_EXCLUSIVE because we use only one queue anyway.
- bufCreateInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
-
if(csvSplit.GetCount() > FIRST_PARAM_INDEX + 11)
{
PrepareUserData(
@@ -2255,7 +2809,11 @@
allocCreateInfo.pUserData);
}
- m_Stats.RegisterCreateBuffer(bufCreateInfo.usage);
+ m_Stats.RegisterCreateBuffer(bufCreateInfo);
+ m_Stats.RegisterCreateAllocation(allocCreateInfo);
+
+ // Forcing VK_SHARING_MODE_EXCLUSIVE because we use only one queue anyway.
+ bufCreateInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
Allocation allocDesc = { };
allocDesc.allocationFlags = allocCreateInfo.flags;
@@ -2379,9 +2937,6 @@
{
FindPool(lineNumber, origPool, allocCreateInfo.pool);
- // Forcing VK_SHARING_MODE_EXCLUSIVE because we use only one queue anyway.
- imageCreateInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
-
if(csvSplit.GetCount() > FIRST_PARAM_INDEX + 20)
{
PrepareUserData(
@@ -2392,7 +2947,11 @@
allocCreateInfo.pUserData);
}
- m_Stats.RegisterCreateImage(imageCreateInfo.usage, imageCreateInfo.tiling);
+ m_Stats.RegisterCreateImage(imageCreateInfo);
+ m_Stats.RegisterCreateAllocation(allocCreateInfo);
+
+ // Forcing VK_SHARING_MODE_EXCLUSIVE because we use only one queue anyway.
+ imageCreateInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
Allocation allocDesc = {};
allocDesc.allocationFlags = allocCreateInfo.flags;
@@ -2470,7 +3029,7 @@
Allocation allocDesc = {};
vmaCreateLostAllocation(m_Allocator, &allocDesc.allocation);
UpdateMemStats();
- m_Stats.RegisterCreateAllocation();
+ m_Stats.RegisterCreateLostAllocation();
AddAllocation(lineNumber, origPtr, VK_SUCCESS, "vmaCreateLostAllocation", std::move(allocDesc));
}
@@ -2519,7 +3078,7 @@
}
UpdateMemStats();
- m_Stats.RegisterCreateAllocation();
+ m_Stats.RegisterCreateAllocation(allocCreateInfo);
Allocation allocDesc = {};
allocDesc.allocationFlags = allocCreateInfo.flags;
@@ -2574,7 +3133,8 @@
}
UpdateMemStats();
- m_Stats.RegisterCreateAllocation(allocCount);
+ m_Stats.RegisterCreateAllocation(allocCreateInfo, allocCount);
+ m_Stats.RegisterAllocateMemoryPages(allocCount);
std::vector<VmaAllocation> allocations(allocCount);
@@ -2645,6 +3205,9 @@
allocCreateInfo.pUserData);
}
+ UpdateMemStats();
+ m_Stats.RegisterCreateAllocation(allocCreateInfo);
+
if(requiresDedicatedAllocation || prefersDedicatedAllocation)
{
allocCreateInfo.flags |= VMA_ALLOCATION_CREATE_DEDICATED_MEMORY_BIT;
@@ -2659,9 +3222,6 @@
m_AllocateForBufferImageWarningIssued = true;
}
- UpdateMemStats();
- m_Stats.RegisterCreateAllocation();
-
Allocation allocDesc = {};
allocDesc.allocationFlags = allocCreateInfo.flags;
VkResult res = vmaAllocateMemory(m_Allocator, &memReq, &allocCreateInfo, &allocDesc.allocation, nullptr);
@@ -3118,6 +3678,8 @@
}
}
+ m_Stats.RegisterDefragmentation(defragInfo);
+
VmaDefragmentationContext defragCtx = nullptr;
VkResult res = vmaDefragmentationBegin(m_Allocator, &defragInfo, nullptr, &defragCtx);
@@ -3251,7 +3813,6 @@
" --DefragmentAfterLine <Line> - Defragment memory after specified source file line and print statistics.\n"
" It also prints detailed statistics to files VmaReplay_Line####_Defragment*.json\n"
" --DefragmentationFlags <Flags> - Flags to be applied when using DefragmentAfterLine.\n"
- " E.g. 1 for FAST algorithm, 2 for OPTIMAL algorithm.\n"
" --Lines <Ranges> - Replay only limited set of lines from file\n"
" Ranges is comma-separated list of ranges, e.g. \"-10,15,18-25,31-\".\n"
" --PhysicalDevice <Index> - Choice of Vulkan physical device. Default: 0.\n"