From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/d3d12/d3d12_main.c | 43 ++++++++++++++++++++++++++++++++++++++++ dlls/d3d12/tests/d3d12.c | 8 ++------ 2 files changed, 45 insertions(+), 6 deletions(-)
diff --git a/dlls/d3d12/d3d12_main.c b/dlls/d3d12/d3d12_main.c index 2dddfe60efe..3ba7db882fc 100644 --- a/dlls/d3d12/d3d12_main.c +++ b/dlls/d3d12/d3d12_main.c @@ -29,6 +29,7 @@ #include <vkd3d.h>
#include "initguid.h" +#include "dxcore.h" #include "wine/wined3d.h" #include "wine/winedxgi.h" #include "wine/debug.h" @@ -79,10 +80,41 @@ static HRESULT d3d12_signal_event(HANDLE event) return SetEvent(event) ? S_OK : E_FAIL; }
+static HRESULT d3d12_get_dxgi_adapter_for_dxcore_adapter(IDXCoreAdapter *adapter, + IDXGIAdapter **dxgi_adapter) +{ + IDXGIFactory4 *factory; + HRESULT hr; + LUID luid; + + if (FAILED(hr = IDXCoreAdapter_GetProperty(adapter, InstanceLuid, sizeof(luid), &luid))) + { + WARN("Failed to get LUID for dxcore adapter, hr %#lx.\n", hr); + return hr; + } + + if (FAILED(hr = CreateDXGIFactory2(0, &IID_IDXGIFactory4, (void **)&factory))) + { + WARN("Failed to create DXGI factory, hr %#lx.\n", hr); + return hr; + } + + if (FAILED(hr = IDXGIFactory4_EnumAdapterByLuid(factory, luid, &IID_IDXGIAdapter, + (void **)dxgi_adapter))) + { + WARN("Failed to enumerate adapter by LUID, hr %#lx.\n", hr); + } + + IDXGIFactory4_Release(factory); + + return hr; +} + static HRESULT d3d12_get_adapter(IWineDXGIAdapter **wine_adapter, IUnknown *adapter) { IDXGIAdapter *dxgi_adapter = NULL; IDXGIFactory4 *factory = NULL; + IDXCoreAdapter *dxcore_adapter; HRESULT hr;
if (!adapter) @@ -101,6 +133,17 @@ static HRESULT d3d12_get_adapter(IWineDXGIAdapter **wine_adapter, IUnknown *adap
adapter = (IUnknown *)dxgi_adapter; } + else if (SUCCEEDED(IUnknown_QueryInterface(adapter, &IID_IDXCoreAdapter, (void **)&dxcore_adapter))) + { + if (FAILED(hr = d3d12_get_dxgi_adapter_for_dxcore_adapter(dxcore_adapter, &dxgi_adapter))) + { + WARN("Failed to create DXGI adapter for DXCore adapter, hr %#lx.\n", hr); + goto done; + } + IDXCoreAdapter_Release(dxcore_adapter); + + adapter = (IUnknown *)dxgi_adapter; + }
if (FAILED(hr = IUnknown_QueryInterface(adapter, &IID_IWineDXGIAdapter, (void **)wine_adapter))) WARN("Invalid adapter %p, hr %#lx.\n", adapter, hr); diff --git a/dlls/d3d12/tests/d3d12.c b/dlls/d3d12/tests/d3d12.c index 28e3a71f128..f906c75eede 100644 --- a/dlls/d3d12/tests/d3d12.c +++ b/dlls/d3d12/tests/d3d12.c @@ -968,13 +968,9 @@ static void test_create_device(void) IDXCoreAdapterList_Release(dxcore_list);
hr = D3D12CreateDevice((IUnknown *)dxcore_adapter, D3D_FEATURE_LEVEL_11_0, &IID_ID3D12Device, (void **)&device); - todo_wine ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr); - if (hr == S_OK) - { - refcount = ID3D12Device_Release(device); - ok(!refcount, "Device has %lu references left.\n", refcount); - } + refcount = ID3D12Device_Release(device); + ok(!refcount, "Device has %lu references left.\n", refcount);
IDXCoreAdapter_Release(dxcore_adapter);