summaryrefslogtreecommitdiff
path: root/Source/Core/VideoBackends/Vulkan/VulkanContext.cpp
diff options
context:
space:
mode:
authorStenzek <stenzek@gmail.com>2019-03-30 00:18:26 +1000
committerStenzek <stenzek@gmail.com>2019-03-30 00:18:26 +1000
commitb685a66753c980f2c6e69aa277d33b20e9490d15 (patch)
tree6b9bc5805aaf17c68950bcbeeaf95a7e70fdc18b /Source/Core/VideoBackends/Vulkan/VulkanContext.cpp
parenta6bb06174f6e571be10b3a436e9cb9bd9e7a408f (diff)
Vulkan: Fix crash when checking subgroup support on Mesa
Diffstat (limited to 'Source/Core/VideoBackends/Vulkan/VulkanContext.cpp')
-rw-r--r--Source/Core/VideoBackends/Vulkan/VulkanContext.cpp21
1 files changed, 19 insertions, 2 deletions
diff --git a/Source/Core/VideoBackends/Vulkan/VulkanContext.cpp b/Source/Core/VideoBackends/Vulkan/VulkanContext.cpp
index 52038e39dc..72f3cf79b0 100644
--- a/Source/Core/VideoBackends/Vulkan/VulkanContext.cpp
+++ b/Source/Core/VideoBackends/Vulkan/VulkanContext.cpp
@@ -100,6 +100,19 @@ VkInstance VulkanContext::CreateVulkanInstance(WindowSystemType wstype, bool ena
app_info.engineVersion = VK_MAKE_VERSION(5, 0, 0);
app_info.apiVersion = VK_MAKE_VERSION(1, 0, 0);
+ // Try for Vulkan 1.1 if the loader supports it.
+ if (vkEnumerateInstanceVersion)
+ {
+ u32 supported_api_version = 0;
+ VkResult res = vkEnumerateInstanceVersion(&supported_api_version);
+ if (res == VK_SUCCESS && (VK_VERSION_MAJOR(supported_api_version) > 1 ||
+ VK_VERSION_MINOR(supported_api_version) >= 1))
+ {
+ // The device itself may not support 1.1, so we check that before using any 1.1 functionality.
+ app_info.apiVersion = VK_MAKE_VERSION(1, 1, 0);
+ }
+ }
+
VkInstanceCreateInfo instance_create_info = {};
instance_create_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
instance_create_info.pNext = nullptr;
@@ -868,9 +881,13 @@ void VulkanContext::InitDriverDetails()
void VulkanContext::PopulateShaderSubgroupSupport()
{
- // If this function isn't available, we don't support Vulkan 1.1.
- if (!vkGetPhysicalDeviceProperties2)
+ // Vulkan 1.1 support is required for vkGetPhysicalDeviceProperties2(), but we can't rely on the
+ // function pointer alone.
+ if (!vkGetPhysicalDeviceProperties2 || (VK_VERSION_MAJOR(m_device_properties.apiVersion) == 1 &&
+ VK_VERSION_MINOR(m_device_properties.apiVersion) < 1))
+ {
return;
+ }
VkPhysicalDeviceProperties2 device_properties_2 = {};
device_properties_2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2;