[PATCH 4/5] wined3d: Initialise driver and device UUID for Vulkan adapters.
Józef Kucia
jkucia at codeweavers.com
Sat Apr 6 04:37:34 CDT 2019
Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
---
dlls/wined3d/adapter_vk.c | 47 +++++++++++++++++++++++++++++++++------
dlls/wined3d/wined3d_vk.h | 8 ++++++-
2 files changed, 47 insertions(+), 8 deletions(-)
diff --git a/dlls/wined3d/adapter_vk.c b/dlls/wined3d/adapter_vk.c
index 8ef0aea3ca3c..2c6ea25a9f13 100644
--- a/dlls/wined3d/adapter_vk.c
+++ b/dlls/wined3d/adapter_vk.c
@@ -29,6 +29,12 @@ static inline const struct wined3d_adapter_vk *wined3d_adapter_vk_const(const st
return CONTAINING_RECORD(adapter, struct wined3d_adapter_vk, a);
}
+static const char *debug_vk_version(uint32_t version)
+{
+ return wine_dbg_sprintf("%u.%u.%u",
+ VK_VERSION_MAJOR(version), VK_VERSION_MINOR(version), VK_VERSION_PATCH(version));
+}
+
#ifdef USE_WIN32_VULKAN
static BOOL wined3d_load_vulkan(struct wined3d_vk_info *vk_info)
{
@@ -226,10 +232,12 @@ static unsigned int wined3d_get_wine_vk_version(void)
static BOOL wined3d_init_vulkan(struct wined3d_vk_info *vk_info)
{
+ PFN_vkEnumerateInstanceVersion pfn_vkEnumerateInstanceVersion;
struct vulkan_ops *vk_ops = &vk_info->vk_ops;
VkInstance instance = VK_NULL_HANDLE;
VkInstanceCreateInfo instance_info;
VkApplicationInfo app_info;
+ uint32_t api_version = 0;
char app_name[MAX_PATH];
VkResult vr;
@@ -242,13 +250,23 @@ static BOOL wined3d_init_vulkan(struct wined3d_vk_info *vk_info)
goto fail;
}
+ vk_info->api_version = VK_API_VERSION_1_0;
+ if ((pfn_vkEnumerateInstanceVersion = (void *)VK_CALL(vkGetInstanceProcAddr(NULL, "vkEnumerateInstanceVersion")))
+ && pfn_vkEnumerateInstanceVersion(&api_version) == VK_SUCCESS)
+ {
+ TRACE("Vulkan instance API version %s.\n", debug_vk_version(api_version));
+
+ if (api_version >= VK_API_VERSION_1_1)
+ vk_info->api_version = VK_API_VERSION_1_1;
+ }
+
memset(&app_info, 0, sizeof(app_info));
app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
if (wined3d_get_app_name(app_name, ARRAY_SIZE(app_name)))
app_info.pApplicationName = app_name;
app_info.pEngineName = "Damavand";
app_info.engineVersion = wined3d_get_wine_vk_version();
- app_info.apiVersion = VK_API_VERSION_1_0;
+ app_info.apiVersion = vk_info->api_version;
memset(&instance_info, 0, sizeof(instance_info));
instance_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
@@ -267,11 +285,15 @@ static BOOL wined3d_init_vulkan(struct wined3d_vk_info *vk_info)
WARN("Could not get instance proc addr for '" #name "'.\n"); \
goto fail; \
}
+#define LOAD_INSTANCE_OPT_PFN(name) \
+ vk_ops->name = (void *)VK_CALL(vkGetInstanceProcAddr(instance, #name));
#define VK_INSTANCE_PFN LOAD_INSTANCE_PFN
+#define VK_INSTANCE_EXT_PFN LOAD_INSTANCE_OPT_PFN
#define VK_DEVICE_PFN LOAD_INSTANCE_PFN
VK_INSTANCE_FUNCS()
VK_DEVICE_FUNCS()
#undef VK_INSTANCE_PFN
+#undef VK_INSTANCE_EXT_PFN
#undef VK_DEVICE_PFN
vk_info->instance = instance;
@@ -324,8 +346,7 @@ const struct wined3d_gpu_description *get_vulkan_gpu_description(const VkPhysica
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));
+ TRACE("API version: %s.\n", debug_vk_version(properties->apiVersion));
if ((description = wined3d_get_gpu_description(properties->vendorID, properties->deviceID)))
return description;
@@ -342,7 +363,8 @@ static BOOL wined3d_adapter_vk_init(struct wined3d_adapter_vk *adapter_vk,
struct wined3d_vk_info *vk_info = &adapter_vk->vk_info;
const struct wined3d_gpu_description *gpu_description;
struct wined3d_adapter *adapter = &adapter_vk->a;
- VkPhysicalDeviceProperties properties;
+ VkPhysicalDeviceIDProperties id_properties;
+ VkPhysicalDeviceProperties2 properties2;
TRACE("adapter_vk %p, ordinal %u, wined3d_creation_flags %#x.\n",
adapter_vk, ordinal, wined3d_creation_flags);
@@ -359,16 +381,27 @@ static BOOL wined3d_adapter_vk_init(struct wined3d_adapter_vk *adapter_vk,
if (!(adapter_vk->physical_device = get_vulkan_physical_device(vk_info)))
goto fail_vulkan;
- VK_CALL(vkGetPhysicalDeviceProperties(adapter_vk->physical_device, &properties));
- adapter_vk->device_limits = properties.limits;
+ memset(&id_properties, 0, sizeof(id_properties));
+ id_properties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES;
+ properties2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2;
+ properties2.pNext = &id_properties;
- if (!(gpu_description = get_vulkan_gpu_description(&properties)))
+ if (vk_info->api_version >= VK_API_VERSION_1_1)
+ VK_CALL(vkGetPhysicalDeviceProperties2(adapter_vk->physical_device, &properties2));
+ else
+ 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);
+ memcpy(&adapter->driver_uuid, id_properties.driverUUID, sizeof(adapter->driver_uuid));
+ memcpy(&adapter->device_uuid, id_properties.deviceUUID, sizeof(adapter->device_uuid));
+
if (!wined3d_adapter_vk_init_format_info(adapter_vk, vk_info))
goto fail_vulkan;
diff --git a/dlls/wined3d/wined3d_vk.h b/dlls/wined3d/wined3d_vk.h
index 784dd0c310c5..10c706a10331 100644
--- a/dlls/wined3d/wined3d_vk.h
+++ b/dlls/wined3d/wined3d_vk.h
@@ -38,7 +38,9 @@
VK_INSTANCE_PFN(vkGetPhysicalDeviceMemoryProperties) \
VK_INSTANCE_PFN(vkGetPhysicalDeviceProperties) \
VK_INSTANCE_PFN(vkGetPhysicalDeviceQueueFamilyProperties) \
- VK_INSTANCE_PFN(vkGetPhysicalDeviceSparseImageFormatProperties)
+ VK_INSTANCE_PFN(vkGetPhysicalDeviceSparseImageFormatProperties) \
+ /* Vulkan 1.1 */ \
+ VK_INSTANCE_EXT_PFN(vkGetPhysicalDeviceProperties2)
#define VK_DEVICE_FUNCS() \
VK_DEVICE_PFN(vkAllocateCommandBuffers) \
@@ -167,10 +169,12 @@
struct vulkan_ops
{
#define VK_INSTANCE_PFN DECLARE_VK_PFN
+#define VK_INSTANCE_EXT_PFN DECLARE_VK_PFN
#define VK_DEVICE_PFN DECLARE_VK_PFN
VK_DEVICE_FUNCS()
VK_INSTANCE_FUNCS()
#undef VK_INSTANCE_PFN
+#undef VK_INSTANCE_EXT_PFN
#undef VK_DEVICE_PFN
PFN_vkCreateInstance vkCreateInstance;
@@ -182,6 +186,8 @@ struct wined3d_vk_info
VkInstance instance;
struct vulkan_ops vk_ops;
+ unsigned int api_version;
+
#ifdef USE_WIN32_VULKAN
HMODULE vulkan_lib;
#endif
--
2.21.0
More information about the wine-devel
mailing list