diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/video_core/vulkan_common/vulkan_device.cpp | 50 | ||||
| -rw-r--r-- | src/video_core/vulkan_common/vulkan_device.h | 1 |
2 files changed, 14 insertions, 37 deletions
diff --git a/src/video_core/vulkan_common/vulkan_device.cpp b/src/video_core/vulkan_common/vulkan_device.cpp index f9bc73f84..34d396434 100644 --- a/src/video_core/vulkan_common/vulkan_device.cpp +++ b/src/video_core/vulkan_common/vulkan_device.cpp | |||
| @@ -46,6 +46,7 @@ constexpr std::array REQUIRED_EXTENSIONS{ | |||
| 46 | VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME, | 46 | VK_EXT_VERTEX_ATTRIBUTE_DIVISOR_EXTENSION_NAME, |
| 47 | VK_EXT_SHADER_SUBGROUP_BALLOT_EXTENSION_NAME, | 47 | VK_EXT_SHADER_SUBGROUP_BALLOT_EXTENSION_NAME, |
| 48 | VK_EXT_SHADER_SUBGROUP_VOTE_EXTENSION_NAME, | 48 | VK_EXT_SHADER_SUBGROUP_VOTE_EXTENSION_NAME, |
| 49 | VK_EXT_ROBUSTNESS_2_EXTENSION_NAME, | ||
| 49 | VK_EXT_HOST_QUERY_RESET_EXTENSION_NAME, | 50 | VK_EXT_HOST_QUERY_RESET_EXTENSION_NAME, |
| 50 | #ifdef _WIN32 | 51 | #ifdef _WIN32 |
| 51 | VK_KHR_EXTERNAL_MEMORY_WIN32_EXTENSION_NAME, | 52 | VK_KHR_EXTERNAL_MEMORY_WIN32_EXTENSION_NAME, |
| @@ -379,20 +380,6 @@ Device::Device(VkInstance instance_, vk::PhysicalDevice physical_, VkSurfaceKHR | |||
| 379 | LOG_INFO(Render_Vulkan, "Device doesn't support extended dynamic state"); | 380 | LOG_INFO(Render_Vulkan, "Device doesn't support extended dynamic state"); |
| 380 | } | 381 | } |
| 381 | 382 | ||
| 382 | VkPhysicalDeviceRobustness2FeaturesEXT robustness2; | ||
| 383 | if (ext_robustness2) { | ||
| 384 | robustness2 = { | ||
| 385 | .sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT, | ||
| 386 | .pNext = nullptr, | ||
| 387 | .robustBufferAccess2 = true, | ||
| 388 | .robustImageAccess2 = true, | ||
| 389 | .nullDescriptor = true, | ||
| 390 | }; | ||
| 391 | SetNext(next, robustness2); | ||
| 392 | } else { | ||
| 393 | LOG_INFO(Render_Vulkan, "Device doesn't support robustness2"); | ||
| 394 | } | ||
| 395 | |||
| 396 | if (!ext_depth_range_unrestricted) { | 383 | if (!ext_depth_range_unrestricted) { |
| 397 | LOG_INFO(Render_Vulkan, "Device doesn't support depth range unrestricted"); | 384 | LOG_INFO(Render_Vulkan, "Device doesn't support depth range unrestricted"); |
| 398 | } | 385 | } |
| @@ -579,7 +566,16 @@ void Device::CheckSuitability(bool requires_swapchain) const { | |||
| 579 | throw vk::Exception(VK_ERROR_FEATURE_NOT_PRESENT); | 566 | throw vk::Exception(VK_ERROR_FEATURE_NOT_PRESENT); |
| 580 | } | 567 | } |
| 581 | } | 568 | } |
| 582 | const VkPhysicalDeviceFeatures features{physical.GetFeatures()}; | 569 | VkPhysicalDeviceRobustness2FeaturesEXT robustness2{}; |
| 570 | robustness2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT; | ||
| 571 | |||
| 572 | VkPhysicalDeviceFeatures2 features2{}; | ||
| 573 | features2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2; | ||
| 574 | features2.pNext = &robustness2; | ||
| 575 | |||
| 576 | physical.GetFeatures2KHR(features2); | ||
| 577 | |||
| 578 | const VkPhysicalDeviceFeatures& features{features2.features}; | ||
| 583 | const std::array feature_report{ | 579 | const std::array feature_report{ |
| 584 | std::make_pair(features.robustBufferAccess, "robustBufferAccess"), | 580 | std::make_pair(features.robustBufferAccess, "robustBufferAccess"), |
| 585 | std::make_pair(features.vertexPipelineStoresAndAtomics, "vertexPipelineStoresAndAtomics"), | 581 | std::make_pair(features.vertexPipelineStoresAndAtomics, "vertexPipelineStoresAndAtomics"), |
| @@ -598,6 +594,9 @@ void Device::CheckSuitability(bool requires_swapchain) const { | |||
| 598 | std::make_pair(features.shaderImageGatherExtended, "shaderImageGatherExtended"), | 594 | std::make_pair(features.shaderImageGatherExtended, "shaderImageGatherExtended"), |
| 599 | std::make_pair(features.shaderStorageImageWriteWithoutFormat, | 595 | std::make_pair(features.shaderStorageImageWriteWithoutFormat, |
| 600 | "shaderStorageImageWriteWithoutFormat"), | 596 | "shaderStorageImageWriteWithoutFormat"), |
| 597 | std::make_pair(robustness2.robustBufferAccess2, "robustBufferAccess2"), | ||
| 598 | std::make_pair(robustness2.robustImageAccess2, "robustImageAccess2"), | ||
| 599 | std::make_pair(robustness2.nullDescriptor, "nullDescriptor"), | ||
| 601 | }; | 600 | }; |
| 602 | for (const auto& [is_supported, name] : feature_report) { | 601 | for (const auto& [is_supported, name] : feature_report) { |
| 603 | if (is_supported) { | 602 | if (is_supported) { |
| @@ -621,7 +620,6 @@ std::vector<const char*> Device::LoadExtensions(bool requires_surface) { | |||
| 621 | bool has_ext_transform_feedback{}; | 620 | bool has_ext_transform_feedback{}; |
| 622 | bool has_ext_custom_border_color{}; | 621 | bool has_ext_custom_border_color{}; |
| 623 | bool has_ext_extended_dynamic_state{}; | 622 | bool has_ext_extended_dynamic_state{}; |
| 624 | bool has_ext_robustness2{}; | ||
| 625 | for (const VkExtensionProperties& extension : physical.EnumerateDeviceExtensionProperties()) { | 623 | for (const VkExtensionProperties& extension : physical.EnumerateDeviceExtensionProperties()) { |
| 626 | const auto test = [&](std::optional<std::reference_wrapper<bool>> status, const char* name, | 624 | const auto test = [&](std::optional<std::reference_wrapper<bool>> status, const char* name, |
| 627 | bool push) { | 625 | bool push) { |
| @@ -649,14 +647,12 @@ std::vector<const char*> Device::LoadExtensions(bool requires_surface) { | |||
| 649 | test(has_ext_transform_feedback, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME, false); | 647 | test(has_ext_transform_feedback, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME, false); |
| 650 | test(has_ext_custom_border_color, VK_EXT_CUSTOM_BORDER_COLOR_EXTENSION_NAME, false); | 648 | test(has_ext_custom_border_color, VK_EXT_CUSTOM_BORDER_COLOR_EXTENSION_NAME, false); |
| 651 | test(has_ext_extended_dynamic_state, VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME, false); | 649 | test(has_ext_extended_dynamic_state, VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME, false); |
| 652 | test(has_ext_robustness2, VK_EXT_ROBUSTNESS_2_EXTENSION_NAME, false); | ||
| 653 | test(has_ext_subgroup_size_control, VK_EXT_SUBGROUP_SIZE_CONTROL_EXTENSION_NAME, false); | 650 | test(has_ext_subgroup_size_control, VK_EXT_SUBGROUP_SIZE_CONTROL_EXTENSION_NAME, false); |
| 654 | if (Settings::values.renderer_debug) { | 651 | if (Settings::values.renderer_debug) { |
| 655 | test(nv_device_diagnostics_config, VK_NV_DEVICE_DIAGNOSTICS_CONFIG_EXTENSION_NAME, | 652 | test(nv_device_diagnostics_config, VK_NV_DEVICE_DIAGNOSTICS_CONFIG_EXTENSION_NAME, |
| 656 | true); | 653 | true); |
| 657 | } | 654 | } |
| 658 | } | 655 | } |
| 659 | |||
| 660 | VkPhysicalDeviceFeatures2KHR features; | 656 | VkPhysicalDeviceFeatures2KHR features; |
| 661 | features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR; | 657 | features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2_KHR; |
| 662 | 658 | ||
| @@ -673,7 +669,6 @@ std::vector<const char*> Device::LoadExtensions(bool requires_surface) { | |||
| 673 | is_float16_supported = float16_int8_features.shaderFloat16; | 669 | is_float16_supported = float16_int8_features.shaderFloat16; |
| 674 | extensions.push_back(VK_KHR_SHADER_FLOAT16_INT8_EXTENSION_NAME); | 670 | extensions.push_back(VK_KHR_SHADER_FLOAT16_INT8_EXTENSION_NAME); |
| 675 | } | 671 | } |
| 676 | |||
| 677 | if (has_ext_subgroup_size_control) { | 672 | if (has_ext_subgroup_size_control) { |
| 678 | VkPhysicalDeviceSubgroupSizeControlFeaturesEXT subgroup_features; | 673 | VkPhysicalDeviceSubgroupSizeControlFeaturesEXT subgroup_features; |
| 679 | subgroup_features.sType = | 674 | subgroup_features.sType = |
| @@ -700,7 +695,6 @@ std::vector<const char*> Device::LoadExtensions(bool requires_surface) { | |||
| 700 | } else { | 695 | } else { |
| 701 | is_warp_potentially_bigger = true; | 696 | is_warp_potentially_bigger = true; |
| 702 | } | 697 | } |
| 703 | |||
| 704 | if (has_ext_transform_feedback) { | 698 | if (has_ext_transform_feedback) { |
| 705 | VkPhysicalDeviceTransformFeedbackFeaturesEXT tfb_features; | 699 | VkPhysicalDeviceTransformFeedbackFeaturesEXT tfb_features; |
| 706 | tfb_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT; | 700 | tfb_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TRANSFORM_FEEDBACK_FEATURES_EXT; |
| @@ -722,7 +716,6 @@ std::vector<const char*> Device::LoadExtensions(bool requires_surface) { | |||
| 722 | ext_transform_feedback = true; | 716 | ext_transform_feedback = true; |
| 723 | } | 717 | } |
| 724 | } | 718 | } |
| 725 | |||
| 726 | if (has_ext_custom_border_color) { | 719 | if (has_ext_custom_border_color) { |
| 727 | VkPhysicalDeviceCustomBorderColorFeaturesEXT border_features; | 720 | VkPhysicalDeviceCustomBorderColorFeaturesEXT border_features; |
| 728 | border_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT; | 721 | border_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_CUSTOM_BORDER_COLOR_FEATURES_EXT; |
| @@ -735,7 +728,6 @@ std::vector<const char*> Device::LoadExtensions(bool requires_surface) { | |||
| 735 | ext_custom_border_color = true; | 728 | ext_custom_border_color = true; |
| 736 | } | 729 | } |
| 737 | } | 730 | } |
| 738 | |||
| 739 | if (has_ext_extended_dynamic_state) { | 731 | if (has_ext_extended_dynamic_state) { |
| 740 | VkPhysicalDeviceExtendedDynamicStateFeaturesEXT dynamic_state; | 732 | VkPhysicalDeviceExtendedDynamicStateFeaturesEXT dynamic_state; |
| 741 | dynamic_state.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT; | 733 | dynamic_state.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT; |
| @@ -748,20 +740,6 @@ std::vector<const char*> Device::LoadExtensions(bool requires_surface) { | |||
| 748 | ext_extended_dynamic_state = true; | 740 | ext_extended_dynamic_state = true; |
| 749 | } | 741 | } |
| 750 | } | 742 | } |
| 751 | |||
| 752 | if (has_ext_robustness2) { | ||
| 753 | VkPhysicalDeviceRobustness2FeaturesEXT robustness2; | ||
| 754 | robustness2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT; | ||
| 755 | robustness2.pNext = nullptr; | ||
| 756 | features.pNext = &robustness2; | ||
| 757 | physical.GetFeatures2KHR(features); | ||
| 758 | if (robustness2.nullDescriptor && robustness2.robustBufferAccess2 && | ||
| 759 | robustness2.robustImageAccess2) { | ||
| 760 | extensions.push_back(VK_EXT_ROBUSTNESS_2_EXTENSION_NAME); | ||
| 761 | ext_robustness2 = true; | ||
| 762 | } | ||
| 763 | } | ||
| 764 | |||
| 765 | return extensions; | 743 | return extensions; |
| 766 | } | 744 | } |
| 767 | 745 | ||
diff --git a/src/video_core/vulkan_common/vulkan_device.h b/src/video_core/vulkan_common/vulkan_device.h index e0711f733..67d70cd22 100644 --- a/src/video_core/vulkan_common/vulkan_device.h +++ b/src/video_core/vulkan_common/vulkan_device.h | |||
| @@ -285,7 +285,6 @@ private: | |||
| 285 | bool ext_transform_feedback{}; ///< Support for VK_EXT_transform_feedback. | 285 | bool ext_transform_feedback{}; ///< Support for VK_EXT_transform_feedback. |
| 286 | bool ext_custom_border_color{}; ///< Support for VK_EXT_custom_border_color. | 286 | bool ext_custom_border_color{}; ///< Support for VK_EXT_custom_border_color. |
| 287 | bool ext_extended_dynamic_state{}; ///< Support for VK_EXT_extended_dynamic_state. | 287 | bool ext_extended_dynamic_state{}; ///< Support for VK_EXT_extended_dynamic_state. |
| 288 | bool ext_robustness2{}; ///< Support for VK_EXT_robustness2. | ||
| 289 | bool ext_shader_stencil_export{}; ///< Support for VK_EXT_shader_stencil_export. | 288 | bool ext_shader_stencil_export{}; ///< Support for VK_EXT_shader_stencil_export. |
| 290 | bool nv_device_diagnostics_config{}; ///< Support for VK_NV_device_diagnostics_config. | 289 | bool nv_device_diagnostics_config{}; ///< Support for VK_NV_device_diagnostics_config. |
| 291 | bool has_renderdoc{}; ///< Has RenderDoc attached | 290 | bool has_renderdoc{}; ///< Has RenderDoc attached |