// // Copyright 2020 The ANGLE Project Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // // Simple unit test suite that prints out system info as JSON. // // Example output for a Windows/NV machine: // // { // "activeGPUIndex": 0, // "isOptimus": false, // "isMacSwitchable": false, // "machineManufacturer": "", // "machineModelVersion": "", // "gpus": [ // { // "vendorId": 4318, // "deviceId": 7040, // "driverVendor": "NVIDIA Corporation", // "driverVersion": "452.6.0.0", // "driverDate": "", // "detailedDriverVersion": { // "major": 452, // "minor": 6, // "subMinor": 0, // "patch": 0 // } // } // ] // } #include "gpu_info_util/SystemInfo.h" #include #include #include #include #include #include "common/debug.h" #if defined(ANGLE_ENABLE_VULKAN) # include "gpu_info_util/SystemInfo_vulkan.h" #endif // defined(ANGLE_ENABLE_VULKAN) namespace js = rapidjson; bool gFailedToFindGPU; constexpr char kRenderTestOutputDir[] = "--render-test-output-dir="; int main(int argc, char **argv) { angle::SystemInfo info; bool useVulkan = false; bool listTests = false; bool useSwiftShader = false; std::string output_dir; for (int arg = 1; arg < argc; ++arg) { if (strcmp(argv[arg], "--vulkan") == 0) { useVulkan = true; } else if (strcmp(argv[arg], "--gtest_list_tests") == 0) { listTests = true; } else if (strcmp(argv[arg], "--swiftshader") == 0) { useSwiftShader = true; } else if (strstr(argv[arg], kRenderTestOutputDir)) { output_dir = argv[arg] + strlen(kRenderTestOutputDir); } } if (listTests) { testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); } if (useVulkan) { #if defined(ANGLE_ENABLE_VULKAN) angle::vk::ICD preferredICD = useSwiftShader ? angle::vk::ICD::SwiftShader : angle::vk::ICD::Default; angle::GetSystemInfoVulkanWithICD(&info, preferredICD); #else ANGLE_UNUSED_VARIABLE(useSwiftShader); printf("Vulkan not supported.\n"); return EXIT_FAILURE; #endif // defined(ANGLE_ENABLE_VULKAN) } else { angle::GetSystemInfo(&info); } if (info.gpus.empty()) { gFailedToFindGPU = true; } js::Document doc; doc.SetObject(); js::Document::AllocatorType &allocator = doc.GetAllocator(); doc.AddMember("activeGPUIndex", info.activeGPUIndex, allocator); doc.AddMember("isOptimus", info.isOptimus, allocator); doc.AddMember("isMacSwitchable", info.isMacSwitchable, allocator); js::Value machineManufacturer; machineManufacturer.SetString(info.machineManufacturer.c_str(), allocator); doc.AddMember("machineManufacturer", machineManufacturer, allocator); js::Value machineModelVersion; machineModelVersion.SetString(info.machineModelVersion.c_str(), allocator); doc.AddMember("machineModelVersion", machineModelVersion, allocator); js::Value androidSdkLevel; androidSdkLevel.SetInt(info.androidSdkLevel); doc.AddMember("androidSdkLevel", androidSdkLevel, allocator); js::Value gpus; gpus.SetArray(); for (const angle::GPUDeviceInfo &gpu : info.gpus) { js::Value obj; obj.SetObject(); obj.AddMember("vendorId", gpu.vendorId, allocator); obj.AddMember("deviceId", gpu.deviceId, allocator); js::Value driverVendor; driverVendor.SetString(gpu.driverVendor.c_str(), allocator); obj.AddMember("driverVendor", driverVendor, allocator); js::Value driverVersion; driverVersion.SetString(gpu.driverVersion.c_str(), allocator); obj.AddMember("driverVersion", driverVersion, allocator); js::Value driverDate; driverDate.SetString(gpu.driverDate.c_str(), allocator); obj.AddMember("driverDate", driverDate, allocator); js::Value versionInfo; versionInfo.SetObject(); versionInfo.AddMember("major", gpu.detailedDriverVersion.major, allocator); versionInfo.AddMember("minor", gpu.detailedDriverVersion.minor, allocator); versionInfo.AddMember("subMinor", gpu.detailedDriverVersion.subMinor, allocator); versionInfo.AddMember("patch", gpu.detailedDriverVersion.patch, allocator); obj.AddMember("detailedDriverVersion", versionInfo, allocator); gpus.PushBack(obj, allocator); } doc.AddMember("gpus", gpus, allocator); js::StringBuffer buffer; js::PrettyWriter writer(buffer); doc.Accept(writer); const char *output = buffer.GetString(); printf("%s\n", output); if (!output_dir.empty()) { std::string outputFile = output_dir + "/angle_system_info.json"; FILE *fp = fopen(outputFile.c_str(), "w"); if (fp) { fwrite(output, sizeof(char), strlen(output), fp); fclose(fp); } } testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); } TEST(ANGLE, SystemInfo) { if (gFailedToFindGPU) { FAIL() << "Failed to find GPU info."; } }