Skip to content

Commit

Permalink
Merge pull request #9945 from OatmealDome/intel-broken-discard
Browse files Browse the repository at this point in the history
DriverDetails: Add broken dual source blending bug to MoltenVK on Intel GPUs
  • Loading branch information
phire authored Sep 29, 2021
2 parents c84c1ac + a256c11 commit a47b91e
Show file tree
Hide file tree
Showing 4 changed files with 18 additions and 7 deletions.
8 changes: 7 additions & 1 deletion Source/Core/VideoBackends/Vulkan/VKPipeline.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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<VkBlendFactor, 8> src_factors = {
{VK_BLEND_FACTOR_ZERO, VK_BLEND_FACTOR_ONE, VK_BLEND_FACTOR_DST_COLOR,
Expand Down
4 changes: 2 additions & 2 deletions Source/Core/VideoBackends/Vulkan/VulkanContext.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -869,8 +869,8 @@ void VulkanContext::InitDriverDetails()
{
// Apart from the driver version, Intel does not appear to provide a way to
// differentiate between anv and the binary driver (Skylake+). Assume to be
// using anv if we not running on Windows.
#ifdef WIN32
// using anv if we're not running on Windows or macOS.
#if defined(WIN32) || defined(__APPLE__)
vendor = DriverDetails::VENDOR_INTEL;
driver = DriverDetails::DRIVER_INTEL;
#else
Expand Down
2 changes: 2 additions & 0 deletions Source/Core/VideoCommon/DriverDetails.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
11 changes: 7 additions & 4 deletions Source/Core/VideoCommon/DriverDetails.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit a47b91e

Please sign in to comment.