summaryrefslogtreecommitdiff
path: root/Source/Core/VideoCommon/ShaderCache.cpp
diff options
context:
space:
mode:
authorTellowKrinkle <tellowkrinkle@gmail.com>2022-06-12 21:27:11 -0500
committerTellowKrinkle <tellowkrinkle@gmail.com>2022-07-15 15:31:47 -0500
commit991024173e3d048ea3a056c8debb6f92ae7b2da0 (patch)
tree93259d094433a7ca7a1e9341508be4f2209d63f6 /Source/Core/VideoCommon/ShaderCache.cpp
parent6ab24e6c176bfd288296bf8284a30b0835fa45c3 (diff)
VideoCommon: Always use fbfetch in ubershaders if available
Reduce the number of different pipelines needed. Also works around drivers that break when you combine fbfetch with dual source blending
Diffstat (limited to 'Source/Core/VideoCommon/ShaderCache.cpp')
-rw-r--r--Source/Core/VideoCommon/ShaderCache.cpp14
1 files changed, 11 insertions, 3 deletions
diff --git a/Source/Core/VideoCommon/ShaderCache.cpp b/Source/Core/VideoCommon/ShaderCache.cpp
index e4d2115c3b..6049fd29a7 100644
--- a/Source/Core/VideoCommon/ShaderCache.cpp
+++ b/Source/Core/VideoCommon/ShaderCache.cpp
@@ -743,9 +743,17 @@ static GXUberPipelineUid ApplyDriverBugs(const GXUberPipelineUid& in)
{
GXUberPipelineUid out;
memcpy(&out, &in, sizeof(out)); // Copy padding
- if (!g_ActiveConfig.backend_info.bSupportsDualSourceBlend ||
- (DriverDetails::HasBug(DriverDetails::BUG_BROKEN_DUAL_SOURCE_BLENDING) &&
- !out.blending_state.RequiresDualSrc()))
+ if (g_ActiveConfig.backend_info.bSupportsFramebufferFetch)
+ {
+ // Always blend in shader
+ out.blending_state.hex = 0;
+ out.blending_state.colorupdate = in.blending_state.colorupdate.Value();
+ out.blending_state.alphaupdate = in.blending_state.alphaupdate.Value();
+ out.ps_uid.GetUidData()->no_dual_src = true;
+ }
+ else if (!g_ActiveConfig.backend_info.bSupportsDualSourceBlend ||
+ (DriverDetails::HasBug(DriverDetails::BUG_BROKEN_DUAL_SOURCE_BLENDING) &&
+ !out.blending_state.RequiresDualSrc()))
{
out.blending_state.usedualsrc = false;
out.ps_uid.GetUidData()->no_dual_src = true;