aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.Graphics.Vulkan/PipelineState.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Ryujinx.Graphics.Vulkan/PipelineState.cs')
-rw-r--r--src/Ryujinx.Graphics.Vulkan/PipelineState.cs31
1 files changed, 31 insertions, 0 deletions
diff --git a/src/Ryujinx.Graphics.Vulkan/PipelineState.cs b/src/Ryujinx.Graphics.Vulkan/PipelineState.cs
index 1a396b5c..7e803913 100644
--- a/src/Ryujinx.Graphics.Vulkan/PipelineState.cs
+++ b/src/Ryujinx.Graphics.Vulkan/PipelineState.cs
@@ -1,6 +1,7 @@
using Ryujinx.Common.Memory;
using Silk.NET.Vulkan;
using System;
+using System.Numerics;
namespace Ryujinx.Graphics.Vulkan
{
@@ -542,6 +543,27 @@ namespace Ryujinx.Graphics.Vulkan
MaxDepthBounds = MaxDepthBounds
};
+ uint blendEnables = 0;
+
+ if (gd.IsMoltenVk && Internal.AttachmentIntegerFormatMask != 0)
+ {
+ // Blend can't be enabled for integer formats, so let's make sure it is disabled.
+ uint attachmentIntegerFormatMask = Internal.AttachmentIntegerFormatMask;
+
+ while (attachmentIntegerFormatMask != 0)
+ {
+ int i = BitOperations.TrailingZeroCount(attachmentIntegerFormatMask);
+
+ if (Internal.ColorBlendAttachmentState[i].BlendEnable)
+ {
+ blendEnables |= 1u << i;
+ }
+
+ Internal.ColorBlendAttachmentState[i].BlendEnable = false;
+ attachmentIntegerFormatMask &= ~(1u << i);
+ }
+ }
+
var colorBlendState = new PipelineColorBlendStateCreateInfo()
{
SType = StructureType.PipelineColorBlendStateCreateInfo,
@@ -619,6 +641,15 @@ namespace Ryujinx.Graphics.Vulkan
};
gd.Api.CreateGraphicsPipelines(device, cache, 1, &pipelineCreateInfo, null, &pipelineHandle).ThrowOnError();
+
+ // Restore previous blend enable values if we changed it.
+ while (blendEnables != 0)
+ {
+ int i = BitOperations.TrailingZeroCount(blendEnables);
+
+ Internal.ColorBlendAttachmentState[i].BlendEnable = true;
+ blendEnables &= ~(1u << i);
+ }
}
pipeline = new Auto<DisposablePipeline>(new DisposablePipeline(gd.Api, device, pipelineHandle));