Skip to content

Commit 8e5385d

Browse files
committed
[Impeller] Add DriverInfoVK::IsEmulator and a log dumper for driver info.
For flutter#52087
1 parent d56a231 commit 8e5385d

File tree

3 files changed

+117
-0
lines changed

3 files changed

+117
-0
lines changed

impeller/renderer/backend/vulkan/driver_info_vk.cc

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,11 @@
44

55
#include "impeller/renderer/backend/vulkan/driver_info_vk.h"
66

7+
#include <iomanip>
8+
#include <sstream>
9+
10+
#include "flutter/fml/build_config.h"
11+
712
namespace impeller {
813

914
constexpr VendorVK IdentifyVendor(uint32_t vendor) {
@@ -41,6 +46,48 @@ constexpr VendorVK IdentifyVendor(uint32_t vendor) {
4146
return VendorVK::kUnknown;
4247
}
4348

49+
constexpr const char* VendorToString(VendorVK vendor) {
50+
switch (vendor) {
51+
case VendorVK::kUnknown:
52+
return "Unknown";
53+
case VendorVK::kGoogle:
54+
return "Google";
55+
case VendorVK::kQualcomm:
56+
return "Qualcomm";
57+
case VendorVK::kARM:
58+
return "ARM";
59+
case VendorVK::kImgTec:
60+
return "ImgTec PowerVR";
61+
case VendorVK::kAMD:
62+
return "AMD";
63+
case VendorVK::kNvidia:
64+
return "Nvidia";
65+
case VendorVK::kIntel:
66+
return "Intel";
67+
case VendorVK::kMesa:
68+
return "Mesa";
69+
case VendorVK::kApple:
70+
return "Apple";
71+
}
72+
FML_UNREACHABLE();
73+
}
74+
75+
constexpr const char* DeviceTypeToString(DeviceTypeVK type) {
76+
switch (type) {
77+
case DeviceTypeVK::kUnknown:
78+
return "Unknown";
79+
case DeviceTypeVK::kIntegratedGPU:
80+
return "Integrated GPU";
81+
case DeviceTypeVK::kDiscreteGPU:
82+
return "Discrete GPU";
83+
case DeviceTypeVK::kVirtualGPU:
84+
return "Virtual GPU";
85+
case DeviceTypeVK::kCPU:
86+
return "CPU";
87+
}
88+
FML_UNREACHABLE();
89+
}
90+
4491
constexpr DeviceTypeVK ToDeviceType(const vk::PhysicalDeviceType& type) {
4592
switch (type) {
4693
case vk::PhysicalDeviceType::eOther:
@@ -92,4 +139,49 @@ const std::string& DriverInfoVK::GetDriverName() const {
92139
return driver_name_;
93140
}
94141

142+
void DriverInfoVK::DumpToLog() const {
143+
std::vector<std::pair<std::string, std::string>> items;
144+
items.emplace_back("Name", driver_name_);
145+
items.emplace_back("API Version", api_version_.ToString());
146+
items.emplace_back("Vendor", VendorToString(vendor_));
147+
items.emplace_back("Device Type", DeviceTypeToString(type_));
148+
items.emplace_back("Is Emulator", std::to_string(IsEmulator()));
149+
150+
size_t padding = 0;
151+
152+
for (const auto& item : items) {
153+
padding = std::max(padding, item.first.size());
154+
}
155+
156+
padding += 1;
157+
158+
std::stringstream stream;
159+
160+
stream << std::endl;
161+
162+
stream << "--- Driver Information ------------------------------------------";
163+
164+
stream << std::endl;
165+
166+
for (const auto& item : items) {
167+
stream << "| " << std::setw(static_cast<int>(padding)) << item.first
168+
<< std::setw(0) << ": " << item.second << std::endl;
169+
}
170+
171+
stream << "-----------------------------------------------------------------";
172+
173+
FML_LOG(IMPORTANT) << stream.str();
174+
}
175+
176+
bool DriverInfoVK::IsEmulator() const {
177+
#if FML_OS_ANDROID
178+
// Google SwiftShader on Android.
179+
if (type_ == DeviceTypeVK::kCPU && vendor_ == VendorVK::kGoogle &&
180+
driver_name_.find("SwiftShader") != std::string::npos) {
181+
return true;
182+
}
183+
#endif // FML_OS_ANDROID
184+
return false;
185+
}
186+
95187
} // namespace impeller

impeller/renderer/backend/vulkan/driver_info_vk.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,21 @@ class DriverInfoVK {
107107
///
108108
const std::string& GetDriverName() const;
109109

110+
//----------------------------------------------------------------------------
111+
/// @brief Dumps the current driver info to the log.
112+
///
113+
void DumpToLog() const;
114+
115+
//----------------------------------------------------------------------------
116+
/// @brief Determines if the driver represents an emulator. There is no
117+
/// definitive way to tell if a driver is an emulator and drivers
118+
/// don't self identify as emulators. So take this information
119+
/// with a pinch of salt.
120+
///
121+
/// @return True if emulator, False otherwise.
122+
///
123+
bool IsEmulator() const;
124+
110125
private:
111126
bool is_valid_ = false;
112127
Version api_version_;

impeller/renderer/backend/vulkan/driver_info_vk_unittests.cc

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,14 @@ TEST_P(DriverInfoVKTest, CanQueryDriverInfo) {
2323
ASSERT_NE(driver_info->GetDriverName(), "");
2424
}
2525

26+
TEST_P(DriverInfoVKTest, CanDumpToLog) {
27+
ASSERT_TRUE(GetContext());
28+
const auto& driver_info =
29+
SurfaceContextVK::Cast(*GetContext()).GetParent().GetDriverInfo();
30+
ASSERT_NE(driver_info, nullptr);
31+
fml::testing::LogCapture log;
32+
driver_info->DumpToLog();
33+
ASSERT_TRUE(log.str().find("Driver Information") != std::string::npos);
34+
}
35+
2636
} // namespace impeller::testing

0 commit comments

Comments
 (0)