[App] Only start D3D12 if DLL exists

This commit is contained in:
Triang3l 2019-08-03 22:33:09 +03:00
parent 9aaef8871d
commit 890a32bd98
5 changed files with 24 additions and 4 deletions

View File

@ -105,10 +105,12 @@ std::unique_ptr<gpu::GraphicsSystem> CreateGraphicsSystem() {
std::unique_ptr<gpu::GraphicsSystem> best;
#if XE_PLATFORM_WIN32
best = std::unique_ptr<gpu::GraphicsSystem>(
new xe::gpu::d3d12::D3D12GraphicsSystem());
if (best) {
return best;
if (xe::gpu::d3d12::D3D12GraphicsSystem::IsD3D12APIAvailable()) {
best = std::unique_ptr<gpu::GraphicsSystem>(
new xe::gpu::d3d12::D3D12GraphicsSystem());
if (best) {
return best;
}
}
#endif // XE_PLATFORM_WIN32
best = std::unique_ptr<gpu::GraphicsSystem>(

View File

@ -27,6 +27,10 @@ D3D12GraphicsSystem::D3D12GraphicsSystem() {}
D3D12GraphicsSystem::~D3D12GraphicsSystem() {}
bool D3D12GraphicsSystem::IsD3D12APIAvailable() {
return xe::ui::d3d12::D3D12Provider::IsD3D12APIAvailable();
}
std::wstring D3D12GraphicsSystem::name() const {
auto d3d12_command_processor =
static_cast<D3D12CommandProcessor*>(command_processor());

View File

@ -26,6 +26,8 @@ class D3D12GraphicsSystem : public GraphicsSystem {
D3D12GraphicsSystem();
~D3D12GraphicsSystem() override;
static bool IsD3D12APIAvailable();
std::wstring name() const override;
X_STATUS Setup(cpu::Processor* processor, kernel::KernelState* kernel_state,

View File

@ -27,6 +27,15 @@ namespace xe {
namespace ui {
namespace d3d12 {
bool D3D12Provider::IsD3D12APIAvailable() {
HMODULE library_d3d12 = LoadLibrary(L"D3D12.dll");
if (!library_d3d12) {
return false;
}
FreeLibrary(library_d3d12);
return true;
}
std::unique_ptr<D3D12Provider> D3D12Provider::Create(Window* main_window) {
std::unique_ptr<D3D12Provider> provider(new D3D12Provider(main_window));
InitializationResult result = provider->Initialize();
@ -81,6 +90,7 @@ D3D12Provider::InitializationResult D3D12Provider::Initialize() {
library_d3dcompiler_ = LoadLibrary(L"D3DCompiler_47.dll");
if (library_dxgi_ == nullptr || library_d3d12_ == nullptr ||
library_d3dcompiler_ == nullptr) {
XELOGE("Failed to load dxgi.dll, D3D12.dll and D3DCompiler_47.dll.");
return InitializationResult::kLibraryLoadFailed;
}
bool libraries_loaded = true;

View File

@ -23,6 +23,8 @@ class D3D12Provider : public GraphicsProvider {
public:
~D3D12Provider() override;
static bool IsD3D12APIAvailable();
static std::unique_ptr<D3D12Provider> Create(Window* main_window);
std::unique_ptr<GraphicsContext> CreateContext(