vkinfo.cpp revision 04f4f4746481571148eaf3aaf768ee5c6dccec9d
1#include <stdlib.h>
2#include <vector>
3
4#define VK_PROTOTYPES
5#include <vulkan/vulkan.h>
6
7#define LOG_TAG "vkinfo"
8#include <log/log.h>
9
10namespace {
11
12[[noreturn]] void die(const char* proc, VkResult result) {
13    const char* result_str;
14    switch (result) {
15        // clang-format off
16        case VK_SUCCESS: result_str = "VK_SUCCESS"; break;
17        case VK_UNSUPPORTED: result_str = "VK_UNSUPPORTED"; break;
18        case VK_NOT_READY: result_str = "VK_NOT_READY"; break;
19        case VK_TIMEOUT: result_str = "VK_TIMEOUT"; break;
20        case VK_EVENT_SET: result_str = "VK_EVENT_SET"; break;
21        case VK_EVENT_RESET: result_str = "VK_EVENT_RESET"; break;
22        case VK_INCOMPLETE: result_str = "VK_INCOMPLETE"; break;
23        case VK_ERROR_UNKNOWN: result_str = "VK_ERROR_UNKNOWN"; break;
24        case VK_ERROR_UNAVAILABLE: result_str = "VK_ERROR_UNAVAILABLE"; break;
25        case VK_ERROR_INITIALIZATION_FAILED: result_str = "VK_ERROR_INITIALIZATION_FAILED"; break;
26        case VK_ERROR_OUT_OF_HOST_MEMORY: result_str = "VK_ERROR_OUT_OF_HOST_MEMORY"; break;
27        case VK_ERROR_OUT_OF_DEVICE_MEMORY: result_str = "VK_ERROR_OUT_OF_DEVICE_MEMORY"; break;
28        case VK_ERROR_DEVICE_ALREADY_CREATED: result_str = "VK_ERROR_DEVICE_ALREADY_CREATED"; break;
29        case VK_ERROR_DEVICE_LOST: result_str = "VK_ERROR_DEVICE_LOST"; break;
30        case VK_ERROR_INVALID_POINTER: result_str = "VK_ERROR_INVALID_POINTER"; break;
31        case VK_ERROR_INVALID_VALUE: result_str = "VK_ERROR_INVALID_VALUE"; break;
32        case VK_ERROR_INVALID_HANDLE: result_str = "VK_ERROR_INVALID_HANDLE"; break;
33        case VK_ERROR_INVALID_ORDINAL: result_str = "VK_ERROR_INVALID_ORDINAL"; break;
34        case VK_ERROR_INVALID_MEMORY_SIZE: result_str = "VK_ERROR_INVALID_MEMORY_SIZE"; break;
35        case VK_ERROR_INVALID_EXTENSION: result_str = "VK_ERROR_INVALID_EXTENSION"; break;
36        case VK_ERROR_INVALID_FLAGS: result_str = "VK_ERROR_INVALID_FLAGS"; break;
37        case VK_ERROR_INVALID_ALIGNMENT: result_str = "VK_ERROR_INVALID_ALIGNMENT"; break;
38        case VK_ERROR_INVALID_FORMAT: result_str = "VK_ERROR_INVALID_FORMAT"; break;
39        case VK_ERROR_INVALID_IMAGE: result_str = "VK_ERROR_INVALID_IMAGE"; break;
40        case VK_ERROR_INVALID_DESCRIPTOR_SET_DATA: result_str = "VK_ERROR_INVALID_DESCRIPTOR_SET_DATA"; break;
41        case VK_ERROR_INVALID_QUEUE_TYPE: result_str = "VK_ERROR_INVALID_QUEUE_TYPE"; break;
42        case VK_ERROR_UNSUPPORTED_SHADER_IL_VERSION: result_str = "VK_ERROR_UNSUPPORTED_SHADER_IL_VERSION"; break;
43        case VK_ERROR_BAD_SHADER_CODE: result_str = "VK_ERROR_BAD_SHADER_CODE"; break;
44        case VK_ERROR_BAD_PIPELINE_DATA: result_str = "VK_ERROR_BAD_PIPELINE_DATA"; break;
45        case VK_ERROR_NOT_MAPPABLE: result_str = "VK_ERROR_NOT_MAPPABLE"; break;
46        case VK_ERROR_MEMORY_MAP_FAILED: result_str = "VK_ERROR_MEMORY_MAP_FAILED"; break;
47        case VK_ERROR_MEMORY_UNMAP_FAILED: result_str = "VK_ERROR_MEMORY_UNMAP_FAILED"; break;
48        case VK_ERROR_INCOMPATIBLE_DEVICE: result_str = "VK_ERROR_INCOMPATIBLE_DEVICE"; break;
49        case VK_ERROR_INCOMPATIBLE_DRIVER: result_str = "VK_ERROR_INCOMPATIBLE_DRIVER"; break;
50        case VK_ERROR_INCOMPLETE_COMMAND_BUFFER: result_str = "VK_ERROR_INCOMPLETE_COMMAND_BUFFER"; break;
51        case VK_ERROR_BUILDING_COMMAND_BUFFER: result_str = "VK_ERROR_BUILDING_COMMAND_BUFFER"; break;
52        case VK_ERROR_MEMORY_NOT_BOUND: result_str = "VK_ERROR_MEMORY_NOT_BOUND"; break;
53        case VK_ERROR_INCOMPATIBLE_QUEUE: result_str = "VK_ERROR_INCOMPATIBLE_QUEUE"; break;
54        case VK_ERROR_INVALID_LAYER: result_str = "VK_ERROR_INVALID_LAYER"; break;
55        default: result_str = "<unknown VkResult>"; break;
56            // clang-format on
57    }
58    fprintf(stderr, "%s failed: %s (%d)\n", proc, result_str, result);
59    exit(1);
60}
61
62const char* VkPhysicalDeviceTypeStr(VkPhysicalDeviceType type) {
63    switch (type) {
64        case VK_PHYSICAL_DEVICE_TYPE_OTHER:
65            return "OTHER";
66        case VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU:
67            return "INTEGRATED_GPU";
68        case VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU:
69            return "DISCRETE_GPU";
70        case VK_PHYSICAL_DEVICE_TYPE_VIRTUAL_GPU:
71            return "VIRTUAL_GPU";
72        case VK_PHYSICAL_DEVICE_TYPE_CPU:
73            return "CPU";
74        default:
75            return "<UNKNOWN>";
76    }
77}
78
79void DumpPhysicalDevice(uint32_t idx, VkPhysicalDevice pdev) {
80    VkResult result;
81
82    VkPhysicalDeviceProperties props;
83    result = vkGetPhysicalDeviceProperties(pdev, &props);
84    if (result != VK_SUCCESS)
85        die("vkGetPhysicalDeviceProperties", result);
86    printf("  %u: \"%s\" (%s) %u.%u.%u/%#x [%04x:%04x]\n", idx,
87           props.deviceName, VkPhysicalDeviceTypeStr(props.deviceType),
88           (props.apiVersion >> 22) & 0x3FF, (props.apiVersion >> 12) & 0x3FF,
89           (props.apiVersion >> 0) & 0xFFF, props.driverVersion, props.vendorId,
90           props.deviceId);
91}
92
93}  // namespace
94
95int main(int /*argc*/, char const* /*argv*/ []) {
96    VkResult result;
97
98    VkInstance instance;
99    const VkInstanceCreateInfo create_info = {
100        .sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO,
101        .pNext = nullptr,
102        .pAppInfo = nullptr,
103        .pAllocCb = nullptr,
104        .layerCount = 0,
105        .ppEnabledLayerNames = nullptr,
106        .extensionCount = 0,
107        .ppEnabledExtensionNames = nullptr,
108    };
109    result = vkCreateInstance(&create_info, &instance);
110    if (result != VK_SUCCESS)
111        die("vkCreateInstance", result);
112
113    uint32_t num_physical_devices;
114    result =
115        vkEnumeratePhysicalDevices(instance, &num_physical_devices, nullptr);
116    if (result != VK_SUCCESS)
117        die("vkEnumeratePhysicalDevices (count)", result);
118    std::vector<VkPhysicalDevice> physical_devices(num_physical_devices,
119                                                   VK_NULL_HANDLE);
120    result = vkEnumeratePhysicalDevices(instance, &num_physical_devices,
121                                        physical_devices.data());
122    if (result != VK_SUCCESS)
123        die("vkEnumeratePhysicalDevices (data)", result);
124    if (num_physical_devices != physical_devices.size()) {
125        fprintf(stderr,
126                "number of physical devices decreased from %zu to %u!\n",
127                physical_devices.size(), num_physical_devices);
128        physical_devices.resize(num_physical_devices);
129    }
130    printf("PhysicalDevices:\n");
131    for (uint32_t i = 0; i < physical_devices.size(); i++)
132        DumpPhysicalDevice(i, physical_devices[i]);
133
134    result = vkDestroyInstance(instance);
135    if (result != VK_SUCCESS)
136        die("vkDestroyInstance", result);
137
138    return 0;
139}
140