From a256c11d2f885e950e68bcd43c34080676171f4a Mon Sep 17 00:00:00 2001 From: OatmealDome Date: Fri, 23 Jul 2021 08:32:21 -0400 Subject: [PATCH] DriverDetails: Add broken dual source blending bug to MoltenVK on Intel GPUs --- Source/Core/VideoBackends/Vulkan/VKPipeline.cpp | 8 +++++++- Source/Core/VideoCommon/DriverDetails.cpp | 2 ++ Source/Core/VideoCommon/DriverDetails.h | 11 +++++++---- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/Source/Core/VideoBackends/Vulkan/VKPipeline.cpp b/Source/Core/VideoBackends/Vulkan/VKPipeline.cpp index 04c325cb7b..716f7be530 100644 --- a/Source/Core/VideoBackends/Vulkan/VKPipeline.cpp +++ b/Source/Core/VideoBackends/Vulkan/VKPipeline.cpp @@ -14,6 +14,8 @@ #include "VideoBackends/Vulkan/VKVertexFormat.h" #include "VideoBackends/Vulkan/VulkanContext.h" +#include "VideoCommon/DriverDetails.h" + namespace Vulkan { VKPipeline::VKPipeline(VkPipeline pipeline, VkPipelineLayout pipeline_layout, @@ -137,7 +139,11 @@ static VkPipelineColorBlendAttachmentState GetVulkanAttachmentBlendState(const B vk_state.colorBlendOp = state.subtract ? VK_BLEND_OP_REVERSE_SUBTRACT : VK_BLEND_OP_ADD; vk_state.alphaBlendOp = state.subtractAlpha ? VK_BLEND_OP_REVERSE_SUBTRACT : VK_BLEND_OP_ADD; - if (state.usedualsrc && g_ActiveConfig.backend_info.bSupportsDualSourceBlend) + bool use_dual_source = + state.usedualsrc && g_ActiveConfig.backend_info.bSupportsDualSourceBlend && + (!DriverDetails::HasBug(DriverDetails::BUG_BROKEN_DUAL_SOURCE_BLENDING) || state.dstalpha); + + if (use_dual_source) { static constexpr std::array src_factors = { {VK_BLEND_FACTOR_ZERO, VK_BLEND_FACTOR_ONE, VK_BLEND_FACTOR_DST_COLOR, diff --git a/Source/Core/VideoCommon/DriverDetails.cpp b/Source/Core/VideoCommon/DriverDetails.cpp index 4b1ce936d0..6029654e57 100644 --- a/Source/Core/VideoCommon/DriverDetails.cpp +++ b/Source/Core/VideoCommon/DriverDetails.cpp @@ -95,6 +95,8 @@ constexpr BugInfo m_known_bugs[] = { BUG_BROKEN_DUAL_SOURCE_BLENDING, -1.0, -1.0, true}, {API_OPENGL, OS_OSX, VENDOR_INTEL, DRIVER_INTEL, Family::UNKNOWN, BUG_BROKEN_DUAL_SOURCE_BLENDING, -1.0, -1.0, true}, + {API_VULKAN, OS_OSX, VENDOR_INTEL, DRIVER_PORTABILITY, Family::UNKNOWN, + BUG_BROKEN_DUAL_SOURCE_BLENDING, -1.0, -1.0, true}, {API_OPENGL, OS_ALL, VENDOR_IMGTEC, DRIVER_IMGTEC, Family::UNKNOWN, BUG_BROKEN_BITWISE_OP_NEGATION, -1.0, 108.4693462, true}, {API_VULKAN, OS_WINDOWS, VENDOR_ATI, DRIVER_ATI, Family::UNKNOWN, BUG_PRIMITIVE_RESTART, -1.0, diff --git a/Source/Core/VideoCommon/DriverDetails.h b/Source/Core/VideoCommon/DriverDetails.h index 6a9927faa3..5e3f2ce161 100644 --- a/Source/Core/VideoCommon/DriverDetails.h +++ b/Source/Core/VideoCommon/DriverDetails.h @@ -229,13 +229,16 @@ enum Bug // index as a MRT location instead, or omit the binding completely. BUG_BROKEN_FRAGMENT_SHADER_INDEX_DECORATION, - // Bug: Dual-source outputs from fragment shaders are broken on AMD OpenGL drivers + // Bug: Dual-source outputs from fragment shaders are broken on some drivers. // Started Version: -1 // Ended Version: -1 - // Fragment shaders that specify dual-source outputs, cause the driver to crash - // sometimes this happens in the kernel mode part of the driver resulting in a BSOD. - // Disable dual-source blending support for now. + // On some AMD drivers, fragment shaders that specify dual-source outputs can cause the driver to + // crash. Sometimes this happens in the kernel mode part of the driver, resulting in a BSOD. + // These shaders are also particularly problematic on macOS's Intel drivers. On OpenGL, they can + // cause depth issues. On Metal, they can cause the driver to not write a primitive to the depth + // buffer whenever a fragment is discarded. Disable dual-source blending support on these drivers. BUG_BROKEN_DUAL_SOURCE_BLENDING, + // BUG: ImgTec GLSL shader compiler fails when negating the input to a bitwise operation // Started version: 1.5 // Ended version: 1.8@4693462