diff options
Diffstat (limited to 'platform/windows')
| -rw-r--r-- | platform/windows/detect.py | 2 | ||||
| -rw-r--r-- | platform/windows/display_server_windows.cpp | 3 | ||||
| -rw-r--r-- | platform/windows/display_server_windows.h | 1 | ||||
| -rw-r--r-- | platform/windows/os_windows.cpp | 112 | ||||
| -rw-r--r-- | platform/windows/os_windows.h | 13 | 
5 files changed, 107 insertions, 24 deletions
| diff --git a/platform/windows/detect.py b/platform/windows/detect.py index a5d8d0344b..74868fc6a2 100644 --- a/platform/windows/detect.py +++ b/platform/windows/detect.py @@ -401,6 +401,7 @@ def configure_msvc(env, vcvars_msvc_config):          "Avrt",          "dwmapi",          "dwrite", +        "wbemuuid",      ]      if env["vulkan"]: @@ -577,6 +578,7 @@ def configure_mingw(env):              "uuid",              "dwmapi",              "dwrite", +            "wbemuuid",          ]      ) diff --git a/platform/windows/display_server_windows.cpp b/platform/windows/display_server_windows.cpp index 3b773685c3..bc767a47e5 100644 --- a/platform/windows/display_server_windows.cpp +++ b/platform/windows/display_server_windows.cpp @@ -3087,7 +3087,7 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA  					rect_changed = true;  				}  #if defined(VULKAN_ENABLED) -				if (context_vulkan && window_created) { +				if (context_vulkan && window.context_created) {  					// Note: Trigger resize event to update swapchains when window is minimized/restored, even if size is not changed.  					context_vulkan->window_resize(window_id, window.width, window.height);  				} @@ -3547,6 +3547,7 @@ DisplayServer::WindowID DisplayServerWindows::_create_window(WindowMode p_mode,  				windows.erase(id);  				ERR_FAIL_V_MSG(INVALID_WINDOW_ID, "Failed to create Vulkan Window.");  			} +			wd.context_created = true;  		}  #endif diff --git a/platform/windows/display_server_windows.h b/platform/windows/display_server_windows.h index 6403b57d8d..53cde001ae 100644 --- a/platform/windows/display_server_windows.h +++ b/platform/windows/display_server_windows.h @@ -369,6 +369,7 @@ class DisplayServerWindows : public DisplayServer {  		bool no_focus = false;  		bool window_has_focus = false;  		bool exclusive = false; +		bool context_created = false;  		// Used to transfer data between events using timer.  		WPARAM saved_wparam; diff --git a/platform/windows/os_windows.cpp b/platform/windows/os_windows.cpp index 241e0b382e..5ca064e523 100644 --- a/platform/windows/os_windows.cpp +++ b/platform/windows/os_windows.cpp @@ -53,6 +53,7 @@  #include <process.h>  #include <regstr.h>  #include <shlobj.h> +#include <wbemcli.h>  extern "C" {  __declspec(dllexport) DWORD NvOptimusEnablement = 1; @@ -309,6 +310,99 @@ String OS_Windows::get_version() const {  	return "";  } +Vector<String> OS_Windows::get_video_adapter_driver_info() const { +	REFCLSID clsid = CLSID_WbemLocator; // Unmarshaler CLSID +	REFIID uuid = IID_IWbemLocator; // Interface UUID +	IWbemLocator *wbemLocator = NULL; // to get the services +	IWbemServices *wbemServices = NULL; // to get the class +	IEnumWbemClassObject *iter = NULL; +	IWbemClassObject *pnpSDriverObject[1]; // contains driver name, version, etc. +	static String driver_name; +	static String driver_version; + +	const String device_name = RenderingServer::get_singleton()->get_rendering_device()->get_device_name(); +	if (device_name.is_empty()) { +		return Vector<String>(); +	} + +	CoInitialize(nullptr); + +	HRESULT hr = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER, uuid, (LPVOID *)&wbemLocator); +	if (hr != S_OK) { +		return Vector<String>(); +	} +	BSTR resource_name = SysAllocString(L"root\\CIMV2"); +	hr = wbemLocator->ConnectServer(resource_name, NULL, NULL, NULL, 0, NULL, NULL, &wbemServices); +	SysFreeString(resource_name); + +	SAFE_RELEASE(wbemLocator) // from now on, use `wbemServices` +	if (hr != S_OK) { +		SAFE_RELEASE(wbemServices) +		return Vector<String>(); +	} + +	const String gpu_device_class_query = vformat("SELECT * FROM Win32_PnPSignedDriver WHERE DeviceName = \"%s\"", device_name); +	BSTR query = SysAllocString((const WCHAR *)gpu_device_class_query.utf16().get_data()); +	BSTR query_lang = SysAllocString(L"WQL"); +	hr = wbemServices->ExecQuery(query_lang, query, WBEM_FLAG_RETURN_IMMEDIATELY | WBEM_FLAG_FORWARD_ONLY, NULL, &iter); +	SysFreeString(query_lang); +	SysFreeString(query); +	if (hr == S_OK) { +		ULONG resultCount; +		hr = iter->Next(5000, 1, pnpSDriverObject, &resultCount); // Get exactly 1. Wait max 5 seconds. + +		if (hr == S_OK && resultCount > 0) { +			VARIANT dn; +			VariantInit(&dn); + +			BSTR object_name = SysAllocString(L"DriverName"); +			hr = pnpSDriverObject[0]->Get(object_name, 0, &dn, NULL, NULL); +			SysFreeString(object_name); +			if (hr == S_OK) { +				String d_name = String(V_BSTR(&dn)); +				if (d_name.is_empty()) { +					object_name = SysAllocString(L"DriverProviderName"); +					hr = pnpSDriverObject[0]->Get(object_name, 0, &dn, NULL, NULL); +					SysFreeString(object_name); +					if (hr == S_OK) { +						driver_name = String(V_BSTR(&dn)); +					} +				} else { +					driver_name = d_name; +				} +			} else { +				object_name = SysAllocString(L"DriverProviderName"); +				hr = pnpSDriverObject[0]->Get(object_name, 0, &dn, NULL, NULL); +				SysFreeString(object_name); +				if (hr == S_OK) { +					driver_name = String(V_BSTR(&dn)); +				} +			} + +			VARIANT dv; +			VariantInit(&dv); +			object_name = SysAllocString(L"DriverVersion"); +			hr = pnpSDriverObject[0]->Get(object_name, 0, &dv, NULL, NULL); +			SysFreeString(object_name); +			if (hr == S_OK) { +				driver_version = String(V_BSTR(&dv)); +			} +			for (ULONG i = 0; i < resultCount; i++) { +				SAFE_RELEASE(pnpSDriverObject[i]) +			} +		} +	} + +	SAFE_RELEASE(wbemServices) +	SAFE_RELEASE(iter) + +	Vector<String> info; +	info.push_back(driver_name); +	info.push_back(driver_version); + +	return info; +} +  OS::DateTime OS_Windows::get_datetime(bool p_utc) const {  	SYSTEMTIME systemtime;  	if (p_utc) { @@ -1123,15 +1217,7 @@ Error OS_Windows::move_to_trash(const String &p_path) {  }  OS_Windows::OS_Windows(HINSTANCE _hInstance) { -	ticks_per_second = 0; -	ticks_start = 0; -	main_loop = nullptr; -	process_map = nullptr; -  	hInstance = _hInstance; -#ifdef STDOUT_FILE -	stdo = fopen("stdout.txt", "wb"); -#endif  #ifdef WASAPI_ENABLED  	AudioDriverManager::add_driver(&driver_wasapi); @@ -1147,11 +1233,8 @@ OS_Windows::OS_Windows(HINSTANCE _hInstance) {  	//  	// NOTE: The engine does not use ANSI escape codes to color error/warning messages; it uses Windows API calls instead.  	// Therefore, error/warning messages are still colored on Windows versions older than 10. -	HANDLE stdoutHandle; -	stdoutHandle = GetStdHandle(STD_OUTPUT_HANDLE); -	DWORD outMode = 0; -	outMode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING; - +	HANDLE stdoutHandle = GetStdHandle(STD_OUTPUT_HANDLE); +	DWORD outMode = ENABLE_PROCESSED_OUTPUT | ENABLE_VIRTUAL_TERMINAL_PROCESSING;  	if (!SetConsoleMode(stdoutHandle, outMode)) {  		// Windows 8.1 or below, or Windows 10 prior to Anniversary Update.  		print_verbose("Can't set the ENABLE_VIRTUAL_TERMINAL_PROCESSING Windows console mode. `print_rich()` will not work as expected."); @@ -1163,7 +1246,4 @@ OS_Windows::OS_Windows(HINSTANCE _hInstance) {  }  OS_Windows::~OS_Windows() { -#ifdef STDOUT_FILE -	fclose(stdo); -#endif  } diff --git a/platform/windows/os_windows.h b/platform/windows/os_windows.h index b792f6fa44..bf934bce64 100644 --- a/platform/windows/os_windows.h +++ b/platform/windows/os_windows.h @@ -84,13 +84,10 @@ public:  };  class JoypadWindows; -class OS_Windows : public OS { -#ifdef STDOUT_FILE -	FILE *stdo = nullptr; -#endif -	uint64_t ticks_start; -	uint64_t ticks_per_second; +class OS_Windows : public OS { +	uint64_t ticks_start = 0; +	uint64_t ticks_per_second = 0;  	HINSTANCE hInstance;  	MainLoop *main_loop = nullptr; @@ -130,7 +127,7 @@ protected:  		STARTUPINFO si;  		PROCESS_INFORMATION pi;  	}; -	HashMap<ProcessID, ProcessInfo> *process_map; +	HashMap<ProcessID, ProcessInfo> *process_map = nullptr;  public:  	virtual void alert(const String &p_alert, const String &p_title = "ALERT!") override; @@ -147,6 +144,8 @@ public:  	virtual String get_distribution_name() const override;  	virtual String get_version() const override; +	virtual Vector<String> get_video_adapter_driver_info() const override; +  	virtual void initialize_joypads() override {}  	virtual DateTime get_datetime(bool p_utc) const override; |