[PATCH 1/3] wined3d: Initialise the primary adapter with a valid LUID.

Zhiyi Zhang zzhang at codeweavers.com
Mon Jul 6 03:20:47 CDT 2020


Signed-off-by: Zhiyi Zhang <zzhang at codeweavers.com>
---
 dlls/d3d12/tests/d3d12.c |  2 +-
 dlls/dxgi/tests/dxgi.c   |  4 +--
 dlls/wined3d/directx.c   | 54 ++++++++++++++++++++++++++++++++++------
 3 files changed, 49 insertions(+), 11 deletions(-)

diff --git a/dlls/d3d12/tests/d3d12.c b/dlls/d3d12/tests/d3d12.c
index 0200047fd17..8c57f07357c 100644
--- a/dlls/d3d12/tests/d3d12.c
+++ b/dlls/d3d12/tests/d3d12.c
@@ -139,7 +139,7 @@ static void print_adapter_info(void)
     hr = CreateDXGIFactory2(0, &IID_IDXGIFactory4, (void **)&factory);
     ok(hr == S_OK, "Failed to create factory, hr %#x.\n", hr);
     hr = IDXGIFactory4_EnumAdapterByLuid(factory, luid, &IID_IDXGIAdapter, (void **)&adapter);
-    todo_wine ok(hr == S_OK, "Failed to enum adapter by LUID, hr %#x.\n", hr);
+    ok(hr == S_OK, "Failed to enum adapter by LUID, hr %#x.\n", hr);
     IDXGIFactory4_Release(factory);
 
     if (FAILED(hr))
diff --git a/dlls/dxgi/tests/dxgi.c b/dlls/dxgi/tests/dxgi.c
index 8f52e1d9e72..d50c4f14566 100644
--- a/dlls/dxgi/tests/dxgi.c
+++ b/dlls/dxgi/tests/dxgi.c
@@ -958,7 +958,7 @@ static void test_adapter_luid(void)
     ok(hr == DXGI_ERROR_NOT_FOUND, "Got unexpected hr %#x.\n", hr);
 
     /* Older versions of WARP aren't enumerated by IDXGIFactory_EnumAdapters(). */
-    todo_wine ok(found_adapter_count == 1 || broken(is_null_luid_adapter),
+    ok(found_adapter_count == 1 || broken(is_null_luid_adapter),
             "Found %u adapters for LUID %08x:%08x.\n",
             found_adapter_count, device_adapter_desc.AdapterLuid.HighPart,
             device_adapter_desc.AdapterLuid.LowPart);
@@ -981,7 +981,7 @@ static void test_adapter_luid(void)
 
     hr = IDXGIFactory4_EnumAdapterByLuid(factory4, device_adapter_desc.AdapterLuid,
             &IID_IDXGIAdapter, (void **)&adapter);
-    todo_wine ok(hr == S_OK, "Failed to enum adapter by LUID, hr %#x.\n", hr);
+    ok(hr == S_OK, "Failed to enum adapter by LUID, hr %#x.\n", hr);
     if (SUCCEEDED(hr))
     {
         hr = IDXGIAdapter_GetDesc(adapter, &desc);
diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index 456cb9ad124..e77283832ca 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -2942,6 +2942,41 @@ static struct wined3d_adapter *wined3d_adapter_no3d_create(unsigned int ordinal,
     return adapter;
 }
 
+static BOOL get_primary_display(WCHAR *display)
+{
+    DISPLAY_DEVICEW display_device;
+    DWORD device_idx = 0;
+
+    display_device.cb = sizeof(display_device);
+    while (EnumDisplayDevicesW(NULL, device_idx++, &display_device, 0))
+    {
+        if (display_device.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE)
+        {
+            lstrcpyW(display, display_device.DeviceName);
+            return TRUE;
+        }
+    }
+
+    return FALSE;
+}
+
+static BOOL wined3d_adapter_init_luid(struct wined3d_adapter *adapter)
+{
+    D3DKMT_OPENADAPTERFROMGDIDISPLAYNAME open_adapter_param;
+    D3DKMT_CLOSEADAPTER close_adapter_param;
+
+    if (!get_primary_display(open_adapter_param.DeviceName))
+        return FALSE;
+
+    if (D3DKMTOpenAdapterFromGdiDisplayName(&open_adapter_param))
+        return FALSE;
+
+    adapter->luid = open_adapter_param.AdapterLuid;
+    close_adapter_param.hAdapter = open_adapter_param.hAdapter;
+    D3DKMTCloseAdapter(&close_adapter_param);
+    return TRUE;
+}
+
 BOOL wined3d_adapter_init(struct wined3d_adapter *adapter, unsigned int ordinal,
         const struct wined3d_adapter_ops *adapter_ops)
 {
@@ -2953,6 +2988,17 @@ BOOL wined3d_adapter_init(struct wined3d_adapter *adapter, unsigned int ordinal,
     adapter->ordinal = ordinal;
     adapter->output_count = 0;
 
+    if (!wined3d_adapter_init_luid(adapter))
+    {
+        WARN("Allocating a random LUID.\n");
+        if (!AllocateLocallyUniqueId(&adapter->luid))
+        {
+            ERR("Failed to allocate a LUID, error %#x.\n", GetLastError());
+            return FALSE;
+        }
+    }
+    TRACE("adapter %p LUID %08x:%08x.\n", adapter, adapter->luid.HighPart, adapter->luid.LowPart);
+
     display_device.cb = sizeof(display_device);
     EnumDisplayDevicesW(NULL, ordinal, &display_device, 0);
     TRACE("Display device: %s.\n", debugstr_w(display_device.DeviceName));
@@ -2972,14 +3018,6 @@ BOOL wined3d_adapter_init(struct wined3d_adapter *adapter, unsigned int ordinal,
     }
     adapter->output_count = 1;
 
-    if (!AllocateLocallyUniqueId(&adapter->luid))
-    {
-        ERR("Failed to set adapter LUID (%#x).\n", GetLastError());
-        goto done;
-    }
-    TRACE("Allocated LUID %08x:%08x for adapter %p.\n",
-            adapter->luid.HighPart, adapter->luid.LowPart, adapter);
-
     memset(&adapter->driver_uuid, 0, sizeof(adapter->driver_uuid));
     memset(&adapter->device_uuid, 0, sizeof(adapter->device_uuid));
 
-- 
2.25.1




More information about the wine-devel mailing list