Просмотр исходного кода

Fixed crash when no DirectX 3D adapter could be found (#525)

Jorrit Rouwe 2 лет назад
Родитель
Сommit
55810b9d4b

+ 6 - 1
TestFramework/Renderer/FatalErrorIfFailed.cpp

@@ -4,6 +4,8 @@
 
 #include <TestFramework.h>
 
+#include <system_error>
+
 #include <Renderer/FatalErrorIfFailed.h>
 #include <Jolt/Core/StringTools.h>
 #include <Utils/Log.h>
@@ -11,5 +13,8 @@
 void FatalErrorIfFailed(HRESULT inHResult)
 {
 	if (FAILED(inHResult))
-		FatalError("DirectX exception thrown: %s", ConvertToString(inHResult).c_str());
+	{
+		string message = system_category().message(inHResult);
+		FatalError("DirectX error returned: %s (%s)", ConvertToString(inHResult).c_str(), message.c_str());
+	}
 }

+ 9 - 3
TestFramework/Renderer/Renderer.cpp

@@ -202,9 +202,10 @@ void Renderer::Initialize()
 	// Find adapter
 	ComPtr<IDXGIAdapter1> adapter;
 
+	HRESULT result = E_FAIL;
+
 	// First check if we have the Windows 1803 IDXGIFactory6 interface
 	ComPtr<IDXGIFactory6> factory6;
-
 	if (SUCCEEDED(mDXGIFactory->QueryInterface(IID_PPV_ARGS(&factory6))))
 	{
 		for (UINT index = 0; DXGI_ERROR_NOT_FOUND != factory6->EnumAdapterByGpuPreference(index, DXGI_GPU_PREFERENCE_HIGH_PERFORMANCE, IID_PPV_ARGS(&adapter)); ++index)
@@ -217,7 +218,8 @@ void Renderer::Initialize()
 				continue;
 
 			// Check to see whether the adapter supports Direct3D 12
-			if (SUCCEEDED(D3D12CreateDevice(adapter.Get(), D3D_FEATURE_LEVEL_11_0, IID_PPV_ARGS(&mDevice))))
+			result = D3D12CreateDevice(adapter.Get(), D3D_FEATURE_LEVEL_11_0, IID_PPV_ARGS(&mDevice));
+			if (SUCCEEDED(result))
 				break;
 		}
 	}
@@ -234,10 +236,14 @@ void Renderer::Initialize()
 				continue;
 
 			// Check to see whether the adapter supports Direct3D 12
-			if (SUCCEEDED(D3D12CreateDevice(adapter.Get(), D3D_FEATURE_LEVEL_11_0, IID_PPV_ARGS(&mDevice))))
+			result = D3D12CreateDevice(adapter.Get(), D3D_FEATURE_LEVEL_11_0, IID_PPV_ARGS(&mDevice));
+			if (SUCCEEDED(result))
 				break;
 		}
 	}
+
+	// Check if we managed to obtain a device
+	FatalErrorIfFailed(result);
 	
 #ifdef _DEBUG
 	// Enable breaking on errors