wined3d: Initialise driver and device UUID for Vulkan adapters.

Signed-off-by: Józef Kucia <jkucia@codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Józef Kucia 2019-04-06 11:37:34 +02:00 committed by Alexandre Julliard
parent f32ea05821
commit 806c97a615
2 changed files with 47 additions and 8 deletions

View File

@ -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;

View File

@ -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