فهرست منبع

Vulkan: add temporary workaround for AMDVLK

Fernando Sahmkow 2 سال پیش
والد
کامیت
b99f94a7ff

+ 2 - 0
src/common/settings.h

@@ -350,6 +350,8 @@ struct Values {
         linkage, false, "disable_shader_loop_safety_checks", Category::RendererDebug};
     Setting<bool> enable_renderdoc_hotkey{linkage, false, "renderdoc_hotkey",
                                           Category::RendererDebug};
+    // TODO: remove this once AMDVLK supports VK_EXT_depth_bias_control
+    bool renderer_amdvlk_depth_bias_workaround{};
 
     // System
     SwitchableSetting<Language, true> language_index{linkage,

+ 7 - 0
src/core/core.cpp

@@ -381,6 +381,10 @@ struct System::Impl {
             room_member->SendGameInfo(game_info);
         }
 
+        // Workarounds:
+        // Activate this in Super Smash Brothers Ultimate, it only affects AMD cards using AMDVLK
+        Settings::values.renderer_amdvlk_depth_bias_workaround = program_id == 0x1006A800016E000ULL;
+
         status = SystemResultStatus::Success;
         return status;
     }
@@ -440,6 +444,9 @@ struct System::Impl {
             room_member->SendGameInfo(game_info);
         }
 
+        // Workarounds
+        Settings::values.renderer_amdvlk_depth_bias_workaround = false;
+
         LOG_DEBUG(Core, "Shutdown OK");
     }
 

+ 3 - 0
src/video_core/renderer_vulkan/vk_rasterizer.cpp

@@ -1050,6 +1050,9 @@ void RasterizerVulkan::UpdateDepthBias(Tegra::Engines::Maxwell3D::Regs& regs) {
         if (device.IsExtDepthBiasControlSupported()) {
             return true;
         }
+        if (!Settings::values.renderer_amdvlk_depth_bias_workaround) {
+            return false;
+        }
         // the base formulas can be obtained from here:
         //   https://docs.microsoft.com/en-us/windows/win32/direct3d11/d3d10-graphics-programming-guide-output-merger-stage-depth-bias
         const double rescale_factor =

+ 7 - 0
src/video_core/vulkan_common/vulkan_device.cpp

@@ -1051,6 +1051,13 @@ void Device::RemoveUnsuitableExtensions() {
     RemoveExtensionFeatureIfUnsuitable(extensions.custom_border_color, features.custom_border_color,
                                        VK_EXT_CUSTOM_BORDER_COLOR_EXTENSION_NAME);
 
+    // VK_EXT_depth_bias_control
+    extensions.depth_bias_control =
+        features.depth_bias_control.depthBiasControl &&
+        features.depth_bias_control.leastRepresentableValueForceUnormRepresentation;
+    RemoveExtensionFeatureIfUnsuitable(extensions.depth_bias_control, features.depth_bias_control,
+                                       VK_EXT_DEPTH_BIAS_CONTROL_EXTENSION_NAME);
+
     // VK_EXT_depth_clip_control
     extensions.depth_clip_control = features.depth_clip_control.depthClipControl;
     RemoveExtensionFeatureIfUnsuitable(extensions.depth_clip_control, features.depth_clip_control,

+ 1 - 2
src/video_core/vulkan_common/vulkan_device.h

@@ -456,8 +456,7 @@ public:
 
     /// Returns true if the device supports VK_EXT_depth_bias_control.
     bool IsExtDepthBiasControlSupported() const {
-        return extensions.depth_bias_control && features.depth_bias_control.depthBiasControl &&
-               features.depth_bias_control.leastRepresentableValueForceUnormRepresentation;
+        return extensions.depth_bias_control;
     }
 
     /// Returns true if the device supports VK_EXT_shader_viewport_index_layer.