[RFC PATCH 6/9] wined3d: Use physical adapter name if available.

Zhiyi Zhang zzhang at codeweavers.com
Tue Dec 18 10:21:26 CST 2018


Signed-off-by: Zhiyi Zhang <zzhang at codeweavers.com>
---
 dlls/wined3d/directx.c         | 29 +++++++++++++++++++++++++----
 dlls/wined3d/wined3d_private.h |  1 +
 2 files changed, 26 insertions(+), 4 deletions(-)

diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index ee7b75a38c..31ddd0ed28 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -1166,6 +1166,7 @@ HRESULT CDECL wined3d_set_adapter_display_mode(struct wined3d *wined3d,
 HRESULT CDECL wined3d_get_adapter_identifier(const struct wined3d *wined3d,
         UINT adapter_idx, DWORD flags, struct wined3d_adapter_identifier *identifier)
 {
+    static const WCHAR x11_default_adapter_name[] = {'W', 'i', 'n', 'e', ' ', 'X', '1', '1', ' ', 'D', 'r', 'i', 'v', 'e', 'r', 0};
     const struct wined3d_adapter *adapter;
     size_t len;
 
@@ -1189,10 +1190,19 @@ HRESULT CDECL wined3d_get_adapter_identifier(const struct wined3d *wined3d,
 
     if (identifier->description_size)
     {
-        const char *description = adapter->driver_info.description;
-        len = min(strlen(description), identifier->description_size - 1);
-        memcpy(identifier->description, description, len);
-        memset(&identifier->description[len], 0, identifier->description_size - len);
+        if(!strcmpW(adapter->name, x11_default_adapter_name))
+        {
+            const char *description = adapter->driver_info.description;
+            len = min(strlen(description), identifier->description_size - 1);
+            memcpy(identifier->description, description, len);
+            memset(&identifier->description[len], 0, identifier->description_size - len);
+        }
+        else if (!WideCharToMultiByte(CP_ACP, 0, adapter->name, -1, identifier->description, identifier->description_size,
+                                 NULL, NULL))
+        {
+            ERR("Failed to convert adapter name, last error %#x.\n", GetLastError());
+            goto fail;
+        }
     }
 
     /* Note that d3d8 doesn't supply a device name. */
@@ -2536,6 +2546,9 @@ static BOOL wined3d_adapter_init(struct wined3d_adapter *adapter, unsigned int o
 
     adapter->ordinal = ordinal;
 
+    /* We need to differentiate the adapter->name and the adapter->device_name here.
+     * the device name from EnumDisplayDevicesW is \\.\\DISPLAY0 for example, which is the name of an output
+     * in DXGI concept, whereas adapter->name is the name of a physical adapter. */
     display_device.cb = sizeof(display_device);
     /* FIXME: EnumDisplayDevicesW is a stub. It doesn't support multiple displays and adapters.
      * Use the first device name for now. */
@@ -2597,6 +2610,14 @@ HRESULT wined3d_init(struct wined3d *wined3d, DWORD flags)
             goto fail;
         }
 
+        property_type = DEVPROP_TYPE_STRING;
+        if (!SetupDiGetDevicePropertyW(devinfo, &devinfo_data, &DEVPKEY_NAME, &property_type,
+                                       (BYTE *)&wined3d->adapters[i].name, sizeof(wined3d->adapters[i].name), NULL, 0))
+        {
+            WARN("Failed to get adapter %u name.\n", i);
+            goto fail;
+        }
+
         if (!wined3d_adapter_init(&wined3d->adapters[i], i, flags))
         {
             WARN("Failed to initialise adapter %u.\n", i);
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 8190327cce..6580464899 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -2679,6 +2679,7 @@ struct wined3d_adapter
     UINT64 vram_bytes_used;
     LUID luid;
 
+    WCHAR name[256];                  /* physical adapter name, for use with e.g. IDXGIAdapter::GetDesc */
     WCHAR device_name[CCHDEVICENAME]; /* for use with e.g. ChangeDisplaySettings() */
     unsigned int cfg_count;
     struct wined3d_pixel_format *cfgs;
-- 
2.19.2





More information about the wine-devel mailing list