diff options
| author | 2021-06-11 21:52:04 -0300 | |
|---|---|---|
| committer | 2021-07-22 21:51:35 -0400 | |
| commit | d554778311c32e0a19ecdc13d7525b264d8443b5 (patch) | |
| tree | 11329cc574aafbd2dde29e6161fb902ca67e8808 /src/video_core/vulkan_common | |
| parent | spirv/convert: Catch more signed operations oversights (diff) | |
| download | yuzu-d554778311c32e0a19ecdc13d7525b264d8443b5.tar.gz yuzu-d554778311c32e0a19ecdc13d7525b264d8443b5.tar.xz yuzu-d554778311c32e0a19ecdc13d7525b264d8443b5.zip | |
vulkan: Use VK_EXT_provoking_vertex when available
Diffstat (limited to 'src/video_core/vulkan_common')
| -rw-r--r-- | src/video_core/vulkan_common/vulkan_device.cpp | 28 | ||||
| -rw-r--r-- | src/video_core/vulkan_common/vulkan_device.h | 6 |
2 files changed, 34 insertions, 0 deletions
diff --git a/src/video_core/vulkan_common/vulkan_device.cpp b/src/video_core/vulkan_common/vulkan_device.cpp index 2b715baba..618535aae 100644 --- a/src/video_core/vulkan_common/vulkan_device.cpp +++ b/src/video_core/vulkan_common/vulkan_device.cpp | |||
| @@ -412,6 +412,19 @@ Device::Device(VkInstance instance_, vk::PhysicalDevice physical_, VkSurfaceKHR | |||
| 412 | LOG_INFO(Render_Vulkan, "Device doesn't support extended dynamic state"); | 412 | LOG_INFO(Render_Vulkan, "Device doesn't support extended dynamic state"); |
| 413 | } | 413 | } |
| 414 | 414 | ||
| 415 | VkPhysicalDeviceProvokingVertexFeaturesEXT provoking_vertex; | ||
| 416 | if (ext_provoking_vertex) { | ||
| 417 | provoking_vertex = { | ||
| 418 | .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_FEATURES_EXT, | ||
| 419 | .pNext = nullptr, | ||
| 420 | .provokingVertexLast = VK_TRUE, | ||
| 421 | .transformFeedbackPreservesProvokingVertex = VK_TRUE, | ||
| 422 | }; | ||
| 423 | SetNext(next, provoking_vertex); | ||
| 424 | } else { | ||
| 425 | LOG_INFO(Render_Vulkan, "Device doesn't support provoking vertex last"); | ||
| 426 | } | ||
| 427 | |||
| 415 | VkPhysicalDeviceShaderAtomicInt64FeaturesKHR atomic_int64; | 428 | VkPhysicalDeviceShaderAtomicInt64FeaturesKHR atomic_int64; |
| 416 | if (ext_shader_atomic_int64) { | 429 | if (ext_shader_atomic_int64) { |
| 417 | atomic_int64 = { | 430 | atomic_int64 = { |
| @@ -718,6 +731,7 @@ std::vector<const char*> Device::LoadExtensions(bool requires_surface) { | |||
| 718 | bool has_ext_custom_border_color{}; | 731 | bool has_ext_custom_border_color{}; |
| 719 | bool has_ext_extended_dynamic_state{}; | 732 | bool has_ext_extended_dynamic_state{}; |
| 720 | bool has_ext_shader_atomic_int64{}; | 733 | bool has_ext_shader_atomic_int64{}; |
| 734 | bool has_ext_provoking_vertex{}; | ||
| 721 | for (const VkExtensionProperties& extension : physical.EnumerateDeviceExtensionProperties()) { | 735 | for (const VkExtensionProperties& extension : physical.EnumerateDeviceExtensionProperties()) { |
| 722 | const auto test = [&](std::optional<std::reference_wrapper<bool>> status, const char* name, | 736 | const auto test = [&](std::optional<std::reference_wrapper<bool>> status, const char* name, |
| 723 | bool push) { | 737 | bool push) { |
| @@ -748,6 +762,7 @@ std::vector<const char*> Device::LoadExtensions(bool requires_surface) { | |||
| 748 | test(has_ext_custom_border_color, VK_EXT_CUSTOM_BORDER_COLOR_EXTENSION_NAME, false); | 762 | test(has_ext_custom_border_color, VK_EXT_CUSTOM_BORDER_COLOR_EXTENSION_NAME, false); |
| 749 | test(has_ext_extended_dynamic_state, VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME, false); | 763 | test(has_ext_extended_dynamic_state, VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME, false); |
| 750 | test(has_ext_subgroup_size_control, VK_EXT_SUBGROUP_SIZE_CONTROL_EXTENSION_NAME, false); | 764 | 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); | ||
| 751 | test(has_ext_shader_atomic_int64, VK_KHR_SHADER_ATOMIC_INT64_EXTENSION_NAME, false); | 766 | test(has_ext_shader_atomic_int64, VK_KHR_SHADER_ATOMIC_INT64_EXTENSION_NAME, false); |
| 752 | test(has_khr_workgroup_memory_explicit_layout, | 767 | test(has_khr_workgroup_memory_explicit_layout, |
| 753 | VK_KHR_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_EXTENSION_NAME, false); | 768 | VK_KHR_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_EXTENSION_NAME, false); |
| @@ -799,6 +814,19 @@ std::vector<const char*> Device::LoadExtensions(bool requires_surface) { | |||
| 799 | } else { | 814 | } else { |
| 800 | is_warp_potentially_bigger = true; | 815 | is_warp_potentially_bigger = true; |
| 801 | } | 816 | } |
| 817 | if (has_ext_provoking_vertex) { | ||
| 818 | VkPhysicalDeviceProvokingVertexFeaturesEXT provoking_vertex; | ||
| 819 | provoking_vertex.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_FEATURES_EXT; | ||
| 820 | provoking_vertex.pNext = nullptr; | ||
| 821 | features.pNext = &provoking_vertex; | ||
| 822 | physical.GetFeatures2KHR(features); | ||
| 823 | |||
| 824 | if (provoking_vertex.provokingVertexLast && | ||
| 825 | provoking_vertex.transformFeedbackPreservesProvokingVertex) { | ||
| 826 | extensions.push_back(VK_EXT_PROVOKING_VERTEX_EXTENSION_NAME); | ||
| 827 | ext_provoking_vertex = true; | ||
| 828 | } | ||
| 829 | } | ||
| 802 | if (has_ext_shader_atomic_int64) { | 830 | if (has_ext_shader_atomic_int64) { |
| 803 | VkPhysicalDeviceShaderAtomicInt64Features atomic_int64; | 831 | VkPhysicalDeviceShaderAtomicInt64Features atomic_int64; |
| 804 | atomic_int64.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT; | 832 | atomic_int64.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT; |
diff --git a/src/video_core/vulkan_common/vulkan_device.h b/src/video_core/vulkan_common/vulkan_device.h index 9bc1fb947..37f589612 100644 --- a/src/video_core/vulkan_common/vulkan_device.h +++ b/src/video_core/vulkan_common/vulkan_device.h | |||
| @@ -244,6 +244,11 @@ public: | |||
| 244 | return ext_shader_stencil_export; | 244 | return ext_shader_stencil_export; |
| 245 | } | 245 | } |
| 246 | 246 | ||
| 247 | /// Returns true if the device supports VK_EXT_provoking_vertex. | ||
| 248 | bool IsExtProvokingVertexSupported() const { | ||
| 249 | return ext_provoking_vertex; | ||
| 250 | } | ||
| 251 | |||
| 247 | /// Returns true if the device supports VK_KHR_shader_atomic_int64. | 252 | /// Returns true if the device supports VK_KHR_shader_atomic_int64. |
| 248 | bool IsExtShaderAtomicInt64Supported() const { | 253 | bool IsExtShaderAtomicInt64Supported() const { |
| 249 | return ext_shader_atomic_int64; | 254 | return ext_shader_atomic_int64; |
| @@ -346,6 +351,7 @@ private: | |||
| 346 | bool ext_extended_dynamic_state{}; ///< Support for VK_EXT_extended_dynamic_state. | 351 | bool ext_extended_dynamic_state{}; ///< Support for VK_EXT_extended_dynamic_state. |
| 347 | bool ext_shader_stencil_export{}; ///< Support for VK_EXT_shader_stencil_export. | 352 | bool ext_shader_stencil_export{}; ///< Support for VK_EXT_shader_stencil_export. |
| 348 | bool ext_shader_atomic_int64{}; ///< Support for VK_KHR_shader_atomic_int64. | 353 | bool ext_shader_atomic_int64{}; ///< Support for VK_KHR_shader_atomic_int64. |
| 354 | bool ext_provoking_vertex{}; ///< Support for VK_EXT_provoking_vertex. | ||
| 349 | bool nv_device_diagnostics_config{}; ///< Support for VK_NV_device_diagnostics_config. | 355 | bool nv_device_diagnostics_config{}; ///< Support for VK_NV_device_diagnostics_config. |
| 350 | bool has_renderdoc{}; ///< Has RenderDoc attached | 356 | bool has_renderdoc{}; ///< Has RenderDoc attached |
| 351 | bool has_nsight_graphics{}; ///< Has Nsight Graphics attached | 357 | bool has_nsight_graphics{}; ///< Has Nsight Graphics attached |