aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics.GAL/ProgramPipelineState.cs
blob: 41afb34b0b41ffa40a267375a90ffce876479567 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
using Ryujinx.Common.Memory;
using System;

namespace Ryujinx.Graphics.GAL
{
    /// <summary>
    /// Descriptor for a pipeline buffer binding.
    /// </summary>
    public readonly struct BufferPipelineDescriptor
    {
        public bool Enable { get; }
        public int Stride { get; }
        public int Divisor { get; }

        public BufferPipelineDescriptor(bool enable, int stride, int divisor)
        {
            Enable = enable;
            Stride = stride;
            Divisor = divisor;
        }
    }

    /// <summary>
    /// State required for a program to compile shaders.
    /// </summary>
    public struct ProgramPipelineState
    {
        // Some state is considered always dynamic and should not be included:
        // - Viewports/Scissors
        // - Bias values (not enable)

        public int SamplesCount;
        public Array8<bool> AttachmentEnable;
        public Array8<Format> AttachmentFormats;
        public bool DepthStencilEnable;
        public Format DepthStencilFormat;

        public bool LogicOpEnable;
        public LogicalOp LogicOp;
        public Array8<BlendDescriptor> BlendDescriptors;
        public Array8<uint> ColorWriteMask;

        public int VertexAttribCount;
        public Array32<VertexAttribDescriptor> VertexAttribs;

        public int VertexBufferCount;
        public Array32<BufferPipelineDescriptor> VertexBuffers;

        // TODO: Min/max depth bounds.
        public DepthTestDescriptor DepthTest;
        public StencilTestDescriptor StencilTest;
        public FrontFace FrontFace;
        public Face CullMode;
        public bool CullEnable;

        public PolygonModeMask BiasEnable;

        public float LineWidth;
        // TODO: Polygon mode.
        public bool DepthClampEnable;
        public bool RasterizerDiscard;
        public PrimitiveTopology Topology;
        public bool PrimitiveRestartEnable;
        public uint PatchControlPoints;

        public void SetVertexAttribs(ReadOnlySpan<VertexAttribDescriptor> vertexAttribs)
        {
            VertexAttribCount = vertexAttribs.Length;
            vertexAttribs.CopyTo(VertexAttribs.AsSpan());
        }

        public void SetLogicOpState(bool enable, LogicalOp op)
        {
            LogicOp = op;
            LogicOpEnable = enable;
        }
    }
}