=?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: wined3d: Use Vulkan physical device properties to fill GPU description.
Alexandre Julliard
julliard at winehq.org
Fri Apr 5 16:04:59 CDT 2019
Module: wine
Branch: master
Commit: 79631ffff76b1ad8dcb74eb62af3194442b755b6
URL: https://source.winehq.org/git/wine.git/?a=commit;h=79631ffff76b1ad8dcb74eb62af3194442b755b6
Author: Józef Kucia <jkucia at codeweavers.com>
Date: Fri Apr 5 10:52:07 2019 +0200
wined3d: Use Vulkan physical device properties to fill GPU description.
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 | 60 +++++++++++++++++++++++++++++++++++++++++-
dlls/wined3d/wined3d_private.h | 1 +
2 files changed, 60 insertions(+), 1 deletion(-)
diff --git a/dlls/wined3d/adapter_vk.c b/dlls/wined3d/adapter_vk.c
index ca3a0f9..5c4bdd0 100644
--- a/dlls/wined3d/adapter_vk.c
+++ b/dlls/wined3d/adapter_vk.c
@@ -186,6 +186,61 @@ fail:
return FALSE;
}
+static VkPhysicalDevice get_vulkan_physical_device(struct wined3d_vk_info *vk_info)
+{
+ VkPhysicalDevice physical_devices[1];
+ uint32_t count;
+ VkResult vr;
+
+ if ((vr = VK_CALL(vkEnumeratePhysicalDevices(vk_info->instance, &count, NULL))) < 0)
+ {
+ WARN("Failed to enumerate physical devices, vr %d.\n", vr);
+ return VK_NULL_HANDLE;
+ }
+ if (!count)
+ {
+ WARN("No physical device.\n");
+ return VK_NULL_HANDLE;
+ }
+ if (count > 1)
+ {
+ /* TODO: Create wined3d_adapter for each device. */
+ FIXME("Multiple physical devices available.\n");
+ count = 1;
+ }
+
+ if ((vr = VK_CALL(vkEnumeratePhysicalDevices(vk_info->instance, &count, physical_devices))) < 0)
+ {
+ WARN("Failed to get physical devices, vr %d.\n", vr);
+ return VK_NULL_HANDLE;
+ }
+
+ return physical_devices[0];
+}
+
+const struct wined3d_gpu_description *get_vulkan_gpu_description(const struct wined3d_vk_info *vk_info,
+ VkPhysicalDevice physical_device)
+{
+ const struct wined3d_gpu_description *description;
+ VkPhysicalDeviceProperties properties;
+
+ VK_CALL(vkGetPhysicalDeviceProperties(physical_device, &properties));
+
+ 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: %u.%u.%u.\n", VK_VERSION_MAJOR(properties.apiVersion),
+ VK_VERSION_MINOR(properties.apiVersion), VK_VERSION_PATCH(properties.apiVersion));
+
+ if ((description = wined3d_get_gpu_description(properties.vendorID, properties.deviceID)))
+ return description;
+
+ FIXME("Failed to retrieve GPU description for device %s %04x:%04x.\n",
+ debugstr_a(properties.deviceName), properties.vendorID, properties.deviceID);
+
+ return wined3d_get_gpu_description(HW_VENDOR_AMD, CARD_AMD_RADEON_RX_VEGA);
+}
+
static BOOL wined3d_adapter_vk_init(struct wined3d_adapter_vk *adapter_vk,
unsigned int ordinal, unsigned int wined3d_creation_flags)
{
@@ -205,7 +260,10 @@ static BOOL wined3d_adapter_vk_init(struct wined3d_adapter_vk *adapter_vk,
goto fail;
}
- if (!(gpu_description = wined3d_get_gpu_description(HW_VENDOR_AMD, CARD_AMD_RADEON_RX_VEGA)))
+ if (!(adapter_vk->physical_device = get_vulkan_physical_device(vk_info)))
+ goto fail_vulkan;
+
+ if (!(gpu_description = get_vulkan_gpu_description(vk_info, adapter_vk->physical_device)))
{
ERR("Failed to get GPU description.\n");
goto fail_vulkan;
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 068ece6..a60a4f1 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -2755,6 +2755,7 @@ struct wined3d_adapter_vk
struct wined3d_adapter a;
struct wined3d_vk_info vk_info;
+ VkPhysicalDevice physical_device;
};
static inline struct wined3d_adapter_vk *wined3d_adapter_vk(struct wined3d_adapter *adapter)
More information about the wine-cvs
mailing list