aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.Graphics.Shader/GpuGraphicsState.cs
blob: f16c71d55913dacc62fd7b4f28060772bfeedcef (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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
using Ryujinx.Common.Memory;

namespace Ryujinx.Graphics.Shader
{
    /// <summary>
    /// GPU graphics state that the shader depends on.
    /// </summary>
    public readonly struct GpuGraphicsState
    {
        /// <summary>
        /// Early Z force enable.
        /// </summary>
        public readonly bool EarlyZForce;

        /// <summary>
        /// Primitive topology of current draw.
        /// </summary>
        public readonly InputTopology Topology;

        /// <summary>
        /// Tessellation winding order.
        /// </summary>
        public readonly bool TessCw;

        /// <summary>
        /// Tessellation patch type.
        /// </summary>
        public readonly TessPatchType TessPatchType;

        /// <summary>
        /// Tessellation spacing.
        /// </summary>
        public readonly TessSpacing TessSpacing;

        /// <summary>
        /// Indicates whether alpha-to-coverage is enabled.
        /// </summary>
        public readonly bool AlphaToCoverageEnable;

        /// <summary>
        /// Indicates whether alpha-to-coverage dithering is enabled.
        /// </summary>
        public readonly bool AlphaToCoverageDitherEnable;

        /// <summary>
        /// Indicates whether the viewport transform is disabled.
        /// </summary>
        public readonly bool ViewportTransformDisable;

        /// <summary>
        /// Depth mode zero to one or minus one to one.
        /// </summary>
        public readonly bool DepthMode;

        /// <summary>
        /// Indicates if the point size is set on the shader or is fixed.
        /// </summary>
        public readonly bool ProgramPointSizeEnable;

        /// <summary>
        /// Point size used if <see cref="ProgramPointSizeEnable" /> is false.
        /// </summary>
        public readonly float PointSize;

        /// <summary>
        /// When alpha test is enabled, indicates the comparison that decides if the fragment should be discarded.
        /// </summary>
        public readonly AlphaTestOp AlphaTestCompare;

        /// <summary>
        /// When alpha test is enabled, indicates the value to compare with the fragment output alpha.
        /// </summary>
        public readonly float AlphaTestReference;

        /// <summary>
        /// Type of the vertex attributes consumed by the shader.
        /// </summary>
        public readonly Array32<AttributeType> AttributeTypes;

        /// <summary>
        /// Indicates that the draw is writing the base vertex, base instance and draw index to Constant Buffer 0.
        /// </summary>
        public readonly bool HasConstantBufferDrawParameters;

        /// <summary>
        /// Type of the fragment shader outputs.
        /// </summary>
        public readonly Array8<AttributeType> FragmentOutputTypes;

        /// <summary>
        /// Indicates whether dual source blend is enabled.
        /// </summary>
        public readonly bool DualSourceBlendEnable;

        /// <summary>
        /// Indicates if negation of the viewport Y axis is enabled.
        /// </summary>
        public readonly bool YNegateEnabled;

        /// <summary>
        /// If true, indicates that the fragment origin is the upper left corner of the viewport, otherwise it is the lower left corner.
        /// </summary>
        public readonly bool OriginUpperLeft;

        /// <summary>
        /// Creates a new GPU graphics state.
        /// </summary>
        /// <param name="earlyZForce">Early Z force enable</param>
        /// <param name="topology">Primitive topology</param>
        /// <param name="tessCw">Tessellation winding order (clockwise or counter-clockwise)</param>
        /// <param name="tessPatchType">Tessellation patch type</param>
        /// <param name="tessSpacing">Tessellation spacing</param>
        /// <param name="alphaToCoverageEnable">Indicates whether alpha-to-coverage is enabled</param>
        /// <param name="alphaToCoverageDitherEnable">Indicates whether alpha-to-coverage dithering is enabled</param>
        /// <param name="viewportTransformDisable">Indicates whether the viewport transform is disabled</param>
        /// <param name="depthMode">Depth mode zero to one or minus one to one</param>
        /// <param name="programPointSizeEnable">Indicates if the point size is set on the shader or is fixed</param>
        /// <param name="pointSize">Point size if not set from shader</param>
        /// <param name="alphaTestCompare">When alpha test is enabled, indicates the comparison that decides if the fragment should be discarded</param>
        /// <param name="alphaTestReference">When alpha test is enabled, indicates the value to compare with the fragment output alpha</param>
        /// <param name="attributeTypes">Type of the vertex attributes consumed by the shader</param>
        /// <param name="hasConstantBufferDrawParameters">Indicates that the draw is writing the base vertex, base instance and draw index to Constant Buffer 0</param>
        /// <param name="fragmentOutputTypes">Type of the fragment shader outputs</param>
        /// <param name="dualSourceBlendEnable">Indicates whether dual source blend is enabled</param>
        /// <param name="yNegateEnabled">Indicates if negation of the viewport Y axis is enabled</param>
        /// <param name="originUpperLeft">If true, indicates that the fragment origin is the upper left corner of the viewport, otherwise it is the lower left corner</param>
        public GpuGraphicsState(
            bool earlyZForce,
            InputTopology topology,
            bool tessCw,
            TessPatchType tessPatchType,
            TessSpacing tessSpacing,
            bool alphaToCoverageEnable,
            bool alphaToCoverageDitherEnable,
            bool viewportTransformDisable,
            bool depthMode,
            bool programPointSizeEnable,
            float pointSize,
            AlphaTestOp alphaTestCompare,
            float alphaTestReference,
            in Array32<AttributeType> attributeTypes,
            bool hasConstantBufferDrawParameters,
            in Array8<AttributeType> fragmentOutputTypes,
            bool dualSourceBlendEnable,
            bool yNegateEnabled,
            bool originUpperLeft)
        {
            EarlyZForce = earlyZForce;
            Topology = topology;
            TessCw = tessCw;
            TessPatchType = tessPatchType;
            TessSpacing = tessSpacing;
            AlphaToCoverageEnable = alphaToCoverageEnable;
            AlphaToCoverageDitherEnable = alphaToCoverageDitherEnable;
            ViewportTransformDisable = viewportTransformDisable;
            DepthMode = depthMode;
            ProgramPointSizeEnable = programPointSizeEnable;
            PointSize = pointSize;
            AlphaTestCompare = alphaTestCompare;
            AlphaTestReference = alphaTestReference;
            AttributeTypes = attributeTypes;
            HasConstantBufferDrawParameters = hasConstantBufferDrawParameters;
            FragmentOutputTypes = fragmentOutputTypes;
            DualSourceBlendEnable = dualSourceBlendEnable;
            YNegateEnabled = yNegateEnabled;
            OriginUpperLeft = originUpperLeft;
        }
    }
}