1d02edcbb40d476b6d3b5ae279a6ccef786be8848Jesse Hall/* 2d02edcbb40d476b6d3b5ae279a6ccef786be8848Jesse Hall * Copyright 2015 The Android Open Source Project 3d02edcbb40d476b6d3b5ae279a6ccef786be8848Jesse Hall * 4d02edcbb40d476b6d3b5ae279a6ccef786be8848Jesse Hall * Licensed under the Apache License, Version 2.0 (the "License"); 5d02edcbb40d476b6d3b5ae279a6ccef786be8848Jesse Hall * you may not use this file except in compliance with the License. 6d02edcbb40d476b6d3b5ae279a6ccef786be8848Jesse Hall * You may obtain a copy of the License at 7d02edcbb40d476b6d3b5ae279a6ccef786be8848Jesse Hall * 8d02edcbb40d476b6d3b5ae279a6ccef786be8848Jesse Hall * http://www.apache.org/licenses/LICENSE-2.0 9d02edcbb40d476b6d3b5ae279a6ccef786be8848Jesse Hall * 10d02edcbb40d476b6d3b5ae279a6ccef786be8848Jesse Hall * Unless required by applicable law or agreed to in writing, software 11d02edcbb40d476b6d3b5ae279a6ccef786be8848Jesse Hall * distributed under the License is distributed on an "AS IS" BASIS, 12d02edcbb40d476b6d3b5ae279a6ccef786be8848Jesse Hall * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d02edcbb40d476b6d3b5ae279a6ccef786be8848Jesse Hall * See the License for the specific language governing permissions and 14d02edcbb40d476b6d3b5ae279a6ccef786be8848Jesse Hall * limitations under the License. 15d02edcbb40d476b6d3b5ae279a6ccef786be8848Jesse Hall */ 16d02edcbb40d476b6d3b5ae279a6ccef786be8848Jesse Hall 174da3bd68ab085b1e07304e64d3deada3dac994e0Jesse Hall#include <algorithm> 184da3bd68ab085b1e07304e64d3deada3dac994e0Jesse Hall#include <array> 1973ab0acc1990326b4e51b675f4b2b44b6366c0a7Jesse Hall#include <inttypes.h> 2004f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall#include <stdlib.h> 211f91d390ac013ea2514a67e12ddb083119d636d7Jesse Hall#include <sstream> 2204f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall#include <vector> 2304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall 2404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall#include <vulkan/vulkan.h> 2504f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall 2604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall#define LOG_TAG "vkinfo" 2704f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall#include <log/log.h> 2804f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall 2904f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hallnamespace { 3004f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall 31d0bba376a4a04f5ada451090ec65ffa8641724acChia-I Wustruct Options { 32d0bba376a4a04f5ada451090ec65ffa8641724acChia-I Wu bool layer_description; 33d0bba376a4a04f5ada451090ec65ffa8641724acChia-I Wu bool layer_extensions; 34f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall bool unsupported_features; 35d0bba376a4a04f5ada451090ec65ffa8641724acChia-I Wu bool validate; 36d0bba376a4a04f5ada451090ec65ffa8641724acChia-I Wu}; 37d0bba376a4a04f5ada451090ec65ffa8641724acChia-I Wu 3809559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hallstruct GpuInfo { 3909559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall VkPhysicalDeviceProperties properties; 4009559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall VkPhysicalDeviceMemoryProperties memory; 41b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall VkPhysicalDeviceFeatures features; 4209559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall std::vector<VkQueueFamilyProperties> queue_families; 436e4ab316ba910c70a25c5264b3edabb759819098Jesse Hall std::vector<VkExtensionProperties> extensions; 446e4ab316ba910c70a25c5264b3edabb759819098Jesse Hall std::vector<VkLayerProperties> layers; 456e4ab316ba910c70a25c5264b3edabb759819098Jesse Hall std::vector<std::vector<VkExtensionProperties>> layer_extensions; 4609559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall}; 4709559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hallstruct VulkanInfo { 4809559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall std::vector<VkExtensionProperties> extensions; 4909559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall std::vector<VkLayerProperties> layers; 5009559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall std::vector<std::vector<VkExtensionProperties>> layer_extensions; 5109559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall std::vector<GpuInfo> gpus; 5209559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall}; 5309559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall 5409559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall// ---------------------------------------------------------------------------- 5509559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall 5604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall[[noreturn]] void die(const char* proc, VkResult result) { 5704f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall const char* result_str; 5804f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall switch (result) { 5904f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall // clang-format off 6004f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall case VK_SUCCESS: result_str = "VK_SUCCESS"; break; 6104f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall case VK_NOT_READY: result_str = "VK_NOT_READY"; break; 6204f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall case VK_TIMEOUT: result_str = "VK_TIMEOUT"; break; 6304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall case VK_EVENT_SET: result_str = "VK_EVENT_SET"; break; 6404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall case VK_EVENT_RESET: result_str = "VK_EVENT_RESET"; break; 6504f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall case VK_INCOMPLETE: result_str = "VK_INCOMPLETE"; break; 6604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall case VK_ERROR_OUT_OF_HOST_MEMORY: result_str = "VK_ERROR_OUT_OF_HOST_MEMORY"; break; 6704f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall case VK_ERROR_OUT_OF_DEVICE_MEMORY: result_str = "VK_ERROR_OUT_OF_DEVICE_MEMORY"; break; 685ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall case VK_ERROR_INITIALIZATION_FAILED: result_str = "VK_ERROR_INITIALIZATION_FAILED"; break; 6904f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall case VK_ERROR_DEVICE_LOST: result_str = "VK_ERROR_DEVICE_LOST"; break; 7004f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall case VK_ERROR_MEMORY_MAP_FAILED: result_str = "VK_ERROR_MEMORY_MAP_FAILED"; break; 715ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall case VK_ERROR_LAYER_NOT_PRESENT: result_str = "VK_ERROR_LAYER_NOT_PRESENT"; break; 725ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall case VK_ERROR_EXTENSION_NOT_PRESENT: result_str = "VK_ERROR_EXTENSION_NOT_PRESENT"; break; 7304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall case VK_ERROR_INCOMPATIBLE_DRIVER: result_str = "VK_ERROR_INCOMPATIBLE_DRIVER"; break; 7404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall default: result_str = "<unknown VkResult>"; break; 7504f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall // clang-format on 7604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall } 7704f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall fprintf(stderr, "%s failed: %s (%d)\n", proc, result_str, result); 7804f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall exit(1); 7904f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall} 8004f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall 814da3bd68ab085b1e07304e64d3deada3dac994e0Jesse Hallbool HasExtension(const std::vector<VkExtensionProperties>& extensions, 824da3bd68ab085b1e07304e64d3deada3dac994e0Jesse Hall const char* name) { 834da3bd68ab085b1e07304e64d3deada3dac994e0Jesse Hall return std::find_if(extensions.cbegin(), extensions.cend(), 844da3bd68ab085b1e07304e64d3deada3dac994e0Jesse Hall [=](const VkExtensionProperties& prop) { 854da3bd68ab085b1e07304e64d3deada3dac994e0Jesse Hall return strcmp(prop.extensionName, name) == 0; 864da3bd68ab085b1e07304e64d3deada3dac994e0Jesse Hall }) != extensions.end(); 874da3bd68ab085b1e07304e64d3deada3dac994e0Jesse Hall} 884da3bd68ab085b1e07304e64d3deada3dac994e0Jesse Hall 8909559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hallvoid EnumerateInstanceExtensions( 9009559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall const char* layer_name, 9109559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall std::vector<VkExtensionProperties>* extensions) { 9209559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall VkResult result; 9309559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall uint32_t count; 9409559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall result = 9509559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall vkEnumerateInstanceExtensionProperties(layer_name, &count, nullptr); 9609559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall if (result != VK_SUCCESS) 9709559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall die("vkEnumerateInstanceExtensionProperties (count)", result); 9809559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall do { 9909559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall extensions->resize(count); 10009559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall result = vkEnumerateInstanceExtensionProperties(layer_name, &count, 10109559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall extensions->data()); 10209559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall } while (result == VK_INCOMPLETE); 10309559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall if (result != VK_SUCCESS) 10409559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall die("vkEnumerateInstanceExtensionProperties (data)", result); 10509559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall} 10609559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall 1076e4ab316ba910c70a25c5264b3edabb759819098Jesse Hallvoid EnumerateDeviceExtensions(VkPhysicalDevice gpu, 1086e4ab316ba910c70a25c5264b3edabb759819098Jesse Hall const char* layer_name, 1096e4ab316ba910c70a25c5264b3edabb759819098Jesse Hall std::vector<VkExtensionProperties>* extensions) { 1106e4ab316ba910c70a25c5264b3edabb759819098Jesse Hall VkResult result; 1116e4ab316ba910c70a25c5264b3edabb759819098Jesse Hall uint32_t count; 1126e4ab316ba910c70a25c5264b3edabb759819098Jesse Hall result = 1136e4ab316ba910c70a25c5264b3edabb759819098Jesse Hall vkEnumerateDeviceExtensionProperties(gpu, layer_name, &count, nullptr); 1146e4ab316ba910c70a25c5264b3edabb759819098Jesse Hall if (result != VK_SUCCESS) 1156e4ab316ba910c70a25c5264b3edabb759819098Jesse Hall die("vkEnumerateDeviceExtensionProperties (count)", result); 1166e4ab316ba910c70a25c5264b3edabb759819098Jesse Hall do { 1176e4ab316ba910c70a25c5264b3edabb759819098Jesse Hall extensions->resize(count); 1186e4ab316ba910c70a25c5264b3edabb759819098Jesse Hall result = vkEnumerateDeviceExtensionProperties(gpu, layer_name, &count, 1196e4ab316ba910c70a25c5264b3edabb759819098Jesse Hall extensions->data()); 1206e4ab316ba910c70a25c5264b3edabb759819098Jesse Hall } while (result == VK_INCOMPLETE); 1216e4ab316ba910c70a25c5264b3edabb759819098Jesse Hall if (result != VK_SUCCESS) 1226e4ab316ba910c70a25c5264b3edabb759819098Jesse Hall die("vkEnumerateDeviceExtensionProperties (data)", result); 1236e4ab316ba910c70a25c5264b3edabb759819098Jesse Hall} 1246e4ab316ba910c70a25c5264b3edabb759819098Jesse Hall 125d0bba376a4a04f5ada451090ec65ffa8641724acChia-I Wuvoid GatherGpuInfo(VkPhysicalDevice gpu, 126d0bba376a4a04f5ada451090ec65ffa8641724acChia-I Wu const Options &options, 127d0bba376a4a04f5ada451090ec65ffa8641724acChia-I Wu GpuInfo& info) { 128b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall VkResult result; 129b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall uint32_t count; 130b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall 131b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall vkGetPhysicalDeviceProperties(gpu, &info.properties); 132b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall vkGetPhysicalDeviceMemoryProperties(gpu, &info.memory); 133b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall vkGetPhysicalDeviceFeatures(gpu, &info.features); 134b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall 135b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall vkGetPhysicalDeviceQueueFamilyProperties(gpu, &count, nullptr); 136b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall info.queue_families.resize(count); 137b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall vkGetPhysicalDeviceQueueFamilyProperties(gpu, &count, 138b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall info.queue_families.data()); 139b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall 140b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall result = vkEnumerateDeviceLayerProperties(gpu, &count, nullptr); 141b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall if (result != VK_SUCCESS) 142b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall die("vkEnumerateDeviceLayerProperties (count)", result); 143b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall do { 144b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall info.layers.resize(count); 145b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall result = 146b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall vkEnumerateDeviceLayerProperties(gpu, &count, info.layers.data()); 147b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall } while (result == VK_INCOMPLETE); 148b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall if (result != VK_SUCCESS) 149b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall die("vkEnumerateDeviceLayerProperties (data)", result); 150b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall info.layer_extensions.resize(info.layers.size()); 151b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall 152b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall EnumerateDeviceExtensions(gpu, nullptr, &info.extensions); 153b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall for (size_t i = 0; i < info.layers.size(); i++) { 154b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall EnumerateDeviceExtensions(gpu, info.layers[i].layerName, 155b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall &info.layer_extensions[i]); 156b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall } 157b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall 158b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall const std::array<const char*, 1> kDesiredExtensions = { 159b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall {VK_KHR_SWAPCHAIN_EXTENSION_NAME}, 160b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall }; 161b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall const char* extensions[kDesiredExtensions.size()]; 162b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall uint32_t num_extensions = 0; 163b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall for (const auto& desired_ext : kDesiredExtensions) { 164b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall bool available = HasExtension(info.extensions, desired_ext); 1658955f3f76dbe7d9dace2db48627672ff0d83c1f4Chia-I Wu if (options.validate) { 1668955f3f76dbe7d9dace2db48627672ff0d83c1f4Chia-I Wu for (size_t i = 0; !available && i < info.layer_extensions.size(); 1678955f3f76dbe7d9dace2db48627672ff0d83c1f4Chia-I Wu i++) 1688955f3f76dbe7d9dace2db48627672ff0d83c1f4Chia-I Wu available = HasExtension(info.layer_extensions[i], desired_ext); 1698955f3f76dbe7d9dace2db48627672ff0d83c1f4Chia-I Wu } 170b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall if (available) 171b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall extensions[num_extensions++] = desired_ext; 172b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall } 173b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall 174b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall VkDevice device; 175ca472ab8e43efe92db30660db9997117e4b00ab9Courtney Goeltzenleuchter float queue_priorities[] = {0.0}; 176b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall const VkDeviceQueueCreateInfo queue_create_info = { 177b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall .sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO, 178b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall .queueFamilyIndex = 0, 179b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall .queueCount = 1, 180ca472ab8e43efe92db30660db9997117e4b00ab9Courtney Goeltzenleuchter queue_priorities 181b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall }; 182b1e7d59f53f794c566857784c5629ae423792ecbCourtney Goeltzenleuchter // clang-format off 183b1e7d59f53f794c566857784c5629ae423792ecbCourtney Goeltzenleuchter const char *kValidationLayers[] = { 184b1e7d59f53f794c566857784c5629ae423792ecbCourtney Goeltzenleuchter "VK_LAYER_GOOGLE_threading", 185dcad39536dda5fc88aa3ae588f535fb3edee8c62Chia-I Wu "VK_LAYER_LUNARG_parameter_validation", 186b1e7d59f53f794c566857784c5629ae423792ecbCourtney Goeltzenleuchter "VK_LAYER_LUNARG_device_limits", 187b1e7d59f53f794c566857784c5629ae423792ecbCourtney Goeltzenleuchter "VK_LAYER_LUNARG_object_tracker", 188dcad39536dda5fc88aa3ae588f535fb3edee8c62Chia-I Wu "VK_LAYER_LUNARG_image", 189dcad39536dda5fc88aa3ae588f535fb3edee8c62Chia-I Wu "VK_LAYER_LUNARG_core_validation", 190b1e7d59f53f794c566857784c5629ae423792ecbCourtney Goeltzenleuchter "VK_LAYER_LUNARG_swapchain", 191b1e7d59f53f794c566857784c5629ae423792ecbCourtney Goeltzenleuchter "VK_LAYER_GOOGLE_unique_objects" 192b1e7d59f53f794c566857784c5629ae423792ecbCourtney Goeltzenleuchter }; 193b1e7d59f53f794c566857784c5629ae423792ecbCourtney Goeltzenleuchter // clang-format on 194b1e7d59f53f794c566857784c5629ae423792ecbCourtney Goeltzenleuchter uint32_t num_layers = sizeof(kValidationLayers) / sizeof(char*); 195b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall const VkDeviceCreateInfo create_info = { 196b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall .sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, 197b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall .queueCreateInfoCount = 1, 198b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall .pQueueCreateInfos = &queue_create_info, 199b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall .enabledExtensionCount = num_extensions, 200b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall .ppEnabledExtensionNames = extensions, 201d0bba376a4a04f5ada451090ec65ffa8641724acChia-I Wu .enabledLayerCount = (options.validate) ? num_layers : 0, 202b1e7d59f53f794c566857784c5629ae423792ecbCourtney Goeltzenleuchter .ppEnabledLayerNames = kValidationLayers, 203b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall .pEnabledFeatures = &info.features, 204b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall }; 205b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall result = vkCreateDevice(gpu, &create_info, nullptr, &device); 206b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall if (result != VK_SUCCESS) 207b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall die("vkCreateDevice", result); 208b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall vkDestroyDevice(device, nullptr); 209b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall} 210b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall 211d0bba376a4a04f5ada451090ec65ffa8641724acChia-I Wuvoid GatherInfo(VulkanInfo* info, const Options& options) { 21209559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall VkResult result; 21309559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall uint32_t count; 21409559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall 21509559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall result = vkEnumerateInstanceLayerProperties(&count, nullptr); 21609559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall if (result != VK_SUCCESS) 21709559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall die("vkEnumerateInstanceLayerProperties (count)", result); 21809559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall do { 21909559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall info->layers.resize(count); 22009559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall result = 22109559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall vkEnumerateInstanceLayerProperties(&count, info->layers.data()); 22209559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall } while (result == VK_INCOMPLETE); 22309559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall if (result != VK_SUCCESS) 22409559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall die("vkEnumerateInstanceLayerProperties (data)", result); 22509559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall info->layer_extensions.resize(info->layers.size()); 22609559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall 22709559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall EnumerateInstanceExtensions(nullptr, &info->extensions); 22809559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall for (size_t i = 0; i < info->layers.size(); i++) { 22909559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall EnumerateInstanceExtensions(info->layers[i].layerName, 23009559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall &info->layer_extensions[i]); 23109559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall } 23209559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall 233ae3b70dea59236780aa909338de1ba5201603439Jesse Hall const char* kDesiredExtensions[] = { 234ae3b70dea59236780aa909338de1ba5201603439Jesse Hall VK_EXT_DEBUG_REPORT_EXTENSION_NAME, 2354da3bd68ab085b1e07304e64d3deada3dac994e0Jesse Hall }; 236ae3b70dea59236780aa909338de1ba5201603439Jesse Hall const char* 237ae3b70dea59236780aa909338de1ba5201603439Jesse Hall extensions[sizeof(kDesiredExtensions) / sizeof(kDesiredExtensions[0])]; 2384da3bd68ab085b1e07304e64d3deada3dac994e0Jesse Hall uint32_t num_extensions = 0; 2394da3bd68ab085b1e07304e64d3deada3dac994e0Jesse Hall for (const auto& desired_ext : kDesiredExtensions) { 2404da3bd68ab085b1e07304e64d3deada3dac994e0Jesse Hall bool available = HasExtension(info->extensions, desired_ext); 2418955f3f76dbe7d9dace2db48627672ff0d83c1f4Chia-I Wu if (options.validate) { 2428955f3f76dbe7d9dace2db48627672ff0d83c1f4Chia-I Wu for (size_t i = 0; !available && i < info->layer_extensions.size(); 2438955f3f76dbe7d9dace2db48627672ff0d83c1f4Chia-I Wu i++) 2448955f3f76dbe7d9dace2db48627672ff0d83c1f4Chia-I Wu available = 2458955f3f76dbe7d9dace2db48627672ff0d83c1f4Chia-I Wu HasExtension(info->layer_extensions[i], desired_ext); 2468955f3f76dbe7d9dace2db48627672ff0d83c1f4Chia-I Wu } 2474da3bd68ab085b1e07304e64d3deada3dac994e0Jesse Hall if (available) 2484da3bd68ab085b1e07304e64d3deada3dac994e0Jesse Hall extensions[num_extensions++] = desired_ext; 2494da3bd68ab085b1e07304e64d3deada3dac994e0Jesse Hall } 2504da3bd68ab085b1e07304e64d3deada3dac994e0Jesse Hall 251b1e7d59f53f794c566857784c5629ae423792ecbCourtney Goeltzenleuchter // clang-format off 252b1e7d59f53f794c566857784c5629ae423792ecbCourtney Goeltzenleuchter const char *kValidationLayers[] = { 253b1e7d59f53f794c566857784c5629ae423792ecbCourtney Goeltzenleuchter "VK_LAYER_GOOGLE_threading", 254dcad39536dda5fc88aa3ae588f535fb3edee8c62Chia-I Wu "VK_LAYER_LUNARG_parameter_validation", 255b1e7d59f53f794c566857784c5629ae423792ecbCourtney Goeltzenleuchter "VK_LAYER_LUNARG_device_limits", 256b1e7d59f53f794c566857784c5629ae423792ecbCourtney Goeltzenleuchter "VK_LAYER_LUNARG_object_tracker", 257dcad39536dda5fc88aa3ae588f535fb3edee8c62Chia-I Wu "VK_LAYER_LUNARG_image", 258dcad39536dda5fc88aa3ae588f535fb3edee8c62Chia-I Wu "VK_LAYER_LUNARG_core_validation", 259b1e7d59f53f794c566857784c5629ae423792ecbCourtney Goeltzenleuchter "VK_LAYER_LUNARG_swapchain", 260b1e7d59f53f794c566857784c5629ae423792ecbCourtney Goeltzenleuchter "VK_LAYER_GOOGLE_unique_objects" 261b1e7d59f53f794c566857784c5629ae423792ecbCourtney Goeltzenleuchter }; 262b1e7d59f53f794c566857784c5629ae423792ecbCourtney Goeltzenleuchter // clang-format on 263b1e7d59f53f794c566857784c5629ae423792ecbCourtney Goeltzenleuchter uint32_t num_layers = sizeof(kValidationLayers) / sizeof(char*); 264b1e7d59f53f794c566857784c5629ae423792ecbCourtney Goeltzenleuchter 265dc7f6a6a8703e5dd8d11da9462528fb20aeb2bd0Jesse Hall const VkApplicationInfo application_info = { 266dc7f6a6a8703e5dd8d11da9462528fb20aeb2bd0Jesse Hall .sType = VK_STRUCTURE_TYPE_APPLICATION_INFO, 267dc7f6a6a8703e5dd8d11da9462528fb20aeb2bd0Jesse Hall .pApplicationName = "vkinfo", 268dc7f6a6a8703e5dd8d11da9462528fb20aeb2bd0Jesse Hall .applicationVersion = 0, 269dc7f6a6a8703e5dd8d11da9462528fb20aeb2bd0Jesse Hall .pEngineName = "vkinfo", 270dc7f6a6a8703e5dd8d11da9462528fb20aeb2bd0Jesse Hall .engineVersion = 0, 2712676338dd692b7d1e1c276d82e6b0492db53ab2eJesse Hall .apiVersion = VK_API_VERSION_1_0, 272dc7f6a6a8703e5dd8d11da9462528fb20aeb2bd0Jesse Hall }; 27309559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall const VkInstanceCreateInfo create_info = { 27409559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall .sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, 275dc7f6a6a8703e5dd8d11da9462528fb20aeb2bd0Jesse Hall .pApplicationInfo = &application_info, 2764da3bd68ab085b1e07304e64d3deada3dac994e0Jesse Hall .enabledExtensionCount = num_extensions, 2774da3bd68ab085b1e07304e64d3deada3dac994e0Jesse Hall .ppEnabledExtensionNames = extensions, 278d0bba376a4a04f5ada451090ec65ffa8641724acChia-I Wu .enabledLayerCount = (options.validate) ? num_layers : 0, 279b1e7d59f53f794c566857784c5629ae423792ecbCourtney Goeltzenleuchter .ppEnabledLayerNames = kValidationLayers, 28009559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall }; 2814da3bd68ab085b1e07304e64d3deada3dac994e0Jesse Hall VkInstance instance; 28209559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall result = vkCreateInstance(&create_info, nullptr, &instance); 28309559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall if (result != VK_SUCCESS) 28409559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall die("vkCreateInstance", result); 28509559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall 28609559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall uint32_t num_gpus; 28709559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall result = vkEnumeratePhysicalDevices(instance, &num_gpus, nullptr); 28809559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall if (result != VK_SUCCESS) 28909559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall die("vkEnumeratePhysicalDevices (count)", result); 29009559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall std::vector<VkPhysicalDevice> gpus(num_gpus, VK_NULL_HANDLE); 29109559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall do { 29209559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall gpus.resize(num_gpus, VK_NULL_HANDLE); 29309559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall result = vkEnumeratePhysicalDevices(instance, &num_gpus, gpus.data()); 29409559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall } while (result == VK_INCOMPLETE); 29509559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall if (result != VK_SUCCESS) 29609559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall die("vkEnumeratePhysicalDevices (data)", result); 29709559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall 29809559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall info->gpus.resize(num_gpus); 299b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall for (size_t i = 0; i < gpus.size(); i++) 300d0bba376a4a04f5ada451090ec65ffa8641724acChia-I Wu GatherGpuInfo(gpus[i], options, info->gpus.at(i)); 30109559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall 30209559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall vkDestroyInstance(instance, nullptr); 30309559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall} 30409559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall 30509559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall// ---------------------------------------------------------------------------- 30609559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall 30738cb8407b96aef348531aff3d617cc0879217ecfJesse Hallconst size_t kMaxIndent = 8; 30838cb8407b96aef348531aff3d617cc0879217ecfJesse Hallconst size_t kIndentSize = 3; 30938cb8407b96aef348531aff3d617cc0879217ecfJesse Hallstd::array<char, kMaxIndent * kIndentSize + 1> kIndent; 31038cb8407b96aef348531aff3d617cc0879217ecfJesse Hallconst char* Indent(size_t n) { 31138cb8407b96aef348531aff3d617cc0879217ecfJesse Hall static bool initialized = false; 31238cb8407b96aef348531aff3d617cc0879217ecfJesse Hall if (!initialized) { 31338cb8407b96aef348531aff3d617cc0879217ecfJesse Hall kIndent.fill(' '); 31438cb8407b96aef348531aff3d617cc0879217ecfJesse Hall kIndent.back() = '\0'; 31538cb8407b96aef348531aff3d617cc0879217ecfJesse Hall initialized = true; 31638cb8407b96aef348531aff3d617cc0879217ecfJesse Hall } 31738cb8407b96aef348531aff3d617cc0879217ecfJesse Hall return kIndent.data() + 31838cb8407b96aef348531aff3d617cc0879217ecfJesse Hall (kIndent.size() - (kIndentSize * std::min(n, kMaxIndent) + 1)); 31938cb8407b96aef348531aff3d617cc0879217ecfJesse Hall} 32038cb8407b96aef348531aff3d617cc0879217ecfJesse Hall 32104f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hallconst char* VkPhysicalDeviceTypeStr(VkPhysicalDeviceType type) { 32204f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall switch (type) { 32304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall case VK_PHYSICAL_DEVICE_TYPE_OTHER: 32404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall return "OTHER"; 32504f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall case VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU: 32604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall return "INTEGRATED_GPU"; 32704f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall case VK_PHYSICAL_DEVICE_TYPE_DISCRETE_GPU: 32804f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall return "DISCRETE_GPU"; 32904f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall case VK_PHYSICAL_DEVICE_TYPE_VIRTUAL_GPU: 33004f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall return "VIRTUAL_GPU"; 33104f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall case VK_PHYSICAL_DEVICE_TYPE_CPU: 33204f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall return "CPU"; 33304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall default: 33404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall return "<UNKNOWN>"; 33504f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall } 33604f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall} 33704f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall 33809559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hallvoid PrintExtensions(const std::vector<VkExtensionProperties>& extensions, 33938cb8407b96aef348531aff3d617cc0879217ecfJesse Hall const Options& /*options*/, 34038cb8407b96aef348531aff3d617cc0879217ecfJesse Hall size_t indent) { 34109559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall for (const auto& e : extensions) 34238cb8407b96aef348531aff3d617cc0879217ecfJesse Hall printf("%s%s (v%u)\n", Indent(indent), e.extensionName, e.specVersion); 34309559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall} 344c1ab303f6fc8339d386d6cf127534677929fddfbJesse Hall 345aa410941d29cba4a3a56e90cb3f0be3f03c76ceaJesse Hallvoid PrintLayers( 346aa410941d29cba4a3a56e90cb3f0be3f03c76ceaJesse Hall const std::vector<VkLayerProperties>& layers, 347aa410941d29cba4a3a56e90cb3f0be3f03c76ceaJesse Hall const std::vector<std::vector<VkExtensionProperties>> extensions, 34838cb8407b96aef348531aff3d617cc0879217ecfJesse Hall const Options& options, 34938cb8407b96aef348531aff3d617cc0879217ecfJesse Hall size_t indent) { 350aa410941d29cba4a3a56e90cb3f0be3f03c76ceaJesse Hall for (size_t i = 0; i < layers.size(); i++) { 35138cb8407b96aef348531aff3d617cc0879217ecfJesse Hall printf("%s%s %u.%u.%u/%u\n", Indent(indent), layers[i].layerName, 352e2948d83f352b9a093252a06757f76a88f5355d3Jesse Hall VK_VERSION_MAJOR(layers[i].specVersion), 353e2948d83f352b9a093252a06757f76a88f5355d3Jesse Hall VK_VERSION_MINOR(layers[i].specVersion), 354e2948d83f352b9a093252a06757f76a88f5355d3Jesse Hall VK_VERSION_PATCH(layers[i].specVersion), 35538cb8407b96aef348531aff3d617cc0879217ecfJesse Hall layers[i].implementationVersion); 35638cb8407b96aef348531aff3d617cc0879217ecfJesse Hall if (options.layer_description) 35738cb8407b96aef348531aff3d617cc0879217ecfJesse Hall printf("%s%s\n", Indent(indent + 1), layers[i].description); 35838cb8407b96aef348531aff3d617cc0879217ecfJesse Hall if (options.layer_extensions && !extensions[i].empty()) { 35938cb8407b96aef348531aff3d617cc0879217ecfJesse Hall if (!extensions[i].empty()) { 36038cb8407b96aef348531aff3d617cc0879217ecfJesse Hall printf("%sExtensions [%zu]:\n", Indent(indent + 1), 36138cb8407b96aef348531aff3d617cc0879217ecfJesse Hall extensions[i].size()); 36238cb8407b96aef348531aff3d617cc0879217ecfJesse Hall PrintExtensions(extensions[i], options, indent + 2); 36338cb8407b96aef348531aff3d617cc0879217ecfJesse Hall } 36438cb8407b96aef348531aff3d617cc0879217ecfJesse Hall } 365aa410941d29cba4a3a56e90cb3f0be3f03c76ceaJesse Hall } 366aa410941d29cba4a3a56e90cb3f0be3f03c76ceaJesse Hall} 367aa410941d29cba4a3a56e90cb3f0be3f03c76ceaJesse Hall 368f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hallvoid PrintAllFeatures(const char* indent, 369f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall const VkPhysicalDeviceFeatures& features) { 370f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall // clang-format off 371f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall printf("%srobustBufferAccess: %s\n", indent, features.robustBufferAccess ? "YES" : "NO"); 372f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall printf("%sfullDrawIndexUint32: %s\n", indent, features.fullDrawIndexUint32 ? "YES" : "NO"); 373f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall printf("%simageCubeArray: %s\n", indent, features.imageCubeArray ? "YES" : "NO"); 374f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall printf("%sindependentBlend: %s\n", indent, features.independentBlend ? "YES" : "NO"); 375f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall printf("%sgeometryShader: %s\n", indent, features.geometryShader ? "YES" : "NO"); 376f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall printf("%stessellationShader: %s\n", indent, features.tessellationShader ? "YES" : "NO"); 377f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall printf("%ssampleRateShading: %s\n", indent, features.sampleRateShading ? "YES" : "NO"); 378f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall printf("%sdualSrcBlend: %s\n", indent, features.dualSrcBlend ? "YES" : "NO"); 379f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall printf("%slogicOp: %s\n", indent, features.logicOp ? "YES" : "NO"); 380f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall printf("%smultiDrawIndirect: %s\n", indent, features.multiDrawIndirect ? "YES" : "NO"); 381f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall printf("%sdrawIndirectFirstInstance: %s\n", indent, features.drawIndirectFirstInstance ? "YES" : "NO"); 382f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall printf("%sdepthClamp: %s\n", indent, features.depthClamp ? "YES" : "NO"); 383f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall printf("%sdepthBiasClamp: %s\n", indent, features.depthBiasClamp ? "YES" : "NO"); 384f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall printf("%sfillModeNonSolid: %s\n", indent, features.fillModeNonSolid ? "YES" : "NO"); 385f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall printf("%sdepthBounds: %s\n", indent, features.depthBounds ? "YES" : "NO"); 386f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall printf("%swideLines: %s\n", indent, features.wideLines ? "YES" : "NO"); 387f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall printf("%slargePoints: %s\n", indent, features.largePoints ? "YES" : "NO"); 388f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall printf("%salphaToOne: %s\n", indent, features.alphaToOne ? "YES" : "NO"); 389f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall printf("%smultiViewport: %s\n", indent, features.multiViewport ? "YES" : "NO"); 390f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall printf("%ssamplerAnisotropy: %s\n", indent, features.samplerAnisotropy ? "YES" : "NO"); 391f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall printf("%stextureCompressionETC2: %s\n", indent, features.textureCompressionETC2 ? "YES" : "NO"); 392f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall printf("%stextureCompressionASTC_LDR: %s\n", indent, features.textureCompressionASTC_LDR ? "YES" : "NO"); 393f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall printf("%stextureCompressionBC: %s\n", indent, features.textureCompressionBC ? "YES" : "NO"); 394f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall printf("%socclusionQueryPrecise: %s\n", indent, features.occlusionQueryPrecise ? "YES" : "NO"); 395f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall printf("%spipelineStatisticsQuery: %s\n", indent, features.pipelineStatisticsQuery ? "YES" : "NO"); 396f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall printf("%svertexPipelineStoresAndAtomics: %s\n", indent, features.vertexPipelineStoresAndAtomics ? "YES" : "NO"); 397f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall printf("%sfragmentStoresAndAtomics: %s\n", indent, features.fragmentStoresAndAtomics ? "YES" : "NO"); 398f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall printf("%sshaderTessellationAndGeometryPointSize: %s\n", indent, features.shaderTessellationAndGeometryPointSize ? "YES" : "NO"); 399f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall printf("%sshaderImageGatherExtended: %s\n", indent, features.shaderImageGatherExtended ? "YES" : "NO"); 400f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall printf("%sshaderStorageImageExtendedFormats: %s\n", indent, features.shaderStorageImageExtendedFormats ? "YES" : "NO"); 401f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall printf("%sshaderStorageImageMultisample: %s\n", indent, features.shaderStorageImageMultisample ? "YES" : "NO"); 402f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall printf("%sshaderStorageImageReadWithoutFormat: %s\n", indent, features.shaderStorageImageReadWithoutFormat ? "YES" : "NO"); 403f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall printf("%sshaderStorageImageWriteWithoutFormat: %s\n", indent, features.shaderStorageImageWriteWithoutFormat ? "YES" : "NO"); 404f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall printf("%sshaderUniformBufferArrayDynamicIndexing: %s\n", indent, features.shaderUniformBufferArrayDynamicIndexing ? "YES" : "NO"); 405f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall printf("%sshaderSampledImageArrayDynamicIndexing: %s\n", indent, features.shaderSampledImageArrayDynamicIndexing ? "YES" : "NO"); 406f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall printf("%sshaderStorageBufferArrayDynamicIndexing: %s\n", indent, features.shaderStorageBufferArrayDynamicIndexing ? "YES" : "NO"); 407f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall printf("%sshaderStorageImageArrayDynamicIndexing: %s\n", indent, features.shaderStorageImageArrayDynamicIndexing ? "YES" : "NO"); 408f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall printf("%sshaderClipDistance: %s\n", indent, features.shaderClipDistance ? "YES" : "NO"); 409f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall printf("%sshaderCullDistance: %s\n", indent, features.shaderCullDistance ? "YES" : "NO"); 410f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall printf("%sshaderFloat64: %s\n", indent, features.shaderFloat64 ? "YES" : "NO"); 411f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall printf("%sshaderInt64: %s\n", indent, features.shaderInt64 ? "YES" : "NO"); 412f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall printf("%sshaderInt16: %s\n", indent, features.shaderInt16 ? "YES" : "NO"); 413f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall printf("%sshaderResourceResidency: %s\n", indent, features.shaderResourceResidency ? "YES" : "NO"); 414f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall printf("%sshaderResourceMinLod: %s\n", indent, features.shaderResourceMinLod ? "YES" : "NO"); 415f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall printf("%ssparseBinding: %s\n", indent, features.sparseBinding ? "YES" : "NO"); 416f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall printf("%ssparseResidencyBuffer: %s\n", indent, features.sparseResidencyBuffer ? "YES" : "NO"); 417f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall printf("%ssparseResidencyImage2D: %s\n", indent, features.sparseResidencyImage2D ? "YES" : "NO"); 418f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall printf("%ssparseResidencyImage3D: %s\n", indent, features.sparseResidencyImage3D ? "YES" : "NO"); 419f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall printf("%ssparseResidency2Samples: %s\n", indent, features.sparseResidency2Samples ? "YES" : "NO"); 420f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall printf("%ssparseResidency4Samples: %s\n", indent, features.sparseResidency4Samples ? "YES" : "NO"); 421f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall printf("%ssparseResidency8Samples: %s\n", indent, features.sparseResidency8Samples ? "YES" : "NO"); 422f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall printf("%ssparseResidency16Samples: %s\n", indent, features.sparseResidency16Samples ? "YES" : "NO"); 423f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall printf("%ssparseResidencyAliased: %s\n", indent, features.sparseResidencyAliased ? "YES" : "NO"); 424f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall printf("%svariableMultisampleRate: %s\n", indent, features.variableMultisampleRate ? "YES" : "NO"); 425f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall printf("%sinheritedQueries: %s\n", indent, features.inheritedQueries ? "YES" : "NO"); 426f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall // clang-format on 427f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall} 428f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall 429f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hallvoid PrintSupportedFeatures(const char* indent, 430f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall const VkPhysicalDeviceFeatures& features) { 431f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall // clang-format off 432f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall if (features.robustBufferAccess) printf("%srobustBufferAccess\n", indent); 433f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall if (features.fullDrawIndexUint32) printf("%sfullDrawIndexUint32\n", indent); 434f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall if (features.imageCubeArray) printf("%simageCubeArray\n", indent); 435f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall if (features.independentBlend) printf("%sindependentBlend\n", indent); 436f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall if (features.geometryShader) printf("%sgeometryShader\n", indent); 437f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall if (features.tessellationShader) printf("%stessellationShader\n", indent); 438f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall if (features.sampleRateShading) printf("%ssampleRateShading\n", indent); 439f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall if (features.dualSrcBlend) printf("%sdualSrcBlend\n", indent); 440f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall if (features.logicOp) printf("%slogicOp\n", indent); 441f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall if (features.multiDrawIndirect) printf("%smultiDrawIndirect\n", indent); 442f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall if (features.drawIndirectFirstInstance) printf("%sdrawIndirectFirstInstance\n", indent); 443f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall if (features.depthClamp) printf("%sdepthClamp\n", indent); 444f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall if (features.depthBiasClamp) printf("%sdepthBiasClamp\n", indent); 445f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall if (features.fillModeNonSolid) printf("%sfillModeNonSolid\n", indent); 446f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall if (features.depthBounds) printf("%sdepthBounds\n", indent); 447f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall if (features.wideLines) printf("%swideLines\n", indent); 448f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall if (features.largePoints) printf("%slargePoints\n", indent); 449f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall if (features.alphaToOne) printf("%salphaToOne\n", indent); 450f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall if (features.multiViewport) printf("%smultiViewport\n", indent); 451f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall if (features.samplerAnisotropy) printf("%ssamplerAnisotropy\n", indent); 452f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall if (features.textureCompressionETC2) printf("%stextureCompressionETC2\n", indent); 453f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall if (features.textureCompressionASTC_LDR) printf("%stextureCompressionASTC_LDR\n", indent); 454f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall if (features.textureCompressionBC) printf("%stextureCompressionBC\n", indent); 455f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall if (features.occlusionQueryPrecise) printf("%socclusionQueryPrecise\n", indent); 456f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall if (features.pipelineStatisticsQuery) printf("%spipelineStatisticsQuery\n", indent); 457f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall if (features.vertexPipelineStoresAndAtomics) printf("%svertexPipelineStoresAndAtomics\n", indent); 458f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall if (features.fragmentStoresAndAtomics) printf("%sfragmentStoresAndAtomics\n", indent); 459f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall if (features.shaderTessellationAndGeometryPointSize) printf("%sshaderTessellationAndGeometryPointSize\n", indent); 460f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall if (features.shaderImageGatherExtended) printf("%sshaderImageGatherExtended\n", indent); 461f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall if (features.shaderStorageImageExtendedFormats) printf("%sshaderStorageImageExtendedFormats\n", indent); 462f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall if (features.shaderStorageImageMultisample) printf("%sshaderStorageImageMultisample\n", indent); 463f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall if (features.shaderStorageImageReadWithoutFormat) printf("%sshaderStorageImageReadWithoutFormat\n", indent); 464f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall if (features.shaderStorageImageWriteWithoutFormat) printf("%sshaderStorageImageWriteWithoutFormat\n", indent); 465f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall if (features.shaderUniformBufferArrayDynamicIndexing) printf("%sshaderUniformBufferArrayDynamicIndexing\n", indent); 466f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall if (features.shaderSampledImageArrayDynamicIndexing) printf("%sshaderSampledImageArrayDynamicIndexing\n", indent); 467f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall if (features.shaderStorageBufferArrayDynamicIndexing) printf("%sshaderStorageBufferArrayDynamicIndexing\n", indent); 468f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall if (features.shaderStorageImageArrayDynamicIndexing) printf("%sshaderStorageImageArrayDynamicIndexing\n", indent); 469f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall if (features.shaderClipDistance) printf("%sshaderClipDistance\n", indent); 470f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall if (features.shaderCullDistance) printf("%sshaderCullDistance\n", indent); 471f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall if (features.shaderFloat64) printf("%sshaderFloat64\n", indent); 472f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall if (features.shaderInt64) printf("%sshaderInt64\n", indent); 473f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall if (features.shaderInt16) printf("%sshaderInt16\n", indent); 474f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall if (features.shaderResourceResidency) printf("%sshaderResourceResidency\n", indent); 475f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall if (features.shaderResourceMinLod) printf("%sshaderResourceMinLod\n", indent); 476f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall if (features.sparseBinding) printf("%ssparseBinding\n", indent); 477f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall if (features.sparseResidencyBuffer) printf("%ssparseResidencyBuffer\n", indent); 478f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall if (features.sparseResidencyImage2D) printf("%ssparseResidencyImage2D\n", indent); 479f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall if (features.sparseResidencyImage3D) printf("%ssparseResidencyImage3D\n", indent); 480f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall if (features.sparseResidency2Samples) printf("%ssparseResidency2Samples\n", indent); 481f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall if (features.sparseResidency4Samples) printf("%ssparseResidency4Samples\n", indent); 482f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall if (features.sparseResidency8Samples) printf("%ssparseResidency8Samples\n", indent); 483f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall if (features.sparseResidency16Samples) printf("%ssparseResidency16Samples\n", indent); 484f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall if (features.sparseResidencyAliased) printf("%ssparseResidencyAliased\n", indent); 485f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall if (features.variableMultisampleRate) printf("%svariableMultisampleRate\n", indent); 486f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall if (features.inheritedQueries) printf("%sinheritedQueries\n", indent); 487f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall // clang-format on 488f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall} 489f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall 49038cb8407b96aef348531aff3d617cc0879217ecfJesse Hallvoid PrintGpuInfo(const GpuInfo& info, const Options& options, size_t indent) { 49104f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall VkResult result; 49273ab0acc1990326b4e51b675f4b2b44b6366c0a7Jesse Hall std::ostringstream strbuf; 49304f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall 49438cb8407b96aef348531aff3d617cc0879217ecfJesse Hall printf("%s\"%s\" (%s) %u.%u.%u/%#x [%04x:%04x]\n", Indent(indent), 49509559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall info.properties.deviceName, 49609559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall VkPhysicalDeviceTypeStr(info.properties.deviceType), 497e2948d83f352b9a093252a06757f76a88f5355d3Jesse Hall VK_VERSION_MAJOR(info.properties.apiVersion), 498e2948d83f352b9a093252a06757f76a88f5355d3Jesse Hall VK_VERSION_MINOR(info.properties.apiVersion), 499e2948d83f352b9a093252a06757f76a88f5355d3Jesse Hall VK_VERSION_PATCH(info.properties.apiVersion), 50009559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall info.properties.driverVersion, info.properties.vendorID, 50109559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall info.properties.deviceID); 50209559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall 50309559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall for (uint32_t heap = 0; heap < info.memory.memoryHeapCount; heap++) { 50409559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall if ((info.memory.memoryHeaps[heap].flags & 505d1af812f20e0793d94702817d441ab799bf46df7Jesse Hall VK_MEMORY_HEAP_DEVICE_LOCAL_BIT) != 0) 506d1af812f20e0793d94702817d441ab799bf46df7Jesse Hall strbuf << "DEVICE_LOCAL"; 50738cb8407b96aef348531aff3d617cc0879217ecfJesse Hall printf("%sHeap %u: %" PRIu64 " MiB (0x%" PRIx64 " B) %s\n", 50838cb8407b96aef348531aff3d617cc0879217ecfJesse Hall Indent(indent + 1), heap, 50900f10fec7d5cb96bc980a6d272dc8d33597a1b20Jesse Hall info.memory.memoryHeaps[heap].size / 0x100000, 51009559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall info.memory.memoryHeaps[heap].size, strbuf.str().c_str()); 51173ab0acc1990326b4e51b675f4b2b44b6366c0a7Jesse Hall strbuf.str(std::string()); 51273ab0acc1990326b4e51b675f4b2b44b6366c0a7Jesse Hall 51309559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall for (uint32_t type = 0; type < info.memory.memoryTypeCount; type++) { 51409559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall if (info.memory.memoryTypes[type].heapIndex != heap) 51573ab0acc1990326b4e51b675f4b2b44b6366c0a7Jesse Hall continue; 51673ab0acc1990326b4e51b675f4b2b44b6366c0a7Jesse Hall VkMemoryPropertyFlags flags = 51709559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall info.memory.memoryTypes[type].propertyFlags; 518d1af812f20e0793d94702817d441ab799bf46df7Jesse Hall if ((flags & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) != 0) 5191f91d390ac013ea2514a67e12ddb083119d636d7Jesse Hall strbuf << " DEVICE_LOCAL"; 52073ab0acc1990326b4e51b675f4b2b44b6366c0a7Jesse Hall if ((flags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT) != 0) 5211f91d390ac013ea2514a67e12ddb083119d636d7Jesse Hall strbuf << " HOST_VISIBLE"; 522d1af812f20e0793d94702817d441ab799bf46df7Jesse Hall if ((flags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT) != 0) 523d1af812f20e0793d94702817d441ab799bf46df7Jesse Hall strbuf << " COHERENT"; 524d1af812f20e0793d94702817d441ab799bf46df7Jesse Hall if ((flags & VK_MEMORY_PROPERTY_HOST_CACHED_BIT) != 0) 525d1af812f20e0793d94702817d441ab799bf46df7Jesse Hall strbuf << " CACHED"; 52673ab0acc1990326b4e51b675f4b2b44b6366c0a7Jesse Hall if ((flags & VK_MEMORY_PROPERTY_LAZILY_ALLOCATED_BIT) != 0) 52773ab0acc1990326b4e51b675f4b2b44b6366c0a7Jesse Hall strbuf << " LAZILY_ALLOCATED"; 52838cb8407b96aef348531aff3d617cc0879217ecfJesse Hall printf("%sType %u:%s\n", Indent(indent + 2), type, 52938cb8407b96aef348531aff3d617cc0879217ecfJesse Hall strbuf.str().c_str()); 53073ab0acc1990326b4e51b675f4b2b44b6366c0a7Jesse Hall strbuf.str(std::string()); 53173ab0acc1990326b4e51b675f4b2b44b6366c0a7Jesse Hall } 53273ab0acc1990326b4e51b675f4b2b44b6366c0a7Jesse Hall } 5335ae3abb3ca6728de04935b0c81bcdbdfc37b0d47Jesse Hall 53409559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall for (uint32_t family = 0; family < info.queue_families.size(); family++) { 53509559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall const VkQueueFamilyProperties& qprops = info.queue_families[family]; 5368966bf4149947dfc6d8ee0251efffc3a75663543Jesse Hall VkQueueFlags flags = qprops.queueFlags; 5378966bf4149947dfc6d8ee0251efffc3a75663543Jesse Hall char flags_str[5]; 5388966bf4149947dfc6d8ee0251efffc3a75663543Jesse Hall flags_str[0] = (flags & VK_QUEUE_GRAPHICS_BIT) ? 'G' : '_'; 5398966bf4149947dfc6d8ee0251efffc3a75663543Jesse Hall flags_str[1] = (flags & VK_QUEUE_COMPUTE_BIT) ? 'C' : '_'; 5408966bf4149947dfc6d8ee0251efffc3a75663543Jesse Hall flags_str[2] = (flags & VK_QUEUE_TRANSFER_BIT) ? 'T' : '_'; 5418966bf4149947dfc6d8ee0251efffc3a75663543Jesse Hall flags_str[3] = (flags & VK_QUEUE_SPARSE_BINDING_BIT) ? 'S' : '_'; 5428966bf4149947dfc6d8ee0251efffc3a75663543Jesse Hall flags_str[4] = '\0'; 5438966bf4149947dfc6d8ee0251efffc3a75663543Jesse Hall printf( 54438cb8407b96aef348531aff3d617cc0879217ecfJesse Hall "%sQueue Family %u: %ux %s\n" 54538cb8407b96aef348531aff3d617cc0879217ecfJesse Hall "%stimestampValidBits: %ub\n" 54638cb8407b96aef348531aff3d617cc0879217ecfJesse Hall "%sminImageTransferGranularity: (%u,%u,%u)\n", 54738cb8407b96aef348531aff3d617cc0879217ecfJesse Hall Indent(indent + 1), family, qprops.queueCount, flags_str, 54838cb8407b96aef348531aff3d617cc0879217ecfJesse Hall Indent(indent + 2), qprops.timestampValidBits, Indent(indent + 2), 5498966bf4149947dfc6d8ee0251efffc3a75663543Jesse Hall qprops.minImageTransferGranularity.width, 5508966bf4149947dfc6d8ee0251efffc3a75663543Jesse Hall qprops.minImageTransferGranularity.height, 5518966bf4149947dfc6d8ee0251efffc3a75663543Jesse Hall qprops.minImageTransferGranularity.depth); 552b147127b06c1ce6443839e8102d1ed2631a57b07Jesse Hall } 5536e4ab316ba910c70a25c5264b3edabb759819098Jesse Hall 554c5cec281654c5dee2273ce4bebd3a749c3a1119eJesse Hall printf("%sFeatures:\n", Indent(indent + 1)); 555f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall if (options.unsupported_features) { 556f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall PrintAllFeatures(Indent(indent + 2), info.features); 557f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall } else { 558f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall PrintSupportedFeatures(Indent(indent + 2), info.features); 559f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall } 560c5cec281654c5dee2273ce4bebd3a749c3a1119eJesse Hall 56138cb8407b96aef348531aff3d617cc0879217ecfJesse Hall printf("%sExtensions [%zu]:\n", Indent(indent + 1), info.extensions.size()); 56238cb8407b96aef348531aff3d617cc0879217ecfJesse Hall if (!info.extensions.empty()) 56338cb8407b96aef348531aff3d617cc0879217ecfJesse Hall PrintExtensions(info.extensions, options, indent + 2); 56438cb8407b96aef348531aff3d617cc0879217ecfJesse Hall printf("%sLayers [%zu]:\n", Indent(indent + 1), info.layers.size()); 56538cb8407b96aef348531aff3d617cc0879217ecfJesse Hall if (!info.layers.empty()) 56638cb8407b96aef348531aff3d617cc0879217ecfJesse Hall PrintLayers(info.layers, info.layer_extensions, options, indent + 2); 56704f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall} 56804f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall 56938cb8407b96aef348531aff3d617cc0879217ecfJesse Hallvoid PrintInfo(const VulkanInfo& info, const Options& options) { 57009559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall std::ostringstream strbuf; 57138cb8407b96aef348531aff3d617cc0879217ecfJesse Hall size_t indent = 0; 57209559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall 57338cb8407b96aef348531aff3d617cc0879217ecfJesse Hall printf("%sInstance Extensions [%zu]:\n", Indent(indent), 57438cb8407b96aef348531aff3d617cc0879217ecfJesse Hall info.extensions.size()); 57538cb8407b96aef348531aff3d617cc0879217ecfJesse Hall PrintExtensions(info.extensions, options, indent + 1); 57638cb8407b96aef348531aff3d617cc0879217ecfJesse Hall printf("%sInstance Layers [%zu]:\n", Indent(indent), info.layers.size()); 57738cb8407b96aef348531aff3d617cc0879217ecfJesse Hall if (!info.layers.empty()) 57838cb8407b96aef348531aff3d617cc0879217ecfJesse Hall PrintLayers(info.layers, info.layer_extensions, options, indent + 1); 57909559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall 58038cb8407b96aef348531aff3d617cc0879217ecfJesse Hall printf("%sPhysicalDevices [%zu]:\n", Indent(indent), info.gpus.size()); 58109559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall for (const auto& gpu : info.gpus) 58238cb8407b96aef348531aff3d617cc0879217ecfJesse Hall PrintGpuInfo(gpu, options, indent + 1); 583c1ab303f6fc8339d386d6cf127534677929fddfbJesse Hall} 584c1ab303f6fc8339d386d6cf127534677929fddfbJesse Hall 585f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hallconst char kUsageString[] = 586f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall "usage: vkinfo [options]\n" 587f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall " -v enable all the following verbose options\n" 588f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall " -layer_description print layer description strings\n" 589f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall " -layer_extensions print extensions supported by each layer\n" 590f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall " -unsupported_features print all physical device features\n" 591f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall " -validate enable validation layers if present\n" 592f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall " -debug_pause pause at start until resumed via debugger\n"; 593f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall 59404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall} // namespace 59504f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall 59609559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall// ---------------------------------------------------------------------------- 59709559b53a83342ee8b4c5ae3e29bb252a02908dbJesse Hall 59838cb8407b96aef348531aff3d617cc0879217ecfJesse Hallint main(int argc, char const* argv[]) { 599c2a770925da019a82e23aacacf12be3bfe691766Courtney Goeltzenleuchter static volatile bool startup_pause = false; 60038cb8407b96aef348531aff3d617cc0879217ecfJesse Hall Options options = { 60138cb8407b96aef348531aff3d617cc0879217ecfJesse Hall .layer_description = false, .layer_extensions = false, 602f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall .unsupported_features = false, 603d0bba376a4a04f5ada451090ec65ffa8641724acChia-I Wu .validate = false, 60438cb8407b96aef348531aff3d617cc0879217ecfJesse Hall }; 60538cb8407b96aef348531aff3d617cc0879217ecfJesse Hall for (int argi = 1; argi < argc; argi++) { 606f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall if (strcmp(argv[argi], "-h") == 0) { 607f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall fputs(kUsageString, stdout); 608f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall return 0; 609f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall } 61038cb8407b96aef348531aff3d617cc0879217ecfJesse Hall if (strcmp(argv[argi], "-v") == 0) { 61138cb8407b96aef348531aff3d617cc0879217ecfJesse Hall options.layer_description = true; 61238cb8407b96aef348531aff3d617cc0879217ecfJesse Hall options.layer_extensions = true; 613f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall options.unsupported_features = true; 61438cb8407b96aef348531aff3d617cc0879217ecfJesse Hall } else if (strcmp(argv[argi], "-layer_description") == 0) { 61538cb8407b96aef348531aff3d617cc0879217ecfJesse Hall options.layer_description = true; 61638cb8407b96aef348531aff3d617cc0879217ecfJesse Hall } else if (strcmp(argv[argi], "-layer_extensions") == 0) { 61738cb8407b96aef348531aff3d617cc0879217ecfJesse Hall options.layer_extensions = true; 618f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall } else if (strcmp(argv[argi], "-unsupported_features") == 0) { 619f63e4450a62de4d345e191a87cb6372fbb3226fdJesse Hall options.unsupported_features = true; 620d0bba376a4a04f5ada451090ec65ffa8641724acChia-I Wu } else if (strcmp(argv[argi], "-validate") == 0) { 621d0bba376a4a04f5ada451090ec65ffa8641724acChia-I Wu options.validate = true; 622c2a770925da019a82e23aacacf12be3bfe691766Courtney Goeltzenleuchter } else if (strcmp(argv[argi], "-debug_pause") == 0) { 623c2a770925da019a82e23aacacf12be3bfe691766Courtney Goeltzenleuchter startup_pause = true; 62438cb8407b96aef348531aff3d617cc0879217ecfJesse Hall } 62538cb8407b96aef348531aff3d617cc0879217ecfJesse Hall } 62638cb8407b96aef348531aff3d617cc0879217ecfJesse Hall 627c2a770925da019a82e23aacacf12be3bfe691766Courtney Goeltzenleuchter while (startup_pause) { 628c2a770925da019a82e23aacacf12be3bfe691766Courtney Goeltzenleuchter sleep(0); 629c2a770925da019a82e23aacacf12be3bfe691766Courtney Goeltzenleuchter } 630c2a770925da019a82e23aacacf12be3bfe691766Courtney Goeltzenleuchter 631c1ab303f6fc8339d386d6cf127534677929fddfbJesse Hall VulkanInfo info; 632d0bba376a4a04f5ada451090ec65ffa8641724acChia-I Wu GatherInfo(&info, options); 63338cb8407b96aef348531aff3d617cc0879217ecfJesse Hall PrintInfo(info, options); 63404f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall return 0; 63504f4f4746481571148eaf3aaf768ee5c6dccec9dJesse Hall} 636