[PATCH] dxgi/tests: Check that the last adapter is always WARP.

Zhiyi Zhang zzhang at codeweavers.com
Wed Sep 30 04:39:35 CDT 2020


Hi Rémi,

I sent a v2 with some minor changes.

I have some questions. WARP is only always present on Win8+[1], if the game depends on the case,
what will happen on win7? I checked a Win7 machine and there is no WARP adapter in DXGI.

My multi-GPU work mostly contains changes to wined3d code. I think only DXGI reports such an extra
WARP adapter when a hardware GPU is present. So if you want to add a WARP adapter in DXGI, there
should be no conflicts.

Thanks,
Zhiyi

[1]: https://docs.microsoft.com/en-us/windows/win32/direct3ddxgi/d3d10-graphics-programming-guide-dxgi#new-info-about-enumerating-adapters-for-windows-8

On 9/30/20 4:20 PM, Rémi Bernon wrote:
> Some games specifically ignore the last adapter from the adapter list,
> as it's always WARP on Windows. This makes them fail to detect GPUs
> correctly on Wine, as they drop one of the reported adapters.
>
> Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
> ---
>
> I also have a patch to add a WARP adapter to the list in wined3d, but I
> think there's some multi-adapter work under way that will conflict, so
> I'll wait before sending it.
>
>  dlls/dxgi/tests/dxgi.c | 32 ++++++++++++++++++++++++++++++++
>  1 file changed, 32 insertions(+)
>
> diff --git a/dlls/dxgi/tests/dxgi.c b/dlls/dxgi/tests/dxgi.c
> index ce1aee5ee3b..589364271b1 100644
> --- a/dlls/dxgi/tests/dxgi.c
> +++ b/dlls/dxgi/tests/dxgi.c
> @@ -5325,11 +5325,14 @@ static void test_multi_adapter(void)
>  {
>      unsigned int output_count = 0, expected_output_count = 0;
>      unsigned int adapter_index, output_index, device_index;
> +    DXGI_ADAPTER_DESC1 adapter_desc1;
> +    DXGI_ADAPTER_DESC adapter_desc;
>      DXGI_OUTPUT_DESC old_output_desc, output_desc;
>      DISPLAY_DEVICEW display_device;
>      MONITORINFO monitor_info;
>      DEVMODEW old_mode, mode;
>      IDXGIFactory *factory;
> +    IDXGIAdapter1 *adapter1;
>      IDXGIAdapter *adapter;
>      IDXGIOutput *output;
>      HMONITOR monitor;
> @@ -5530,6 +5533,35 @@ static void test_multi_adapter(void)
>          IDXGIAdapter_Release(adapter);
>      }
>  
> +    todo_wine ok(adapter_index >= 2, "Unexpected adapter count %u\n", adapter_index);
> +
> +    hr = IDXGIFactory_EnumAdapters(factory, adapter_index - 1, &adapter);
> +    ok(SUCCEEDED(hr), "Failed to get last adapter %u, hr %#x.\n", adapter_index - 1, hr);
> +
> +    hr = IDXGIAdapter_GetDesc(adapter, &adapter_desc);
> +    ok(SUCCEEDED(hr), "GetDesc failed, hr %#x.\n", hr);
> +
> +    todo_wine ok(!lstrcmpW(adapter_desc.Description, L"Microsoft Basic Render Driver"),
> +            "Unexpected name for last adapter %s\n", wine_dbgstr_w(adapter_desc.Description));
> +    ok(adapter_desc.SubSysId == 0x0000, "Expected SubSysId 0x0000, got %#x\n", adapter_desc.SubSysId);
> +    todo_wine ok(adapter_desc.VendorId == 0x1414, "Expected VendorId 0x1414, got %#x\n", adapter_desc.VendorId);
> +    todo_wine ok(adapter_desc.DeviceId == 0x008c, "Expected DeviceId 0x008c, got %#x\n", adapter_desc.DeviceId);
> +    ok(adapter_desc.Revision == 0x0000, "Expected Revision 0x0000, got %#x\n", adapter_desc.Revision);
> +    todo_wine ok(adapter_desc.DedicatedVideoMemory == 0, "Expected DedicatedVideoMemory 0, got %#lx\n", adapter_desc.DedicatedVideoMemory);
> +    ok(adapter_desc.DedicatedSystemMemory == 0, "Expected DedicatedSystemMemory 0, got %#lx\n", adapter_desc.DedicatedSystemMemory);
> +
> +    hr = IDXGIAdapter_QueryInterface(adapter, &IID_IDXGIAdapter1, (void **)&adapter1);
> +    ok(SUCCEEDED(hr) || broken(hr == E_NOINTERFACE), "Got unexpected hr %#x.\n", hr);
> +    if (hr != E_NOINTERFACE)
> +    {
> +        hr = IDXGIAdapter1_GetDesc1(adapter1, &adapter_desc1);
> +        ok(SUCCEEDED(hr), "GetDesc1 failed, hr %#x.\n", hr);
> +        todo_wine ok(adapter_desc1.Flags == DXGI_ADAPTER_FLAG_SOFTWARE, "Expected flags DXGI_ADAPTER_FLAG_SOFTWARE, got %#x\n", adapter_desc1.Flags);
> +        IDXGIAdapter1_Release(adapter1);
> +    }
> +
> +    IDXGIAdapter_Release(adapter);
> +
>      IDXGIFactory_Release(factory);
>  
>      expected_output_count = GetSystemMetrics(SM_CMONITORS);




More information about the wine-devel mailing list