From 033ea0c31b765bf473e2ec60325b507e42a3089e Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Mon, 3 Dec 2018 21:18:40 +0100 Subject: [PATCH] [d3d11] Find Vulkan device if DXGI adapter was not created by DXVK Tests the LUID, then the PCI device IDs, and finally falls back to the first Vulkan device available on the system. This allows DXVK's d3d11.dll to be used without its own dxgi.dll, as long as presentation support is implemented in some way. With the previous changes, based on zzhiyi/dxvk@0fc3a24d96a7a16e82e15b7d1f40115b10acf3b0 Co-authored-by: Zhiyi Zhang --- src/d3d11/d3d11_main.cpp | 40 +++++++++++++++++++++++++++++----------- 1 file changed, 29 insertions(+), 11 deletions(-) diff --git a/src/d3d11/d3d11_main.cpp b/src/d3d11/d3d11_main.cpp index 9450f2d32..266e4f280 100644 --- a/src/d3d11/d3d11_main.cpp +++ b/src/d3d11/d3d11_main.cpp @@ -2,6 +2,8 @@ #include "../dxgi/dxgi_adapter.h" +#include "../dxvk/dxvk_instance.h" + #include "d3d11_device.h" #include "d3d11_enums.h" #include "d3d11_interop.h" @@ -21,14 +23,31 @@ extern "C" { const D3D_FEATURE_LEVEL* pFeatureLevels, UINT FeatureLevels, ID3D11Device** ppDevice) { - Com dxvkAdapter = nullptr; + Rc dxvkAdapter; + Rc dxvkInstance; + + Com dxgiVkAdapter; - // The adapter must obviously be a DXVK-compatible adapter so - // that we can create a DXVK-compatible DXGI device from it. - if (FAILED(pAdapter->QueryInterface(__uuidof(IDXGIVkAdapter), - reinterpret_cast(&dxvkAdapter)))) { - Logger::err("D3D11CoreCreateDevice: Adapter is not a DXVK adapter"); - return E_INVALIDARG; + // Try to find the corresponding Vulkan device for the DXGI adapter + if (SUCCEEDED(pAdapter->QueryInterface(__uuidof(IDXGIVkAdapter), reinterpret_cast(&dxgiVkAdapter)))) { + dxvkAdapter = dxgiVkAdapter->GetDXVKAdapter(); + dxvkInstance = dxvkAdapter->instance(); + } else { + Logger::warn("D3D11CoreCreateDevice: Adapter is not a DXVK adapter"); + DXGI_ADAPTER_DESC desc; + pAdapter->GetDesc(&desc); + + dxvkInstance = new DxvkInstance(); + dxvkAdapter = dxvkInstance->findAdapterByLuid(&desc.AdapterLuid); + + if (dxvkAdapter == nullptr) + dxvkAdapter = dxvkInstance->findAdapterByDeviceId(desc.VendorId, desc.DeviceId); + + if (dxvkAdapter == nullptr) + dxvkAdapter = dxvkInstance->enumAdapters(0); + + if (dxvkAdapter == nullptr) + return E_FAIL; } // Feature levels to probe if the @@ -46,13 +65,12 @@ extern "C" { // Find the highest feature level supported by the device. // This works because the feature level array is ordered. - Rc adapter = dxvkAdapter->GetDXVKAdapter(); - UINT flId; + for (flId = 0 ; flId < FeatureLevels; flId++) { Logger::info(str::format("D3D11CoreCreateDevice: Probing ", pFeatureLevels[flId])); - if (D3D11Device::CheckFeatureLevelSupport(adapter, pFeatureLevels[flId])) + if (D3D11Device::CheckFeatureLevelSupport(dxvkAdapter, pFeatureLevels[flId])) break; } @@ -67,7 +85,7 @@ extern "C" { try { Logger::info(str::format("D3D11CoreCreateDevice: Using feature level ", fl)); Com device = new D3D11DXGIDevice( - pAdapter, adapter.ptr(), fl, Flags); + pAdapter, dxvkAdapter.ptr(), fl, Flags); return device->QueryInterface( __uuidof(ID3D11Device),