Respect integrated GPU preference in Windows Settings
This commit is contained in:
parent
97b8ad1af0
commit
4091abd727
|
@ -137,6 +137,7 @@ public:
|
||||||
int get_display_driver_id() const { return _display_driver_id; }
|
int get_display_driver_id() const { return _display_driver_id; }
|
||||||
|
|
||||||
virtual Vector<String> get_video_adapter_driver_info() const = 0;
|
virtual Vector<String> get_video_adapter_driver_info() const = 0;
|
||||||
|
virtual bool get_user_prefers_integrated_gpu() const { return false; }
|
||||||
|
|
||||||
void print_error(const char *p_function, const char *p_file, int p_line, const char *p_code, const char *p_rationale, bool p_editor_notify = false, Logger::ErrorType p_type = Logger::ERR_ERROR);
|
void print_error(const char *p_function, const char *p_file, int p_line, const char *p_code, const char *p_rationale, bool p_editor_notify = false, Logger::ErrorType p_type = Logger::ERR_ERROR);
|
||||||
void print(const char *p_format, ...) _PRINTF_FORMAT_ATTRIBUTE_2_3;
|
void print(const char *p_format, ...) _PRINTF_FORMAT_ATTRIBUTE_2_3;
|
||||||
|
|
|
@ -622,6 +622,54 @@ Vector<String> OS_Windows::get_video_adapter_driver_info() const {
|
||||||
return info;
|
return info;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool OS_Windows::get_user_prefers_integrated_gpu() const {
|
||||||
|
// On Windows 10, the preferred GPU configured in Windows Settings is
|
||||||
|
// stored in the registry under the key
|
||||||
|
// `HKEY_CURRENT_USER\SOFTWARE\Microsoft\DirectX\UserGpuPreferences`
|
||||||
|
// with the name being the EXE path. The value is in the form of
|
||||||
|
// `GpuPreference=1;`, with the value being 1 for integrated GPU and 2
|
||||||
|
// for discrete GPU. On Windows 11, there may be more flags, separated
|
||||||
|
// by semicolons.
|
||||||
|
|
||||||
|
WCHAR exe_path[32768];
|
||||||
|
if (GetModuleFileNameW(nullptr, exe_path, sizeof(exe_path) / sizeof(exe_path[0])) >= sizeof(exe_path) / sizeof(exe_path[0])) {
|
||||||
|
// Paths should never be longer than 32767, but just in case.
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
LPCWSTR subkey = L"SOFTWARE\\Microsoft\\DirectX\\UserGpuPreferences";
|
||||||
|
HKEY hkey = nullptr;
|
||||||
|
LSTATUS result = RegOpenKeyExW(HKEY_CURRENT_USER, subkey, 0, KEY_READ, &hkey);
|
||||||
|
if (result != ERROR_SUCCESS) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
DWORD size = 0;
|
||||||
|
result = RegGetValueW(hkey, nullptr, exe_path, RRF_RT_REG_SZ, nullptr, nullptr, &size);
|
||||||
|
if (result != ERROR_SUCCESS || size == 0) {
|
||||||
|
RegCloseKey(hkey);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
Vector<WCHAR> buffer;
|
||||||
|
buffer.resize(size / sizeof(WCHAR));
|
||||||
|
result = RegGetValueW(hkey, nullptr, exe_path, RRF_RT_REG_SZ, nullptr, (LPBYTE)buffer.ptrw(), &size);
|
||||||
|
if (result != ERROR_SUCCESS) {
|
||||||
|
RegCloseKey(hkey);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
RegCloseKey(hkey);
|
||||||
|
const String flags = String::utf16((const char16_t *)buffer.ptr(), size / sizeof(WCHAR));
|
||||||
|
|
||||||
|
for (const String &flag : flags.split(";", false)) {
|
||||||
|
if (flag == "GpuPreference=1") {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
OS::DateTime OS_Windows::get_datetime(bool p_utc) const {
|
OS::DateTime OS_Windows::get_datetime(bool p_utc) const {
|
||||||
SYSTEMTIME systemtime;
|
SYSTEMTIME systemtime;
|
||||||
if (p_utc) {
|
if (p_utc) {
|
||||||
|
|
|
@ -172,6 +172,7 @@ public:
|
||||||
virtual String get_version() const override;
|
virtual String get_version() const override;
|
||||||
|
|
||||||
virtual Vector<String> get_video_adapter_driver_info() const override;
|
virtual Vector<String> get_video_adapter_driver_info() const override;
|
||||||
|
virtual bool get_user_prefers_integrated_gpu() const override;
|
||||||
|
|
||||||
virtual void initialize_joypads() override {}
|
virtual void initialize_joypads() override {}
|
||||||
|
|
||||||
|
|
|
@ -82,11 +82,12 @@ static String _get_device_type_name(const RenderingContextDriver::Device &p_devi
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint32_t _get_device_type_score(const RenderingContextDriver::Device &p_device) {
|
static uint32_t _get_device_type_score(const RenderingContextDriver::Device &p_device) {
|
||||||
|
static const bool prefer_integrated = OS::get_singleton()->get_user_prefers_integrated_gpu();
|
||||||
switch (p_device.type) {
|
switch (p_device.type) {
|
||||||
case RenderingContextDriver::DEVICE_TYPE_INTEGRATED_GPU:
|
case RenderingContextDriver::DEVICE_TYPE_INTEGRATED_GPU:
|
||||||
return 4;
|
return prefer_integrated ? 5 : 4;
|
||||||
case RenderingContextDriver::DEVICE_TYPE_DISCRETE_GPU:
|
case RenderingContextDriver::DEVICE_TYPE_DISCRETE_GPU:
|
||||||
return 5;
|
return prefer_integrated ? 4 : 5;
|
||||||
case RenderingContextDriver::DEVICE_TYPE_VIRTUAL_GPU:
|
case RenderingContextDriver::DEVICE_TYPE_VIRTUAL_GPU:
|
||||||
return 3;
|
return 3;
|
||||||
case RenderingContextDriver::DEVICE_TYPE_CPU:
|
case RenderingContextDriver::DEVICE_TYPE_CPU:
|
||||||
|
|
Loading…
Reference in New Issue