aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics.Gpu/Engine/Threed/Blender/AdvancedBlendUcode.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Ryujinx.Graphics.Gpu/Engine/Threed/Blender/AdvancedBlendUcode.cs')
-rw-r--r--Ryujinx.Graphics.Gpu/Engine/Threed/Blender/AdvancedBlendUcode.cs126
1 files changed, 126 insertions, 0 deletions
diff --git a/Ryujinx.Graphics.Gpu/Engine/Threed/Blender/AdvancedBlendUcode.cs b/Ryujinx.Graphics.Gpu/Engine/Threed/Blender/AdvancedBlendUcode.cs
new file mode 100644
index 00000000..f06b4bf7
--- /dev/null
+++ b/Ryujinx.Graphics.Gpu/Engine/Threed/Blender/AdvancedBlendUcode.cs
@@ -0,0 +1,126 @@
+using Ryujinx.Graphics.GAL;
+
+namespace Ryujinx.Graphics.Gpu.Engine.Threed.Blender
+{
+ /// <summary>
+ /// Fixed function alpha state used for a advanced blend function.
+ /// </summary>
+ struct FixedFunctionAlpha
+ {
+ /// <summary>
+ /// Fixed function alpha state with alpha blending disabled.
+ /// </summary>
+ public static FixedFunctionAlpha Disabled => new FixedFunctionAlpha(BlendUcodeEnable.EnableRGBA, default, default, default);
+
+ /// <summary>
+ /// Individual enable bits for the RGB and alpha components.
+ /// </summary>
+ public BlendUcodeEnable Enable { get; }
+
+ /// <summary>
+ /// Alpha blend operation.
+ /// </summary>
+ public BlendOp AlphaOp { get; }
+
+ /// <summary>
+ /// Value multiplied with the blend source operand.
+ /// </summary>
+ public BlendFactor AlphaSrcFactor { get; }
+
+ /// <summary>
+ /// Value multiplied with the blend destination operand.
+ /// </summary>
+ public BlendFactor AlphaDstFactor { get; }
+
+ /// <summary>
+ /// Creates a new blend fixed function alpha state.
+ /// </summary>
+ /// <param name="enable">Individual enable bits for the RGB and alpha components</param>
+ /// <param name="alphaOp">Alpha blend operation</param>
+ /// <param name="alphaSrc">Value multiplied with the blend source operand</param>
+ /// <param name="alphaDst">Value multiplied with the blend destination operand</param>
+ public FixedFunctionAlpha(BlendUcodeEnable enable, BlendOp alphaOp, BlendFactor alphaSrc, BlendFactor alphaDst)
+ {
+ Enable = enable;
+ AlphaOp = alphaOp;
+ AlphaSrcFactor = alphaSrc;
+ AlphaDstFactor = alphaDst;
+ }
+
+ /// <summary>
+ /// Creates a new blend fixed function alpha state.
+ /// </summary>
+ /// <param name="alphaOp">Alpha blend operation</param>
+ /// <param name="alphaSrc">Value multiplied with the blend source operand</param>
+ /// <param name="alphaDst">Value multiplied with the blend destination operand</param>
+ public FixedFunctionAlpha(BlendOp alphaOp, BlendFactor alphaSrc, BlendFactor alphaDst) : this(BlendUcodeEnable.EnableRGB, alphaOp, alphaSrc, alphaDst)
+ {
+ }
+ }
+
+ /// <summary>
+ /// Blend microcode assembly function delegate.
+ /// </summary>
+ /// <param name="asm">Assembler</param>
+ /// <returns>Fixed function alpha state for the microcode</returns>
+ delegate FixedFunctionAlpha GenUcodeFunc(ref UcodeAssembler asm);
+
+ /// <summary>
+ /// Advanced blend microcode state.
+ /// </summary>
+ struct AdvancedBlendUcode
+ {
+ /// <summary>
+ /// Advanced blend operation.
+ /// </summary>
+ public AdvancedBlendOp Op { get; }
+
+ /// <summary>
+ /// Advanced blend overlap mode.
+ /// </summary>
+ public AdvancedBlendOverlap Overlap { get; }
+
+ /// <summary>
+ /// Whenever the source input is pre-multiplied.
+ /// </summary>
+ public bool SrcPreMultiplied { get; }
+
+ /// <summary>
+ /// Fixed function alpha state.
+ /// </summary>
+ public FixedFunctionAlpha Alpha { get; }
+
+ /// <summary>
+ /// Microcode.
+ /// </summary>
+ public uint[] Code { get; }
+
+ /// <summary>
+ /// Constants used by the microcode.
+ /// </summary>
+ public RgbFloat[] Constants { get; }
+
+ /// <summary>
+ /// Creates a new advanced blend state.
+ /// </summary>
+ /// <param name="op">Advanced blend operation</param>
+ /// <param name="overlap">Advanced blend overlap mode</param>
+ /// <param name="srcPreMultiplied">Whenever the source input is pre-multiplied</param>
+ /// <param name="genFunc">Function that will generate the advanced blend microcode</param>
+ public AdvancedBlendUcode(
+ AdvancedBlendOp op,
+ AdvancedBlendOverlap overlap,
+ bool srcPreMultiplied,
+ GenUcodeFunc genFunc)
+ {
+ Op = op;
+ Overlap = overlap;
+ SrcPreMultiplied = srcPreMultiplied;
+
+ UcodeAssembler asm = new UcodeAssembler();
+ Alpha = genFunc(ref asm);
+ Code = asm.GetCode();
+ Constants = asm.GetConstants();
+ }
+ }
+} \ No newline at end of file