=?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: wined3d: Make wined3d_gpu_description from Vulkan physical device properties.

Alexandre Julliard julliard at winehq.org
Tue Apr 30 15:59:56 CDT 2019


Module: wine
Branch: master
Commit: cf9623e68f1dbd87102ee4593f3ef61e53ebe219
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=cf9623e68f1dbd87102ee4593f3ef61e53ebe219

Author: Józef Kucia <jkucia at codeweavers.com>
Date:   Tue Apr 30 13:06:39 2019 +0200

wined3d: Make wined3d_gpu_description from Vulkan physical device properties.

This fallback for cards that are not present in wined3d database should be
quite accurate. Almost all information required to fill wined3d_gpu_description
can be retrieved from Vulkan. The GPU description string is expected to be
slightly different from Windows.

Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/wined3d/adapter_vk.c      | 42 ++++++++++++++++++++++++++++--------------
 dlls/wined3d/directx.c         |  2 +-
 dlls/wined3d/wined3d_private.h |  5 ++++-
 3 files changed, 33 insertions(+), 16 deletions(-)

diff --git a/dlls/wined3d/adapter_vk.c b/dlls/wined3d/adapter_vk.c
index 3709c94..2047e71 100644
--- a/dlls/wined3d/adapter_vk.c
+++ b/dlls/wined3d/adapter_vk.c
@@ -618,34 +618,53 @@ static VkPhysicalDevice get_vulkan_physical_device(struct wined3d_vk_info *vk_in
     return physical_devices[0];
 }
 
-const struct wined3d_gpu_description *get_vulkan_gpu_description(const VkPhysicalDeviceProperties *properties)
+static enum wined3d_display_driver guess_display_driver(enum wined3d_pci_vendor vendor)
 {
-    const struct wined3d_gpu_description *description;
+    switch (vendor)
+    {
+        case HW_VENDOR_AMD:    return DRIVER_AMD_RX;
+        case HW_VENDOR_INTEL:  return DRIVER_INTEL_HD4000;
+        case HW_VENDOR_NVIDIA: return DRIVER_NVIDIA_GEFORCE8;
+        default:               return DRIVER_WINE;
+    }
+}
+
+static void adapter_vk_init_driver_info(struct wined3d_adapter *adapter,
+        const VkPhysicalDeviceProperties *properties)
+{
+    const struct wined3d_gpu_description *gpu_description;
+    struct wined3d_gpu_description description;
 
     TRACE("Device name: %s.\n", debugstr_a(properties->deviceName));
     TRACE("Vendor ID: 0x%04x, Device ID: 0x%04x.\n", properties->vendorID, properties->deviceID);
     TRACE("Driver version: %#x.\n", properties->driverVersion);
     TRACE("API version: %s.\n", debug_vk_version(properties->apiVersion));
 
-    if (!(description = wined3d_get_user_override_gpu_description(properties->vendorID, properties->deviceID)))
-        description = wined3d_get_gpu_description(properties->vendorID, properties->deviceID);
+    if (!(gpu_description = wined3d_get_user_override_gpu_description(properties->vendorID, properties->deviceID)))
+        gpu_description = wined3d_get_gpu_description(properties->vendorID, properties->deviceID);
 
-    if (!description)
+    /* FIXME: Get vidmem from Vulkan. */
+    if (!gpu_description)
     {
         FIXME("Failed to retrieve GPU description for device %s %04x:%04x.\n",
                 debugstr_a(properties->deviceName), properties->vendorID, properties->deviceID);
 
-        description = wined3d_get_gpu_description(HW_VENDOR_AMD, CARD_AMD_RADEON_RX_VEGA);
+        description.vendor = properties->vendorID;
+        description.device = properties->deviceID;
+        description.description = properties->deviceName;
+        description.driver = guess_display_driver(properties->vendorID);
+        description.vidmem = 0;
+
+        gpu_description = &description;
     }
 
-    return description;
+    wined3d_driver_info_init(&adapter->driver_info, gpu_description, wined3d_settings.emulated_textureram);
 }
 
 static BOOL wined3d_adapter_vk_init(struct wined3d_adapter_vk *adapter_vk,
         unsigned int ordinal, unsigned int wined3d_creation_flags)
 {
     struct wined3d_vk_info *vk_info = &adapter_vk->vk_info;
-    const struct wined3d_gpu_description *gpu_description;
     struct wined3d_adapter *adapter = &adapter_vk->a;
     VkPhysicalDeviceIDProperties id_properties;
     VkPhysicalDeviceProperties2 properties2;
@@ -676,12 +695,7 @@ static BOOL wined3d_adapter_vk_init(struct wined3d_adapter_vk *adapter_vk,
         VK_CALL(vkGetPhysicalDeviceProperties(adapter_vk->physical_device, &properties2.properties));
     adapter_vk->device_limits = properties2.properties.limits;
 
-    if (!(gpu_description = get_vulkan_gpu_description(&properties2.properties)))
-    {
-        ERR("Failed to get GPU description.\n");
-        goto fail_vulkan;
-    }
-    wined3d_driver_info_init(&adapter->driver_info, gpu_description, wined3d_settings.emulated_textureram);
+    adapter_vk_init_driver_info(adapter, &properties2.properties);
 
     memcpy(&adapter->driver_uuid, id_properties.driverUUID, sizeof(adapter->driver_uuid));
     memcpy(&adapter->device_uuid, id_properties.deviceUUID, sizeof(adapter->device_uuid));
diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index 30acebd..b8c151d 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -615,7 +615,7 @@ void wined3d_driver_info_init(struct wined3d_driver_info *driver_info,
 
     driver_info->vendor = gpu_desc->vendor;
     driver_info->device = gpu_desc->device;
-    driver_info->description = gpu_desc->description;
+    wined3d_copy_name(driver_info->description, gpu_desc->description, ARRAY_SIZE(driver_info->description));
     driver_info->vram_bytes = vram_bytes ? vram_bytes : (UINT64)gpu_desc->vidmem * 1024 * 1024;
     driver = gpu_desc->driver;
 
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 8e0aef5..00e1de6 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -2675,12 +2675,15 @@ const struct wined3d_gpu_description *wined3d_get_user_override_gpu_description(
 enum wined3d_pci_device wined3d_gpu_from_feature_level(enum wined3d_pci_vendor *vendor,
         enum wined3d_feature_level feature_level) DECLSPEC_HIDDEN;
 
+/* 512 in Direct3D 8/9, 128 in DXGI. */
+#define WINED3D_MAX_DEVICE_IDENTIFIER_LENGTH 512
+
 struct wined3d_driver_info
 {
     enum wined3d_pci_vendor vendor;
     enum wined3d_pci_device device;
     const char *name;
-    const char *description;
+    char description[WINED3D_MAX_DEVICE_IDENTIFIER_LENGTH];
     UINT64 vram_bytes;
     UINT64 sysmem_bytes;
     DWORD version_high;




More information about the wine-cvs mailing list