VulkanDevice: Don't assume presence of vkGetPhysicalDeviceFeatures2

This commit is contained in:
Stenzek 2023-12-26 13:00:58 +10:00
parent 62d2f12236
commit 118c6c1269
No known key found for this signature in database
2 changed files with 33 additions and 5 deletions

View file

@ -586,7 +586,7 @@ void VulkanDevice::ProcessDeviceExtensions()
VkPhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT attachment_feedback_loop_feature = { VkPhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT attachment_feedback_loop_feature = {
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ATTACHMENT_FEEDBACK_LOOP_LAYOUT_FEATURES_EXT, nullptr, VK_FALSE}; VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ATTACHMENT_FEEDBACK_LOOP_LAYOUT_FEATURES_EXT, nullptr, VK_FALSE};
VkPhysicalDeviceDynamicRenderingFeatures dynamic_rendering_feature = { VkPhysicalDeviceDynamicRenderingFeatures dynamic_rendering_feature = {
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_FEATURES, nullptr, VK_TRUE}; VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_FEATURES, nullptr, VK_FALSE};
// add in optional feature structs // add in optional feature structs
if (m_optional_extensions.vk_ext_rasterization_order_attachment_access) if (m_optional_extensions.vk_ext_rasterization_order_attachment_access)
@ -596,8 +596,30 @@ void VulkanDevice::ProcessDeviceExtensions()
if (m_optional_extensions.vk_khr_dynamic_rendering) if (m_optional_extensions.vk_khr_dynamic_rendering)
Vulkan::AddPointerToChain(&features2, &dynamic_rendering_feature); Vulkan::AddPointerToChain(&features2, &dynamic_rendering_feature);
// query // we might not have VK_KHR_get_physical_device_properties2...
vkGetPhysicalDeviceFeatures2(m_physical_device, &features2); if (!vkGetPhysicalDeviceFeatures2 || !vkGetPhysicalDeviceProperties2 || !vkGetPhysicalDeviceMemoryProperties2)
{
if (!vkGetPhysicalDeviceFeatures2KHR || !vkGetPhysicalDeviceProperties2KHR ||
!vkGetPhysicalDeviceMemoryProperties2KHR)
{
Log_ErrorPrint(
"One or more functions from VK_KHR_get_physical_device_properties2 is missing, disabling extension.");
m_optional_extensions.vk_khr_get_physical_device_properties2 = false;
vkGetPhysicalDeviceFeatures2 = nullptr;
vkGetPhysicalDeviceProperties2 = nullptr;
vkGetPhysicalDeviceMemoryProperties2 = nullptr;
}
else
{
vkGetPhysicalDeviceFeatures2 = vkGetPhysicalDeviceFeatures2KHR;
vkGetPhysicalDeviceProperties2 = vkGetPhysicalDeviceProperties2KHR;
vkGetPhysicalDeviceMemoryProperties2 = vkGetPhysicalDeviceMemoryProperties2KHR;
}
}
// don't bother querying if we're not actually looking at any features
if (vkGetPhysicalDeviceFeatures2 && features2.pNext)
vkGetPhysicalDeviceFeatures2(m_physical_device, &features2);
// confirm we actually support it // confirm we actually support it
m_optional_extensions.vk_ext_rasterization_order_attachment_access &= m_optional_extensions.vk_ext_rasterization_order_attachment_access &=
@ -618,8 +640,9 @@ void VulkanDevice::ProcessDeviceExtensions()
if (m_optional_extensions.vk_khr_push_descriptor) if (m_optional_extensions.vk_khr_push_descriptor)
Vulkan::AddPointerToChain(&properties2, &push_descriptor_properties); Vulkan::AddPointerToChain(&properties2, &push_descriptor_properties);
// query // don't bother querying if we're not actually looking at any features
vkGetPhysicalDeviceProperties2(m_physical_device, &properties2); if (vkGetPhysicalDeviceProperties2 && properties2.pNext)
vkGetPhysicalDeviceProperties2(m_physical_device, &properties2);
m_optional_extensions.vk_khr_push_descriptor &= (push_descriptor_properties.maxPushDescriptors >= 1); m_optional_extensions.vk_khr_push_descriptor &= (push_descriptor_properties.maxPushDescriptors >= 1);

View file

@ -83,6 +83,11 @@ VULKAN_INSTANCE_ENTRY_POINT(vkCreateDisplayModeKHR, false)
VULKAN_INSTANCE_ENTRY_POINT(vkGetDisplayPlaneCapabilitiesKHR, false) VULKAN_INSTANCE_ENTRY_POINT(vkGetDisplayPlaneCapabilitiesKHR, false)
VULKAN_INSTANCE_ENTRY_POINT(vkCreateDisplayPlaneSurfaceKHR, false) VULKAN_INSTANCE_ENTRY_POINT(vkCreateDisplayPlaneSurfaceKHR, false)
// VK_KHR_get_physical_device_properties2
VULKAN_INSTANCE_ENTRY_POINT(vkGetPhysicalDeviceFeatures2KHR, false)
VULKAN_INSTANCE_ENTRY_POINT(vkGetPhysicalDeviceProperties2KHR, false)
VULKAN_INSTANCE_ENTRY_POINT(vkGetPhysicalDeviceMemoryProperties2KHR, false)
// Vulkan 1.1 functions. // Vulkan 1.1 functions.
VULKAN_INSTANCE_ENTRY_POINT(vkGetPhysicalDeviceFeatures2, false) VULKAN_INSTANCE_ENTRY_POINT(vkGetPhysicalDeviceFeatures2, false)
VULKAN_INSTANCE_ENTRY_POINT(vkGetPhysicalDeviceProperties2, false) VULKAN_INSTANCE_ENTRY_POINT(vkGetPhysicalDeviceProperties2, false)