[PATCH vkd3d 08/41] vkd3d: Attempt to create a Vulkan 1.1 instance and device.
Hans-Kristian Arntzen
post at arntzen-software.no
Wed Jan 29 05:51:33 CST 2020
Need this to support subgroup operations for SM 6.0.
Signed-off-by: Hans-Kristian Arntzen <post at arntzen-software.no>
---
libs/vkd3d/device.c | 22 +++++++++++++++++++++-
libs/vkd3d/utils.c | 3 +++
libs/vkd3d/vkd3d_private.h | 3 +++
3 files changed, 27 insertions(+), 1 deletion(-)
diff --git a/libs/vkd3d/device.c b/libs/vkd3d/device.c
index 4484e80..28430fb 100644
--- a/libs/vkd3d/device.c
+++ b/libs/vkd3d/device.c
@@ -481,6 +481,7 @@ static HRESULT vkd3d_instance_init(struct vkd3d_instance *instance,
VkInstance vk_instance;
VkResult vr;
HRESULT hr;
+ uint32_t loader_version = VK_API_VERSION_1_0;
TRACE("Build: %s.\n", vkd3d_build);
@@ -521,13 +522,20 @@ static HRESULT vkd3d_instance_init(struct vkd3d_instance *instance,
return hr;
}
+ if (vk_global_procs->vkEnumerateInstanceVersion)
+ vk_global_procs->vkEnumerateInstanceVersion(&loader_version);
+
+ /* Do not opt-in to versions we don't need yet. */
+ if (loader_version > VK_API_VERSION_1_1)
+ loader_version = VK_API_VERSION_1_1;
+
application_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
application_info.pNext = NULL;
application_info.pApplicationName = NULL;
application_info.applicationVersion = 0;
application_info.pEngineName = PACKAGE_NAME;
application_info.engineVersion = vkd3d_get_vk_version();
- application_info.apiVersion = VK_API_VERSION_1_0;
+ application_info.apiVersion = loader_version;
if ((vkd3d_application_info = vkd3d_find_struct(create_info->next, APPLICATION_INFO)))
{
@@ -592,8 +600,13 @@ static HRESULT vkd3d_instance_init(struct vkd3d_instance *instance,
}
instance->vk_instance = vk_instance;
+ instance->instance_version = loader_version;
TRACE("Created Vulkan instance %p.\n", vk_instance);
+ if (loader_version == VK_API_VERSION_1_1)
+ TRACE("Created Vulkan 1.1 instance.\n");
+ else
+ TRACE("Created Vulkan 1.0 instance.\n");
instance->refcount = 1;
@@ -1720,6 +1733,8 @@ static HRESULT vkd3d_create_vk_device(struct d3d12_device *device,
VkDevice vk_device;
VkResult vr;
HRESULT hr;
+ VkPhysicalDeviceProperties device_properties;
+ bool use_vulkan_11;
TRACE("device %p, create_info %p.\n", device, create_info);
@@ -1731,6 +1746,11 @@ static HRESULT vkd3d_create_vk_device(struct d3d12_device *device,
device->vk_physical_device = physical_device;
+ VK_CALL(vkGetPhysicalDeviceProperties(device->vk_physical_device, &device_properties));
+ use_vulkan_11 = device_properties.apiVersion >= VK_API_VERSION_1_1 &&
+ device->vkd3d_instance->instance_version >= VK_API_VERSION_1_1;
+ device->api_version = use_vulkan_11 ? VK_API_VERSION_1_1 : VK_API_VERSION_1_0;
+
if (FAILED(hr = vkd3d_select_queues(device->vkd3d_instance, physical_device, &device_queue_info)))
return hr;
diff --git a/libs/vkd3d/utils.c b/libs/vkd3d/utils.c
index ad42900..cc5697b 100644
--- a/libs/vkd3d/utils.c
+++ b/libs/vkd3d/utils.c
@@ -798,6 +798,8 @@ HRESULT hresult_from_vkd3d_result(int vkd3d_result)
ERR("Could not get global proc addr for '" #name "'.\n"); \
return E_FAIL; \
}
+#define MAYBE_LOAD_GLOBAL_PFN(name) \
+ procs->name = (void *)vkGetInstanceProcAddr(NULL, #name);
HRESULT vkd3d_load_vk_global_procs(struct vkd3d_vk_global_procs *procs,
PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr)
@@ -808,6 +810,7 @@ HRESULT vkd3d_load_vk_global_procs(struct vkd3d_vk_global_procs *procs,
LOAD_GLOBAL_PFN(vkCreateInstance)
LOAD_GLOBAL_PFN(vkEnumerateInstanceExtensionProperties)
+ MAYBE_LOAD_GLOBAL_PFN(vkEnumerateInstanceVersion)
TRACE("Loaded global Vulkan procs.\n");
return S_OK;
diff --git a/libs/vkd3d/vkd3d_private.h b/libs/vkd3d/vkd3d_private.h
index 86bef18..29386c5 100644
--- a/libs/vkd3d/vkd3d_private.h
+++ b/libs/vkd3d/vkd3d_private.h
@@ -61,6 +61,7 @@ struct d3d12_resource;
struct vkd3d_vk_global_procs
{
PFN_vkCreateInstance vkCreateInstance;
+ PFN_vkEnumerateInstanceVersion vkEnumerateInstanceVersion;
PFN_vkEnumerateInstanceExtensionProperties vkEnumerateInstanceExtensionProperties;
PFN_vkGetInstanceProcAddr vkGetInstanceProcAddr;
};
@@ -135,6 +136,7 @@ enum vkd3d_config_flags
struct vkd3d_instance
{
VkInstance vk_instance;
+ uint32_t instance_version;
struct vkd3d_vk_instance_procs vk_procs;
PFN_vkd3d_signal_event signal_event;
@@ -1116,6 +1118,7 @@ struct d3d12_device
LONG refcount;
VkDevice vk_device;
+ uint32_t api_version;
VkPhysicalDevice vk_physical_device;
struct vkd3d_vk_device_procs vk_procs;
PFN_vkd3d_signal_event signal_event;
--
2.25.0
More information about the wine-devel
mailing list