summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar ReinUsesLisp2021-02-13 03:31:50 -0300
committerGravatar ReinUsesLisp2021-02-13 03:31:50 -0300
commit757fd1e91716d6734a564cd5bfdd47e362afd2ac (patch)
tree7c8934b97ffabf51f4dfe7599d132ea2f4359872
parentconfig: Make high GPU accuracy the default (diff)
downloadyuzu-757fd1e91716d6734a564cd5bfdd47e362afd2ac.tar.gz
yuzu-757fd1e91716d6734a564cd5bfdd47e362afd2ac.tar.xz
yuzu-757fd1e91716d6734a564cd5bfdd47e362afd2ac.zip
vulkan_device: Require VK_EXT_robustness2
We are already using robustness2 features without requiring it explicitly, causing potential crashes on drivers without the extension. Requiring this at boot allows better diagnostics for it and formalizes our usage on the extension.
-rw-r--r--src/video_core/vulkan_common/vulkan_device.cpp50
-rw-r--r--src/video_core/vulkan_common/vulkan_device.h1
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