Skip to content

Commit 4676d73

Browse files
committed
Merge pull request #110268 from bruvzg/devid_reg
[Windows] Try reading GPU IDs directly from registry.
2 parents 4eaa0ef + 252329c commit 4676d73

File tree

1 file changed

+87
-3
lines changed

1 file changed

+87
-3
lines changed

platform/windows/display_server_windows.cpp

Lines changed: 87 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6642,7 +6642,80 @@ GetImmersiveColorFromColorSetExPtr DisplayServerWindows::GetImmersiveColorFromCo
66426642
GetImmersiveColorTypeFromNamePtr DisplayServerWindows::GetImmersiveColorTypeFromName = nullptr;
66436643
GetImmersiveUserColorSetPreferencePtr DisplayServerWindows::GetImmersiveUserColorSetPreference = nullptr;
66446644

6645-
Vector2i _get_device_ids(const String &p_device_name) {
6645+
Vector2i _get_device_ids_reg(const String &p_device_name) {
6646+
Vector2i out;
6647+
6648+
String subkey = "SYSTEM\\CurrentControlSet\\Control\\Class\\{4d36e968-e325-11ce-bfc1-08002be10318}";
6649+
HKEY hkey = nullptr;
6650+
LSTATUS result = RegOpenKeyExW(HKEY_LOCAL_MACHINE, (LPCWSTR)subkey.utf16().get_data(), 0, KEY_READ, &hkey);
6651+
if (result != ERROR_SUCCESS) {
6652+
return Vector2i();
6653+
}
6654+
6655+
DWORD subkeys = 0;
6656+
result = RegQueryInfoKeyW(hkey, nullptr, nullptr, nullptr, &subkeys, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr);
6657+
if (result != ERROR_SUCCESS) {
6658+
RegCloseKey(hkey);
6659+
return Vector2i();
6660+
}
6661+
for (DWORD i = 0; i < subkeys; i++) {
6662+
WCHAR key_name[MAX_PATH] = L"";
6663+
DWORD key_name_size = MAX_PATH;
6664+
result = RegEnumKeyExW(hkey, i, key_name, &key_name_size, nullptr, nullptr, nullptr, nullptr);
6665+
if (result != ERROR_SUCCESS) {
6666+
continue;
6667+
}
6668+
String id = String::utf16((const char16_t *)key_name, key_name_size);
6669+
if (!id.is_empty()) {
6670+
HKEY sub_hkey = nullptr;
6671+
result = RegOpenKeyExW(HKEY_LOCAL_MACHINE, (LPCWSTR)(subkey + "\\" + id).utf16().get_data(), 0, KEY_QUERY_VALUE, &sub_hkey);
6672+
if (result != ERROR_SUCCESS) {
6673+
continue;
6674+
}
6675+
6676+
WCHAR buffer[4096];
6677+
DWORD buffer_len = 4096;
6678+
DWORD vtype = REG_SZ;
6679+
if (RegQueryValueExW(sub_hkey, L"DriverDesc", nullptr, &vtype, (LPBYTE)buffer, &buffer_len) != ERROR_SUCCESS || buffer_len == 0) {
6680+
buffer_len = 4096;
6681+
if (RegQueryValueExW(sub_hkey, L"HardwareInformation.AdapterString", nullptr, &vtype, (LPBYTE)buffer, &buffer_len) != ERROR_SUCCESS || buffer_len == 0) {
6682+
RegCloseKey(sub_hkey);
6683+
continue;
6684+
}
6685+
}
6686+
6687+
String driver_name = String::utf16((const char16_t *)buffer, buffer_len).strip_edges();
6688+
if (driver_name == p_device_name) {
6689+
String driver_id;
6690+
6691+
buffer_len = 4096;
6692+
if (RegQueryValueExW(sub_hkey, L"MatchingDeviceId", nullptr, &vtype, (LPBYTE)buffer, &buffer_len) == ERROR_SUCCESS && buffer_len != 0) {
6693+
driver_id = String::utf16((const char16_t *)buffer, buffer_len).strip_edges();
6694+
6695+
Vector<String> id_parts = driver_id.to_lower().split("&");
6696+
for (const String &id_part : id_parts) {
6697+
int ven_off = id_part.find("ven_");
6698+
if (ven_off >= 0) {
6699+
out.x = id_part.substr(ven_off + 4).hex_to_int();
6700+
}
6701+
int dev_off = id_part.find("dev_");
6702+
if (dev_off >= 0) {
6703+
out.y = id_part.substr(dev_off + 4).hex_to_int();
6704+
}
6705+
}
6706+
6707+
RegCloseKey(sub_hkey);
6708+
break;
6709+
}
6710+
}
6711+
RegCloseKey(sub_hkey);
6712+
}
6713+
}
6714+
RegCloseKey(hkey);
6715+
return out;
6716+
}
6717+
6718+
Vector2i _get_device_ids_wmi(const String &p_device_name) {
66466719
if (p_device_name.is_empty()) {
66476720
return Vector2i();
66486721
}
@@ -6704,6 +6777,14 @@ Vector2i _get_device_ids(const String &p_device_name) {
67046777
return ids;
67056778
}
67066779

6780+
Vector2i _get_device_ids(const String &p_device_name) {
6781+
Vector2i out = _get_device_ids_reg(p_device_name);
6782+
if (out == Vector2i()) {
6783+
out = _get_device_ids_wmi(p_device_name);
6784+
}
6785+
return out;
6786+
}
6787+
67076788
bool DisplayServerWindows::is_dark_mode_supported() const {
67086789
return ux_theme_available;
67096790
}
@@ -6824,9 +6905,12 @@ DisplayServerWindows::DisplayServerWindows(const String &p_rendering_driver, Win
68246905
os_ver.dwOSVersionInfoSize = sizeof(OSVERSIONINFOW);
68256906

68266907
HMODULE nt_lib = LoadLibraryW(L"ntdll.dll");
6908+
bool is_wine = false;
68276909
if (nt_lib) {
68286910
WineGetVersionPtr wine_get_version = (WineGetVersionPtr)(void *)GetProcAddress(nt_lib, "wine_get_version"); // Do not read Windows build number under Wine, it can be set to arbitrary value.
6829-
if (!wine_get_version) {
6911+
if (wine_get_version) {
6912+
is_wine = true;
6913+
} else {
68306914
RtlGetVersionPtr RtlGetVersion = (RtlGetVersionPtr)(void *)GetProcAddress(nt_lib, "RtlGetVersion");
68316915
if (RtlGetVersion) {
68326916
RtlGetVersion(&os_ver);
@@ -7072,7 +7156,7 @@ DisplayServerWindows::DisplayServerWindows(const String &p_rendering_driver, Win
70727156
}
70737157

70747158
bool gl_supported = true;
7075-
if (fallback && (rendering_driver == "opengl3")) {
7159+
if (fallback && !is_wine && (rendering_driver == "opengl3")) {
70767160
Dictionary gl_info = detect_wgl();
70777161

70787162
bool force_angle = false;

0 commit comments

Comments
 (0)