|
|
@@ -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));
|