diff options
Diffstat (limited to 'vulkaninfo/vulkaninfo.cpp')
| -rw-r--r-- | vulkaninfo/vulkaninfo.cpp | 527 |
1 files changed, 256 insertions, 271 deletions
diff --git a/vulkaninfo/vulkaninfo.cpp b/vulkaninfo/vulkaninfo.cpp index b57b0261..7f56657b 100644 --- a/vulkaninfo/vulkaninfo.cpp +++ b/vulkaninfo/vulkaninfo.cpp @@ -31,7 +31,7 @@ // =========== Dump Functions ========= // -void DumpExtensions(Printer &p, std::string layer_name, std::vector<VkExtensionProperties> extensions, bool do_indent) { +void DumpExtensions(Printer &p, std::string section_name, std::vector<VkExtensionProperties> extensions, bool do_indent = false) { std::sort(extensions.begin(), extensions.end(), [](VkExtensionProperties &a, VkExtensionProperties &b) -> int { return std::string(a.extensionName) < std::string(b.extensionName); }); @@ -40,17 +40,20 @@ void DumpExtensions(Printer &p, std::string layer_name, std::vector<VkExtensionP for (const auto &ext : extensions) { max_length = std::max(max_length, std::strlen(ext.extensionName)); } - - ObjectWrapper obj(p, layer_name + " Extensions", extensions.size()); +#if defined(VK_ENABLE_BETA_EXTENSIONS) + const std::string portability_ext_name = VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME; +#endif // defined(VK_ENABLE_BETA_EXTENSIONS) + ObjectWrapper obj(p, section_name, extensions.size()); if (do_indent) p.IndentDecrease(); for (auto &ext : extensions) { +#if defined(VK_ENABLE_BETA_EXTENSIONS) + if (p.Type() == OutputType::json && portability_ext_name == ext.extensionName) continue; +#endif // defined(VK_ENABLE_BETA_EXTENSIONS) p.PrintExtension(ext.extensionName, ext.specVersion, max_length); } if (do_indent) p.IndentIncrease(); } -void DumpExtensions(Printer &p, std::string layer_name, std::vector<VkExtensionProperties> extensions) { - DumpExtensions(p, layer_name, extensions, false); -} + void DumpLayers(Printer &p, std::vector<LayerExtensionList> layers, const std::vector<std::unique_ptr<AppGpu>> &gpus) { std::sort(layers.begin(), layers.end(), [](LayerExtensionList &left, LayerExtensionList &right) -> int { return std::strncmp(left.layer_properties.layerName, right.layer_properties.layerName, VK_MAX_DESCRIPTION_SIZE) < 0; @@ -70,13 +73,13 @@ void DumpLayers(Printer &p, std::vector<LayerExtensionList> layers, const std::v p.DecorateAsValue(v_str) + ", layer version " + p.DecorateAsValue(std::to_string(props.implementationVersion)); ObjectWrapper obj(p, header); - DumpExtensions(p, "Layer", layer.extension_properties); + DumpExtensions(p, "Layer Extensions", layer.extension_properties); ArrayWrapper arr_devices(p, "Devices", gpus.size()); for (auto &gpu : gpus) { p.PrintKeyValue("GPU id", gpu->id, gpu->props.deviceName); auto exts = gpu->inst.AppGetPhysicalDeviceLayerExtensions(gpu->phys_device, props.layerName); - DumpExtensions(p, "Layer-Device", exts); + DumpExtensions(p, "Layer-Device Extensions", exts); p.AddNewline(); } } @@ -84,12 +87,7 @@ void DumpLayers(Printer &p, std::vector<LayerExtensionList> layers, const std::v } case OutputType::json: { - ArrayWrapper arr(p, "ArrayOfVkLayerProperties", layers.size()); - int i = 0; - for (auto &layer : layers) { - p.SetElementIndex(i++); - DumpVkLayerProperties(p, "layerProperty", layer.layer_properties); - } + assert(false && "unimplemented"); break; } case OutputType::vkconfig_output: { @@ -101,13 +99,13 @@ void DumpLayers(Printer &p, std::vector<LayerExtensionList> layers, const std::v p.PrintKeyString("version", VkVersionString(layer.layer_properties.specVersion)); p.PrintKeyValue("implementation version", layer.layer_properties.implementationVersion); p.PrintKeyString("description", layer.layer_properties.description); - DumpExtensions(p, "Layer", layer.extension_properties); + DumpExtensions(p, "Layer Extensions", layer.extension_properties); ObjectWrapper obj_devices(p, "Devices"); for (auto &gpu : gpus) { ObjectWrapper obj_gpu(p, gpu->props.deviceName); p.PrintKeyValue("GPU id", gpu->id, gpu->props.deviceName); auto exts = gpu->inst.AppGetPhysicalDeviceLayerExtensions(gpu->phys_device, layer.layer_properties.layerName); - DumpExtensions(p, "Layer-Device", exts); + DumpExtensions(p, "Layer-Device Extensions", exts); } } break; @@ -313,25 +311,6 @@ void GpuDumpProps(Printer &p, AppGpu &gpu) { p.AddNewline(); } } -void GpuDumpPropsJson(Printer &p, AppGpu &gpu) { - auto props = gpu.GetDeviceProperties(); - ObjectWrapper obj(p, "VkPhysicalDeviceProperties"); - p.PrintKeyValue("apiVersion", props.apiVersion, VkVersionString(props.apiVersion)); - p.PrintKeyValue("driverVersion", props.driverVersion, to_hex_str(props.driverVersion)); - p.PrintKeyValue("vendorID", props.vendorID); - p.PrintKeyValue("deviceID", props.deviceID); - p.PrintKeyValue("deviceType", props.deviceType); - p.PrintKeyString("deviceName", props.deviceName); - { - ArrayWrapper arr(p, "pipelineCacheUUID", VK_UUID_SIZE); - for (uint32_t i = 0; i < VK_UUID_SIZE; ++i) { - p.PrintElement(static_cast<uint32_t>(props.pipelineCacheUUID[i])); - } - } - - DumpVkPhysicalDeviceLimits(p, "VkPhysicalDeviceLimits", gpu.props.limits); - DumpVkPhysicalDeviceSparseProperties(p, "VkPhysicalDeviceSparseProperties", gpu.props.sparseProperties); -} void GpuDumpQueueProps(Printer &p, AppGpu &gpu, const AppQueueFamilyProperties &queue) { VkQueueFamilyProperties props = queue.props; @@ -365,14 +344,6 @@ void GpuDumpQueueProps(Printer &p, AppGpu &gpu, const AppQueueFamilyProperties & p.AddNewline(); } -void GpuDumpQueuePropsJson(Printer &p, std::vector<SurfaceExtension> &surfaces, VkQueueFamilyProperties props) { - ObjectWrapper obj(p, ""); - DumpVkExtent3D(p, "minImageTransferGranularity", props.minImageTransferGranularity); - p.PrintKeyValue("queueCount", props.queueCount); - p.PrintKeyValue("queueFlags", props.queueFlags); - p.PrintKeyValue("timestampValidBits", props.timestampValidBits); -} - // This prints a number of bytes in a human-readable format according to prefixes of the International System of Quantities (ISQ), // defined in ISO/IEC 80000. The prefixes used here are not SI prefixes, but rather the binary prefixes based on powers of 1024 // (kibi-, mebi-, gibi- etc.). @@ -482,26 +453,6 @@ void GpuDumpMemoryProps(Printer &p, AppGpu &gpu) { p.AddNewline(); } -void GpuDumpMemoryPropsJson(Printer &p, AppGpu &gpu) { - ObjectWrapper obj_mem_props(p, "VkPhysicalDeviceMemoryProperties"); - { - ArrayWrapper arr(p, "memoryHeaps", gpu.memory_props.memoryHeapCount); - for (uint32_t i = 0; i < gpu.memory_props.memoryHeapCount; ++i) { - ObjectWrapper obj(p, ""); - p.PrintKeyValue("flags", gpu.memory_props.memoryHeaps[i].flags); - p.PrintKeyValue("size", gpu.memory_props.memoryHeaps[i].size); - } - } - { - ArrayWrapper arr(p, "memoryTypes", gpu.memory_props.memoryTypeCount); - for (uint32_t i = 0; i < gpu.memory_props.memoryTypeCount; ++i) { - ObjectWrapper obj(p, ""); - p.PrintKeyValue("heapIndex", gpu.memory_props.memoryTypes[i].heapIndex); - p.PrintKeyValue("propertyFlags", gpu.memory_props.memoryTypes[i].propertyFlags); - } - } -} - void GpuDumpFeatures(Printer &p, AppGpu &gpu) { p.SetHeader(); DumpVkPhysicalDeviceFeatures(p, "VkPhysicalDeviceFeatures", gpu.features); @@ -513,41 +464,33 @@ void GpuDumpFeatures(Printer &p, AppGpu &gpu) { } void GpuDumpFormatProperty(Printer &p, VkFormat fmt, VkFormatProperties prop) { + std::string name{}; switch (p.Type()) { case OutputType::text: { - ObjectWrapper obj(p, "Properties"); - DumpVkFormatFeatureFlags(p, "linearTiling", prop.linearTilingFeatures); - DumpVkFormatFeatureFlags(p, "optimalTiling", prop.optimalTilingFeatures); - DumpVkFormatFeatureFlags(p, "bufferFeatures", prop.bufferFeatures); + name = "Properties"; break; } case OutputType::html: { - p.SetTitleAsType(); - ObjectWrapper obj(p, VkFormatString(fmt)); - p.SetOpenDetails(); - DumpVkFormatFeatureFlags(p, "linearTiling", prop.linearTilingFeatures); - p.SetOpenDetails(); - DumpVkFormatFeatureFlags(p, "optimalTiling", prop.optimalTilingFeatures); - p.SetOpenDetails(); - DumpVkFormatFeatureFlags(p, "bufferFeatures", prop.bufferFeatures); + name = VkFormatString(fmt); break; } case OutputType::json: { - ObjectWrapper obj(p, ""); - p.PrintKeyValue("formatID", fmt); - p.PrintKeyValue("linearTilingFeatures", prop.linearTilingFeatures); - p.PrintKeyValue("optimalTilingFeatures", prop.optimalTilingFeatures); - p.PrintKeyValue("bufferFeatures", prop.bufferFeatures); + name = "VkFormatProperties"; break; } case OutputType::vkconfig_output: { - ObjectWrapper obj(p, VkFormatString(fmt)); - DumpVkFormatFeatureFlags(p, "linearTiling", prop.linearTilingFeatures); - DumpVkFormatFeatureFlags(p, "optimalTiling", prop.optimalTilingFeatures); - DumpVkFormatFeatureFlags(p, "bufferFeatures", prop.bufferFeatures); + name = VkFormatString(fmt); break; } } + p.SetTitleAsType(); + ObjectWrapper obj(p, name); + p.SetOpenDetails(); + DumpVkFormatFeatureFlags(p, "linearTilingFeatures", prop.linearTilingFeatures); + p.SetOpenDetails(); + DumpVkFormatFeatureFlags(p, "optimalTilingFeatures", prop.optimalTilingFeatures); + p.SetOpenDetails(); + DumpVkFormatFeatureFlags(p, "bufferFeatures", prop.bufferFeatures); } void GpuDumpToolingInfo(Printer &p, AppGpu &gpu) { @@ -617,32 +560,14 @@ void GpuDevDump(Printer &p, AppGpu &gpu) { p.AddNewline(); } -void GpuDevDumpJson(Printer &p, AppGpu &gpu) { - ArrayWrapper arr(p, "ArrayOfVkFormatProperties"); - for (auto &format : gpu.supported_format_ranges) { - if (gpu.FormatRangeSupported(format)) { - for (int32_t fmt_counter = format.first_format; fmt_counter <= format.last_format; ++fmt_counter) { - VkFormat fmt = static_cast<VkFormat>(fmt_counter); - - VkFormatProperties props; - gpu.inst.dll.fp_vkGetPhysicalDeviceFormatProperties(gpu.phys_device, fmt, &props); - - // don't print format properties that are unsupported - if ((props.linearTilingFeatures || props.optimalTilingFeatures || props.bufferFeatures) == 0) continue; - - GpuDumpFormatProperty(p, fmt, props); - } - } - } -} // Print gpu info for text, html, & vkconfig_output -// Uses a seperate function than schema-json for clarity +// Uses a separate function than schema-json for clarity void DumpGpu(Printer &p, AppGpu &gpu, bool show_tooling_info, bool show_formats) { ObjectWrapper obj_gpu(p, "GPU" + std::to_string(gpu.id)); IndentWrapper indent(p); GpuDumpProps(p, gpu); - DumpExtensions(p, "Device", gpu.device_extensions); + DumpExtensions(p, "Device Extensions", gpu.device_extensions); p.AddNewline(); { p.SetHeader(); @@ -664,31 +589,178 @@ void DumpGpu(Printer &p, AppGpu &gpu, bool show_tooling_info, bool show_formats) p.AddNewline(); } -// Print gpu info for json -void DumpGpuJson(Printer &p, AppGpu &gpu) { - GpuDumpPropsJson(p, gpu); +// Print capabilities section of profiles schema +void DumpGpuProfileCapabilities(Printer &p, AppGpu &gpu) { + ObjectWrapper capabilities(p, "capabilities"); { - ArrayWrapper arr(p, "ArrayOfVkQueueFamilyProperties"); - for (const auto &queue_prop : gpu.queue_props) { - GpuDumpQueuePropsJson(p, gpu.inst.surface_extensions, queue_prop); + ObjectWrapper temp_name_obj(p, "device"); + DumpExtensions(p, "extensions", gpu.device_extensions); + { + ObjectWrapper obj(p, "features"); + GpuDumpFeatures(p, gpu); + } + { + ObjectWrapper obj(p, "properties"); + { + ObjectWrapper props_obj(p, "VkPhysicalDeviceProperties"); + auto props = gpu.GetDeviceProperties(); + p.PrintKeyValue("apiVersion", props.apiVersion, VkVersionString(props.apiVersion)); + p.PrintKeyValue("deviceID", props.deviceID); + p.PrintKeyString("deviceName", props.deviceName); + p.PrintKeyString("deviceType", std::string("VK_") + VkPhysicalDeviceTypeString(props.deviceType)); + p.PrintKeyValue("driverVersion", props.driverVersion); + DumpVkPhysicalDeviceLimits(p, "VkPhysicalDeviceLimits", gpu.props.limits); + { + ArrayWrapper arr(p, "pipelineCacheUUID"); + for (const auto &uuid : props.pipelineCacheUUID) p.PrintElement(static_cast<uint32_t>(uuid)); + } + DumpVkPhysicalDeviceSparseProperties(p, "VkPhysicalDeviceSparseProperties", gpu.props.sparseProperties); + p.PrintKeyValue("vendorID", props.vendorID); + } + if (gpu.inst.CheckExtensionEnabled(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) { + void *place = gpu.props2.pNext; + chain_iterator_phys_device_props2(p, gpu.inst, gpu, place); + } + } + { + ObjectWrapper obj(p, "formats"); + for (auto &format : gpu.supported_format_ranges) { + if (gpu.FormatRangeSupported(format)) { + for (int32_t fmt_counter = format.first_format; fmt_counter <= format.last_format; ++fmt_counter) { + VkFormat fmt = static_cast<VkFormat>(fmt_counter); + + VkFormatProperties props; + gpu.inst.dll.fp_vkGetPhysicalDeviceFormatProperties(gpu.phys_device, fmt, &props); + + // don't print format properties that are unsupported + if ((props.linearTilingFeatures || props.optimalTilingFeatures || props.bufferFeatures) == 0) continue; + + ObjectWrapper format_obj(p, std::string("VK_") + VkFormatString(fmt)); + { + GpuDumpFormatProperty(p, fmt, props); + + VkFormatProperties2 format_props2{}; + format_props2.sType = VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2; + format_props2.formatProperties = props; + std::unique_ptr<format_properties2_chain> chain_for_format_props2; + setup_format_properties2_chain(format_props2, chain_for_format_props2); + gpu.inst.ext_funcs.vkGetPhysicalDeviceFormatProperties2KHR(gpu.phys_device, fmt, &format_props2); + chain_iterator_format_properties2(p, gpu, format_props2.pNext); + } + } + } + } + } + { + ArrayWrapper arr(p, "queueFamiliesProperties"); + for (const auto &extended_queue_prop : gpu.extended_queue_props) { + ObjectWrapper queue_obj(p, ""); + { + ObjectWrapper obj_queue_props(p, "VkQueueFamilyProperties"); + VkQueueFamilyProperties props = extended_queue_prop.props; + DumpVkExtent3D(p, "minImageTransferGranularity", props.minImageTransferGranularity); + p.PrintKeyValue("queueCount", props.queueCount); + DumpVkQueueFlags(p, "queueFlags", props.queueFlags); + p.PrintKeyValue("timestampValidBits", props.timestampValidBits); + } + chain_iterator_queue_properties2(p, gpu, extended_queue_prop.pNext); + } } } - { - ArrayWrapper arr(p, "ArrayOfVkExtensionProperties"); - for (auto &ext : gpu.device_extensions) { - p.PrintExtension(ext.extensionName, ext.specVersion); +#if defined(VK_ENABLE_BETA_EXTENSIONS) + // Print portability subset extension, features, and properties if available + if (gpu.CheckPhysicalDeviceExtensionIncluded(VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME) && + (gpu.inst.CheckExtensionEnabled(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME) || + gpu.inst.instance_version >= VK_API_VERSION_1_1)) { + ObjectWrapper macos_obj(p, "macos-specific"); + { + ObjectWrapper ext_obj(p, "extensions"); + const std::string portability_ext_name = VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME; + for (const auto &ext : gpu.device_extensions) { + if (portability_ext_name == ext.extensionName) { + p.PrintExtension(ext.extensionName, ext.specVersion); + } + } + } + { + ObjectWrapper features_obj(p, "features"); + void *feats_place = gpu.features2.pNext; + while (feats_place) { + VkBaseOutStructure *structure = static_cast<VkBaseOutStructure *>(feats_place); + if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_FEATURES_KHR) { + auto *features = reinterpret_cast<VkPhysicalDevicePortabilitySubsetFeaturesKHR *>(structure); + DumpVkPhysicalDevicePortabilitySubsetFeaturesKHR(p, "VkPhysicalDevicePortabilitySubsetFeaturesKHR", *features); + break; + } + feats_place = structure->pNext; + } + } + { + ObjectWrapper property_obj(p, "properties"); + void *props_place = gpu.props2.pNext; + while (props_place) { + VkBaseOutStructure *structure = static_cast<VkBaseOutStructure *>(props_place); + if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_PROPERTIES_KHR) { + auto *props = reinterpret_cast<VkPhysicalDevicePortabilitySubsetPropertiesKHR *>(structure); + DumpVkPhysicalDevicePortabilitySubsetPropertiesKHR(p, "VkPhysicalDevicePortabilitySubsetPropertiesKHR", *props); + break; + } + props_place = structure->pNext; + } } } +#endif // defined(VK_ENABLE_BETA_EXTENSIONS) +} +void PrintProfileBaseInfo(Printer &p, const std::string &device_name, uint32_t apiVersion, const std::string &device_label, + const std::vector<std::string> &capabilities) { + ObjectWrapper vk_info(p, device_name); + p.PrintKeyValue("version", 1); + p.PrintKeyString("api-version", VkVersionString(apiVersion)); + p.PrintKeyString("label", device_label); + p.PrintKeyString("description", "Exported from vulkaninfo"); + { ObjectWrapper contributors(p, "contributors"); } + { + ArrayWrapper contributors(p, "history"); + ObjectWrapper element(p, ""); + p.PrintKeyValue("revision", 1); + std::time_t t = std::time(0); // get time now + std::tm *now = std::localtime(&t); + std::string date = + std::to_string(now->tm_year + 1900) + '-' + std::to_string(now->tm_mon + 1) + '-' + std::to_string(now->tm_mday); + p.PrintKeyString("date", date); + p.PrintKeyString("author", "Automated export from vulkaninfo"); + p.PrintKeyString("comment", ""); + } + ArrayWrapper contributors(p, "capabilities"); + for (const auto &str : capabilities) p.PrintString(str); +} - GpuDumpMemoryPropsJson(p, gpu); - DumpVkPhysicalDeviceFeatures(p, "VkPhysicalDeviceFeatures", gpu.features); - GpuDevDumpJson(p, gpu); +// Prints profiles section of profiles schema +void DumpGpuProfileInfo(Printer &p, AppGpu &gpu) { + ObjectWrapper profiles(p, "profiles"); + + std::string device_label = std::string(gpu.props.deviceName) + " driver " + VkVersionString(gpu.props.driverVersion); + std::string device_name = + std::string("VP_VULKANINFO_") + std::string(gpu.props.deviceName) + "_" + VkVersionString(gpu.props.driverVersion); + ; + for (auto &c : device_name) { + if (c == ' ' || c == '.') c = '_'; + } + PrintProfileBaseInfo(p, device_name, gpu.props.apiVersion, device_label, {"device"}); +#if defined(VK_ENABLE_BETA_EXTENSIONS) + if (gpu.CheckPhysicalDeviceExtensionIncluded(VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME) && + (gpu.inst.CheckExtensionEnabled(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME) || + gpu.inst.instance_version >= VK_API_VERSION_1_1)) { + PrintProfileBaseInfo(p, device_name + "_portability_subset", gpu.props.apiVersion, device_label + " subset", + {"device", "macos-specific"}); + } +#endif // defined(VK_ENABLE_BETA_EXTENSIONS) } // Print summary of system void DumpSummaryInstance(Printer &p, AppInstance &inst) { p.SetSubHeader(); - DumpExtensions(p, "Instance", inst.global_extensions, true); + DumpExtensions(p, "Instance Extensions", inst.global_extensions, true); p.AddNewline(); p.SetSubHeader(); @@ -742,7 +814,7 @@ void DumpSummaryGPU(Printer &p, AppGpu &gpu) { DumpVkDriverId(p, "driverID", driver_props->driverID); p.PrintKeyString("driverName", driver_props->driverName); p.PrintKeyString("driverInfo", driver_props->driverInfo); - DumpVkConformanceVersion(p, "conformanceVersion", driver_props->conformanceVersion); + p.PrintKeyString("conformanceVersion", VkConformanceVersionString(driver_props->conformanceVersion)); } if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES) { VkPhysicalDeviceIDProperties *device_id_props = reinterpret_cast<VkPhysicalDeviceIDProperties *>(structure); @@ -754,38 +826,6 @@ void DumpSummaryGPU(Printer &p, AppGpu &gpu) { } } -#if defined(VK_ENABLE_BETA_EXTENSIONS) -void DumpPortability(Printer &p, AppGpu &gpu) { - if (gpu.CheckPhysicalDeviceExtensionIncluded(VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME)) { - if (gpu.inst.CheckExtensionEnabled(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) { - void *props_place = gpu.props2.pNext; - while (props_place) { - VkBaseOutStructure *structure = static_cast<VkBaseOutStructure *>(props_place); - if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_PROPERTIES_KHR) { - VkPhysicalDevicePortabilitySubsetPropertiesKHR *props = - reinterpret_cast<VkPhysicalDevicePortabilitySubsetPropertiesKHR *>(structure); - DumpVkPhysicalDevicePortabilitySubsetPropertiesKHR(p, "VkPhysicalDevicePortabilitySubsetPropertiesKHR", *props); - break; - } - props_place = structure->pNext; - } - - void *feats_place = gpu.features2.pNext; - while (feats_place) { - VkBaseOutStructure *structure = static_cast<VkBaseOutStructure *>(feats_place); - if (structure->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PORTABILITY_SUBSET_FEATURES_KHR) { - VkPhysicalDevicePortabilitySubsetFeaturesKHR *features = - reinterpret_cast<VkPhysicalDevicePortabilitySubsetFeaturesKHR *>(structure); - DumpVkPhysicalDevicePortabilitySubsetFeaturesKHR(p, "VkPhysicalDevicePortabilitySubsetFeaturesKHR", *features); - break; - } - feats_place = structure->pNext; - } - } - } -} -#endif // defined(VK_ENABLE_BETA_EXTENSIONS) - // ============ Printing Logic ============= // #ifdef _WIN32 @@ -814,49 +854,42 @@ static void ConsoleEnlarge() { #endif // Global configuration -enum class OutputCategory { - text, - html, - devsim_json, - vkconfig_output, -#if defined(VK_ENABLE_BETA_EXTENSIONS) - portability_json, -#endif - summary -}; - -void print_usage(const char *argv0) { +enum class OutputCategory { text, html, profile_json, vkconfig_output, summary }; +const char *help_message_body = + "OPTIONS:\n" + "[-h, --help] Print this help.\n" + "[--summary] Show a summary of the instance and GPU's on a system.\n" + "[-o <filename>, --output <filename>]\n" + " Print output to a new file whose name is specified by filename.\n" + " File will be written to the current working directory.\n" + "[--text] Produce a text version of vulkaninfo output to stdout. This is\n" + " the default output.\n" + "[--html] Produce an html version of vulkaninfo output, saved as\n" + " \"vulkaninfo.html\" in the directory in which the command\n" + " is run.\n" + "[-j, --json] Produce a json version of vulkaninfo output conforming to the Vulkan\n" + " Profiles schema, saved as \"vulkaninfo.json\", of the first gpu in the\n" + " system.\n" + "[-j=<gpu-number>, --json=<gpu-number>]\n" + " For a multi-gpu system, a single gpu can be targetted by\n" + " specifying the gpu-number associated with the gpu of \n" + " interest. This number can be determined by running\n" + " vulkaninfo without any options specified.\n" + "[--show-tool-props] Show the active VkPhysicalDeviceToolPropertiesEXT that vulkaninfo finds.\n" + "[--show-formats] Display the format properties of each physical device.\n" + " Note: This only affects text output.\n"; + +void print_usage(const std::string &executable_name) { std::cout << "\nvulkaninfo - Summarize Vulkan information in relation to the current environment.\n\n"; - std::cout << "USAGE: " << argv0 << " [options]\n\n"; - std::cout << "OPTIONS:\n"; - std::cout << "-h, --help Print this help.\n"; - std::cout << "--summary Show a summary of the instance and GPU's on a system.\n"; - std::cout << "--text Produce a text version of vulkaninfo output to stdout. This is\n"; - std::cout << " the default output.\n"; - std::cout << "--html Produce an html version of vulkaninfo output, saved as\n"; - std::cout << " \"vulkaninfo.html\" in the directory in which the command\n"; - std::cout << " is run.\n"; - std::cout << "-j, --json Produce a json version of vulkaninfo to standard output of the\n"; - std::cout << " first gpu in the system conforming to the DevSim schema.\n"; - std::cout << "--json=<gpu-number> For a multi-gpu system, a single gpu can be targetted by\n"; - std::cout << " specifying the gpu-number associated with the gpu of \n"; - std::cout << " interest. This number can be determined by running\n"; - std::cout << " vulkaninfo without any options specified.\n"; -#if defined(VK_ENABLE_BETA_EXTENSIONS) - std::cout << "--portability Produce a json version of vulkaninfo to standard output of the first\n"; - std::cout << " gpu in the system conforming to the DevSim Portability Subset schema.\n"; - std::cout << "--portability=<N> Produce the json output conforming to the DevSim Portability\n"; - std::cout << " Subset Schema for the GPU specified to standard output,\n"; - std::cout << " where N is the GPU desired.\n"; -#endif // defined(VK_ENABLE_BETA_EXTENSIONS) - std::cout << "--show-tool-props Show the active VkPhysicalDeviceToolPropertiesEXT that vulkaninfo finds.\n"; - std::cout << "--show-formats Display the format properties of each physical device.\n"; - std::cout << " Note: This option does not affect html or json output;\n"; - std::cout << " they will always print format properties.\n"; - std::cout << "-o <filename>, --output<filename>\n"; - std::cout << " Print output to a new file whose name is specified by filename.\n"; - std::cout << " File will be written to the current working directory.\n"; - std::cout << "\n"; + std::cout << "USAGE: \n"; + std::cout << " " << executable_name << " --summary\n"; + std::cout << " " << executable_name << " -o <filename> | --output <filename>\n"; + std::cout << " " << executable_name << " -j | -j=<gpu-number> | --json | --json=<gpu-number>\n"; + std::cout << " " << executable_name << " --text\n"; + std::cout << " " << executable_name << " --html\n"; + std::cout << " " << executable_name << " --show-formats\n"; + std::cout << " " << executable_name << " --show-tool-props\n"; + std::cout << "\n" << help_message_body << std::endl; } struct ParsedResults { @@ -870,7 +903,7 @@ struct ParsedResults { std::string default_filename; }; -util::vulkaninfo_optional<ParsedResults> parse_arguments(int argc, char **argv) { +util::vulkaninfo_optional<ParsedResults> parse_arguments(int argc, char **argv, std::string executable_name) { ParsedResults results{}; // default it to zero init everything results.output_category = OutputCategory::text; // default output category results.default_filename = "vulkaninfo.txt"; @@ -895,17 +928,9 @@ util::vulkaninfo_optional<ParsedResults> parse_arguments(int argc, char **argv) results.selected_gpu = static_cast<uint32_t>(strtol(argv[i] + 7, nullptr, 10)); results.has_selected_gpu = true; } - results.output_category = OutputCategory::devsim_json; + results.output_category = OutputCategory::profile_json; results.default_filename = "vulkaninfo.json"; -#if defined(VK_ENABLE_BETA_EXTENSIONS) - } else if (strncmp("--portability", argv[i], 13) == 0) { - if (strlen(argv[i]) > 14 && strncmp("--portability=", argv[i], 14) == 0) { - results.selected_gpu = static_cast<uint32_t>(strtol(argv[i] + 14, nullptr, 10)); - results.has_selected_gpu = true; - } - results.output_category = OutputCategory::portability_json; - results.default_filename = "portability.json"; -#endif // defined(VK_ENABLE_BETA_EXTENSIONS) + results.print_to_file = true; } else if (strcmp(argv[i], "--summary") == 0) { results.output_category = OutputCategory::summary; } else if (strcmp(argv[i], "--text") == 0) { @@ -928,10 +953,10 @@ util::vulkaninfo_optional<ParsedResults> parse_arguments(int argc, char **argv) results.filename = argv[i + 1]; ++i; } else if (strcmp(argv[i], "--help") == 0 || strcmp(argv[i], "-h") == 0) { - print_usage(argv[0]); + print_usage(executable_name); return {}; } else { - print_usage(argv[0]); + print_usage(executable_name); return {}; } } @@ -951,36 +976,11 @@ PrinterCreateDetails get_printer_create_details(ParsedResults &parse_data, AppIn case (OutputCategory::html): create.output_type = OutputType::html; break; - case (OutputCategory::devsim_json): - create.output_type = OutputType::json; - create.start_string = std::string("{\n\t\"$schema\": \"https://schema.khronos.org/vulkan/devsim_1_0_0.json#\",\n") + - "\t\"comments\": {\n\t\t\"desc\": \"JSON configuration file describing GPU " + - std::to_string(parse_data.selected_gpu) + " (" + selected_gpu.props.deviceName + - "). Generated using the " + executable_name + " program.\",\n\t\t\"vulkanApiVersion\": \"" + - VkVersionString(inst.vk_version) + "\"\n" + "\t}"; -#ifdef VK_USE_PLATFORM_IOS_MVK - create.print_to_file = true; -#endif - break; -#if defined(VK_ENABLE_BETA_EXTENSIONS) - case (OutputCategory::portability_json): + case (OutputCategory::profile_json): create.output_type = OutputType::json; create.start_string = - std::string( - "{\n\t\"$schema\": " - "\"https://schema.khronos.org/vulkan/devsim_VK_KHR_portability_subset-provisional-1.json#\",\n") + - "\t\"comments\": {\n\t\t\"desc\": \"JSON configuration file describing GPU " + - std::to_string(parse_data.selected_gpu) + "'s (" + selected_gpu.props.deviceName + - ") portability features and properties. Generated using the " + executable_name + - " program.\",\n\t\t\"vulkanApiVersion\": " - "\"" + - VkVersionString(inst.vk_version) + "\"\n" + "\t}"; -#ifdef VK_USE_PLATFORM_IOS_MVK - create.print_to_file = true; -#endif + std::string("{\n\t\"$schema\": ") + "\"https://schema.khronos.org/vulkan/profiles-0.8-latest.json\""; break; -#endif // defined(VK_ENABLE_BETA_EXTENSIONS) - case (OutputCategory::vkconfig_output): create.output_type = OutputType::vkconfig_output; create.start_string = "{\n\t\"Vulkan Instance Version\": \"" + VkVersionString(inst.vk_version) + "\""; @@ -1002,18 +1002,13 @@ void RunPrinter(Printer &p, ParsedResults parse_data, AppInstance &instance, std for (auto &gpu : gpus) { DumpSummaryGPU(p, *(gpu.get())); } - } -#if defined(VK_ENABLE_BETA_EXTENSIONS) - else if (parse_data.output_category == OutputCategory::portability_json) { - DumpPortability(p, *(gpus.at(parse_data.selected_gpu).get())); -#endif // defined(VK_ENABLE_BETA_EXTENSIONS) - } else if (parse_data.output_category == OutputCategory::devsim_json) { - DumpLayers(p, instance.global_layers, gpus); - DumpGpuJson(p, *(gpus.at(parse_data.selected_gpu).get())); + } else if (parse_data.output_category == OutputCategory::profile_json) { + DumpGpuProfileCapabilities(p, *(gpus.at(parse_data.selected_gpu).get())); + DumpGpuProfileInfo(p, *(gpus.at(parse_data.selected_gpu).get())); } else { // text, html, vkconfig_output p.SetHeader(); - DumpExtensions(p, "Instance", instance.global_extensions); + DumpExtensions(p, "Instance Extensions", instance.global_extensions); p.AddNewline(); DumpLayers(p, instance.global_layers, gpus); @@ -1040,7 +1035,23 @@ int vulkanInfoMain(int argc, char **argv) { int main(int argc, char **argv) { #endif - auto parsing_return = parse_arguments(argc, argv); + // Figure out the name of the executable, pull out the name if given a path + // Default is `vulkaninfo` + std::string executable_name = "vulkaninfo"; + if (argc >= 1) { + const auto argv_0 = std::string(argv[0]); + // don't include path separator + // Look for forward slash first, only look for backslash if that found nothing + auto last_occurrence = argv_0.rfind('/'); + if (last_occurrence == std::string::npos) { + last_occurrence = argv_0.rfind('\\'); + } + if (last_occurrence != std::string::npos && last_occurrence + 1 < argv_0.size()) { + executable_name = argv_0.substr(last_occurrence + 1); + } + } + + auto parsing_return = parse_arguments(argc, argv, executable_name); if (!parsing_return) return 1; ParsedResults parse_data = parsing_return.value(); @@ -1060,22 +1071,6 @@ int main(int argc, char **argv) { } #endif - // Figure out the name of the executable, pull out the name if given a path - // Default is `vulkaninfo` - std::string executable_name = "vulkaninfo"; - if (argc >= 1) { - const auto argv_0 = std::string(argv[0]); - // don't include path separator - // Look for forward slash first, only look for backslash if that found nothing - auto last_occurrence = argv_0.rfind('/'); - if (last_occurrence == std::string::npos) { - last_occurrence = argv_0.rfind('\\'); - } - if (last_occurrence != std::string::npos && last_occurrence + 1 < argv_0.size()) { - executable_name = argv_0.substr(last_occurrence + 1); - } - } - int return_code = 0; // set in case of error std::unique_ptr<Printer> printer; std::ostream std_out(std::cout.rdbuf()); @@ -1121,27 +1116,17 @@ int main(int argc, char **argv) { } return 1; } - } else if (parse_data.output_category == OutputCategory::devsim_json || - parse_data.output_category == OutputCategory::portability_json) { + } else if (parse_data.output_category == OutputCategory::profile_json) { std::cout << "vulkaninfo could not find any GPU's.\n"; } } -#if defined(VK_ENABLE_BETA_EXTENSIONS) - if (parse_data.output_category == OutputCategory::portability_json && - !gpus.at(parse_data.selected_gpu)->CheckPhysicalDeviceExtensionIncluded(VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME)) { - std::cerr << "Cannot create a json because the current selected GPU (" << parse_data.selected_gpu - << ") does not support the VK_KHR_portability_subset extension.\n"; - return 1; - } -#endif - auto printer_data = get_printer_create_details(parse_data, instance, *gpus.at(parse_data.selected_gpu), executable_name); if (printer_data.print_to_file) { file_out = std::ofstream(printer_data.file_name); out = &file_out; } - printer = std::unique_ptr<Printer>(new Printer(printer_data, *out, parse_data.selected_gpu, instance.vk_version)); + printer = std::unique_ptr<Printer>(new Printer(printer_data, *out, instance.vk_version)); RunPrinter(*(printer.get()), parse_data, instance, gpus, surfaces); |
