blob: 124303e50b85ecd57a0581507161896e6f44c70d [file] [log] [blame]
//
// 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 <gtest/gtest.h>
#include <rapidjson/document.h>
#include <rapidjson/prettywriter.h>
#include <rapidjson/stringbuffer.h>
#include <cstdlib>
#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<js::StringBuffer> 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.";
}
}