diff options
| -rw-r--r-- | src/video_core/vulkan_common/vulkan_device.cpp | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/src/video_core/vulkan_common/vulkan_device.cpp b/src/video_core/vulkan_common/vulkan_device.cpp index 618535aae..8eb37a77a 100644 --- a/src/video_core/vulkan_common/vulkan_device.cpp +++ b/src/video_core/vulkan_common/vulkan_device.cpp | |||
| @@ -425,6 +425,18 @@ Device::Device(VkInstance instance_, vk::PhysicalDevice physical_, VkSurfaceKHR | |||
| 425 | LOG_INFO(Render_Vulkan, "Device doesn't support provoking vertex last"); | 425 | LOG_INFO(Render_Vulkan, "Device doesn't support provoking vertex last"); |
| 426 | } | 426 | } |
| 427 | 427 | ||
| 428 | VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT vertex_input_dynamic; | ||
| 429 | if (ext_vertex_input_dynamic_state) { | ||
| 430 | vertex_input_dynamic = { | ||
| 431 | .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT, | ||
| 432 | .pNext = nullptr, | ||
| 433 | .vertexInputDynamicState = VK_TRUE, | ||
| 434 | }; | ||
| 435 | SetNext(next, vertex_input_dynamic); | ||
| 436 | } else { | ||
| 437 | LOG_INFO(Render_Vulkan, "Device doesn't support vertex input dynamic state"); | ||
| 438 | } | ||
| 439 | |||
| 428 | VkPhysicalDeviceShaderAtomicInt64FeaturesKHR atomic_int64; | 440 | VkPhysicalDeviceShaderAtomicInt64FeaturesKHR atomic_int64; |
| 429 | if (ext_shader_atomic_int64) { | 441 | if (ext_shader_atomic_int64) { |
| 430 | atomic_int64 = { | 442 | atomic_int64 = { |
| @@ -732,6 +744,7 @@ std::vector<const char*> Device::LoadExtensions(bool requires_surface) { | |||
| 732 | bool has_ext_extended_dynamic_state{}; | 744 | bool has_ext_extended_dynamic_state{}; |
| 733 | bool has_ext_shader_atomic_int64{}; | 745 | bool has_ext_shader_atomic_int64{}; |
| 734 | bool has_ext_provoking_vertex{}; | 746 | bool has_ext_provoking_vertex{}; |
| 747 | bool has_ext_vertex_input_dynamic_state{}; | ||
| 735 | for (const VkExtensionProperties& extension : physical.EnumerateDeviceExtensionProperties()) { | 748 | for (const VkExtensionProperties& extension : physical.EnumerateDeviceExtensionProperties()) { |
| 736 | const auto test = [&](std::optional<std::reference_wrapper<bool>> status, const char* name, | 749 | const auto test = [&](std::optional<std::reference_wrapper<bool>> status, const char* name, |
| 737 | bool push) { | 750 | bool push) { |
| @@ -763,6 +776,8 @@ std::vector<const char*> Device::LoadExtensions(bool requires_surface) { | |||
| 763 | test(has_ext_extended_dynamic_state, VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME, false); | 776 | test(has_ext_extended_dynamic_state, VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME, false); |
| 764 | test(has_ext_subgroup_size_control, VK_EXT_SUBGROUP_SIZE_CONTROL_EXTENSION_NAME, false); | 777 | test(has_ext_subgroup_size_control, VK_EXT_SUBGROUP_SIZE_CONTROL_EXTENSION_NAME, false); |
| 765 | test(has_ext_provoking_vertex, VK_EXT_PROVOKING_VERTEX_EXTENSION_NAME, false); | 778 | test(has_ext_provoking_vertex, VK_EXT_PROVOKING_VERTEX_EXTENSION_NAME, false); |
| 779 | test(has_ext_vertex_input_dynamic_state, VK_EXT_VERTEX_INPUT_DYNAMIC_STATE_EXTENSION_NAME, | ||
| 780 | false); | ||
| 766 | test(has_ext_shader_atomic_int64, VK_KHR_SHADER_ATOMIC_INT64_EXTENSION_NAME, false); | 781 | test(has_ext_shader_atomic_int64, VK_KHR_SHADER_ATOMIC_INT64_EXTENSION_NAME, false); |
| 767 | test(has_khr_workgroup_memory_explicit_layout, | 782 | test(has_khr_workgroup_memory_explicit_layout, |
| 768 | VK_KHR_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_EXTENSION_NAME, false); | 783 | VK_KHR_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_EXTENSION_NAME, false); |
| @@ -827,6 +842,19 @@ std::vector<const char*> Device::LoadExtensions(bool requires_surface) { | |||
| 827 | ext_provoking_vertex = true; | 842 | ext_provoking_vertex = true; |
| 828 | } | 843 | } |
| 829 | } | 844 | } |
| 845 | if (has_ext_vertex_input_dynamic_state) { | ||
| 846 | VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT vertex_input; | ||
| 847 | vertex_input.sType = | ||
| 848 | VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT; | ||
| 849 | vertex_input.pNext = nullptr; | ||
| 850 | features.pNext = &vertex_input; | ||
| 851 | physical.GetFeatures2KHR(features); | ||
| 852 | |||
| 853 | if (vertex_input.vertexInputDynamicState) { | ||
| 854 | extensions.push_back(VK_EXT_VERTEX_INPUT_DYNAMIC_STATE_EXTENSION_NAME); | ||
| 855 | ext_vertex_input_dynamic_state = true; | ||
| 856 | } | ||
| 857 | } | ||
| 830 | if (has_ext_shader_atomic_int64) { | 858 | if (has_ext_shader_atomic_int64) { |
| 831 | VkPhysicalDeviceShaderAtomicInt64Features atomic_int64; | 859 | VkPhysicalDeviceShaderAtomicInt64Features atomic_int64; |
| 832 | atomic_int64.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT; | 860 | atomic_int64.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT; |