aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics.Vulkan/PipelineState.cs
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2023-02-19 22:37:37 -0300
committerGitHub <noreply@github.com>2023-02-19 22:37:37 -0300
commit7aa430f1a51fd793971992b4454540975222b848 (patch)
treee6a33e3df7aa5155b7c597b2ff226178f57434d1 /Ryujinx.Graphics.Vulkan/PipelineState.cs
parent6bf460e1041b969a453dc40ee6fb83164739bf9c (diff)
Add support for advanced blend (part 1/2) (#2801)1.1.626
* Add blend microcode registers * Add advanced blend support using host extension * Remove debug message * Use pre-generated table for blend functions * XML docs * Rename AdvancedBlendMode to AdvancedBlendOp for consistency * Remove redundant code * Fix some advanced blend related issues on Vulkan * Formatting
Diffstat (limited to 'Ryujinx.Graphics.Vulkan/PipelineState.cs')
-rw-r--r--Ryujinx.Graphics.Vulkan/PipelineState.cs42
1 files changed, 42 insertions, 0 deletions
diff --git a/Ryujinx.Graphics.Vulkan/PipelineState.cs b/Ryujinx.Graphics.Vulkan/PipelineState.cs
index 00b154a0..0d549476 100644
--- a/Ryujinx.Graphics.Vulkan/PipelineState.cs
+++ b/Ryujinx.Graphics.Vulkan/PipelineState.cs
@@ -285,6 +285,24 @@ namespace Ryujinx.Graphics.Vulkan
set => Internal.Id9 = (Internal.Id9 & 0xFFFFFFFFFFFFFFFD) | ((value ? 1UL : 0UL) << 1);
}
+ public bool AdvancedBlendSrcPreMultiplied
+ {
+ get => ((Internal.Id9 >> 2) & 0x1) != 0UL;
+ set => Internal.Id9 = (Internal.Id9 & 0xFFFFFFFFFFFFFFFB) | ((value ? 1UL : 0UL) << 2);
+ }
+
+ public bool AdvancedBlendDstPreMultiplied
+ {
+ get => ((Internal.Id9 >> 3) & 0x1) != 0UL;
+ set => Internal.Id9 = (Internal.Id9 & 0xFFFFFFFFFFFFFFF7) | ((value ? 1UL : 0UL) << 3);
+ }
+
+ public BlendOverlapEXT AdvancedBlendOverlap
+ {
+ get => (BlendOverlapEXT)((Internal.Id9 >> 4) & 0x3);
+ set => Internal.Id9 = (Internal.Id9 & 0xFFFFFFFFFFFFFFCF) | ((ulong)value << 4);
+ }
+
public NativeArray<PipelineShaderStageCreateInfo> Stages;
public NativeArray<PipelineShaderStageRequiredSubgroupSizeCreateInfoEXT> StageRequiredSubgroupSizes;
public PipelineLayout PipelineLayout;
@@ -303,6 +321,13 @@ namespace Ryujinx.Graphics.Vulkan
RequiredSubgroupSize = RequiredSubgroupSize
};
}
+
+ AdvancedBlendSrcPreMultiplied = true;
+ AdvancedBlendDstPreMultiplied = true;
+ AdvancedBlendOverlap = BlendOverlapEXT.UncorrelatedExt;
+
+ LineWidth = 1f;
+ SamplesCount = 1;
}
public unsafe Auto<DisposablePipeline> CreateComputePipeline(
@@ -486,6 +511,23 @@ namespace Ryujinx.Graphics.Vulkan
PAttachments = pColorBlendAttachmentState
};
+ PipelineColorBlendAdvancedStateCreateInfoEXT colorBlendAdvancedState;
+
+ if (!AdvancedBlendSrcPreMultiplied ||
+ !AdvancedBlendDstPreMultiplied ||
+ AdvancedBlendOverlap != BlendOverlapEXT.UncorrelatedExt)
+ {
+ colorBlendAdvancedState = new PipelineColorBlendAdvancedStateCreateInfoEXT()
+ {
+ SType = StructureType.PipelineColorBlendAdvancedStateCreateInfoExt,
+ SrcPremultiplied = AdvancedBlendSrcPreMultiplied,
+ DstPremultiplied = AdvancedBlendDstPreMultiplied,
+ BlendOverlap = AdvancedBlendOverlap
+ };
+
+ colorBlendState.PNext = &colorBlendAdvancedState;
+ }
+
bool supportsExtDynamicState = gd.Capabilities.SupportsExtendedDynamicState;
int dynamicStatesCount = supportsExtDynamicState ? 9 : 8;