Browse Source

Fix OS.get_video_adapter_driver_info crash

zCubed3 2 years ago
parent
commit
e7091d07cd
3 changed files with 9 additions and 1 deletions
  1. 1 1
      doc/classes/OS.xml
  2. 4 0
      platform/linuxbsd/os_linuxbsd.cpp
  3. 4 0
      platform/windows/os_windows.cpp

+ 1 - 1
doc/classes/OS.xml

@@ -451,7 +451,7 @@
 				Returns the video adapter driver name and version for the user's currently active graphics card.
 				Returns the video adapter driver name and version for the user's currently active graphics card.
 				The first element holds the driver name, such as [code]nvidia[/code], [code]amdgpu[/code], etc.
 				The first element holds the driver name, such as [code]nvidia[/code], [code]amdgpu[/code], etc.
 				The second element holds the driver version. For e.g. the [code]nvidia[/code] driver on a Linux/BSD platform, the version is in the format [code]510.85.02[/code]. For Windows, the driver's format is [code]31.0.15.1659[/code].
 				The second element holds the driver version. For e.g. the [code]nvidia[/code] driver on a Linux/BSD platform, the version is in the format [code]510.85.02[/code]. For Windows, the driver's format is [code]31.0.15.1659[/code].
-				[b]Note:[/b] This method is only supported on the platforms Linux/BSD and Windows. It returns an empty array on other platforms.
+				[b]Note:[/b] This method is only supported on the platforms Linux/BSD and Windows when not running in headless mode. It returns an empty array on other platforms.
 			</description>
 			</description>
 		</method>
 		</method>
 		<method name="has_environment" qualifiers="const">
 		<method name="has_environment" qualifiers="const">

+ 4 - 0
platform/linuxbsd/os_linuxbsd.cpp

@@ -246,6 +246,10 @@ String OS_LinuxBSD::get_version() const {
 }
 }
 
 
 Vector<String> OS_LinuxBSD::get_video_adapter_driver_info() const {
 Vector<String> OS_LinuxBSD::get_video_adapter_driver_info() const {
+	if (RenderingServer::get_singleton()->get_rendering_device() == nullptr) {
+		return Vector<String>();
+	}
+
 	const String rendering_device_name = RenderingServer::get_singleton()->get_rendering_device()->get_device_name(); // e.g. `NVIDIA GeForce GTX 970`
 	const String rendering_device_name = RenderingServer::get_singleton()->get_rendering_device()->get_device_name(); // e.g. `NVIDIA GeForce GTX 970`
 	const String rendering_device_vendor = RenderingServer::get_singleton()->get_rendering_device()->get_device_vendor_name(); // e.g. `NVIDIA`
 	const String rendering_device_vendor = RenderingServer::get_singleton()->get_rendering_device()->get_device_vendor_name(); // e.g. `NVIDIA`
 	const String card_name = rendering_device_name.trim_prefix(rendering_device_vendor).strip_edges(); // -> `GeForce GTX 970`
 	const String card_name = rendering_device_name.trim_prefix(rendering_device_vendor).strip_edges(); // -> `GeForce GTX 970`

+ 4 - 0
platform/windows/os_windows.cpp

@@ -311,6 +311,10 @@ String OS_Windows::get_version() const {
 }
 }
 
 
 Vector<String> OS_Windows::get_video_adapter_driver_info() const {
 Vector<String> OS_Windows::get_video_adapter_driver_info() const {
+	if (RenderingServer::get_singleton()->get_rendering_device() == nullptr) {
+		return Vector<String>();
+	}
+
 	REFCLSID clsid = CLSID_WbemLocator; // Unmarshaler CLSID
 	REFCLSID clsid = CLSID_WbemLocator; // Unmarshaler CLSID
 	REFIID uuid = IID_IWbemLocator; // Interface UUID
 	REFIID uuid = IID_IWbemLocator; // Interface UUID
 	IWbemLocator *wbemLocator = NULL; // to get the services
 	IWbemLocator *wbemLocator = NULL; // to get the services