xref: /aosp_15_r20/external/skia/src/gpu/graphite/render/CommonDepthStencilSettings.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2022 Google LLC
3*c8dee2aaSAndroid Build Coastguard Worker  *
4*c8dee2aaSAndroid Build Coastguard Worker  * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker  * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker  */
7*c8dee2aaSAndroid Build Coastguard Worker 
8*c8dee2aaSAndroid Build Coastguard Worker #ifndef skgpu_graphite_render_CommonDepthStencilSettings_DEFINED
9*c8dee2aaSAndroid Build Coastguard Worker #define skgpu_graphite_render_CommonDepthStencilSettings_DEFINED
10*c8dee2aaSAndroid Build Coastguard Worker 
11*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/DrawTypes.h"
12*c8dee2aaSAndroid Build Coastguard Worker 
13*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu::graphite {
14*c8dee2aaSAndroid Build Coastguard Worker 
15*c8dee2aaSAndroid Build Coastguard Worker /**
16*c8dee2aaSAndroid Build Coastguard Worker  * DepthStencilSettings reusable by RenderSteps that can shade directly in a single pass, using
17*c8dee2aaSAndroid Build Coastguard Worker  * GREATER or GEQUAL depth tests depending on if they allow self-intersections.
18*c8dee2aaSAndroid Build Coastguard Worker  */
19*c8dee2aaSAndroid Build Coastguard Worker 
20*c8dee2aaSAndroid Build Coastguard Worker static constexpr DepthStencilSettings kDirectDepthGreaterPass = {
21*c8dee2aaSAndroid Build Coastguard Worker         /*front=*/       {},
22*c8dee2aaSAndroid Build Coastguard Worker         /*back=*/        {},
23*c8dee2aaSAndroid Build Coastguard Worker         /*stencilRef=*/  0,
24*c8dee2aaSAndroid Build Coastguard Worker         /*stencilTest=*/ false,
25*c8dee2aaSAndroid Build Coastguard Worker         /*depthCompare=*/CompareOp::kGreater,
26*c8dee2aaSAndroid Build Coastguard Worker         /*depthTest=*/   true,
27*c8dee2aaSAndroid Build Coastguard Worker         /*depthWrite=*/  true
28*c8dee2aaSAndroid Build Coastguard Worker };
29*c8dee2aaSAndroid Build Coastguard Worker 
30*c8dee2aaSAndroid Build Coastguard Worker static constexpr DepthStencilSettings kDirectDepthGEqualPass = {
31*c8dee2aaSAndroid Build Coastguard Worker         /*front=*/       {},
32*c8dee2aaSAndroid Build Coastguard Worker         /*back=*/        {},
33*c8dee2aaSAndroid Build Coastguard Worker         /*stencilRef=*/  0,
34*c8dee2aaSAndroid Build Coastguard Worker         /*stencilTest=*/ false,
35*c8dee2aaSAndroid Build Coastguard Worker         /*depthCompare=*/CompareOp::kGEqual,
36*c8dee2aaSAndroid Build Coastguard Worker         /*depthTest=*/   true,
37*c8dee2aaSAndroid Build Coastguard Worker         /*depthWrite=*/  true
38*c8dee2aaSAndroid Build Coastguard Worker };
39*c8dee2aaSAndroid Build Coastguard Worker 
40*c8dee2aaSAndroid Build Coastguard Worker /**
41*c8dee2aaSAndroid Build Coastguard Worker  * "stencil" pass DepthStencilSettings reusable for RenderSteps following some form of
42*c8dee2aaSAndroid Build Coastguard Worker  * stencil-then-cover multi-pass algorithm.
43*c8dee2aaSAndroid Build Coastguard Worker  */
44*c8dee2aaSAndroid Build Coastguard Worker 
45*c8dee2aaSAndroid Build Coastguard Worker // Increments stencil value on clockwise triangles. Used for "winding" fill.
46*c8dee2aaSAndroid Build Coastguard Worker constexpr DepthStencilSettings::Face kIncrementCW = {
47*c8dee2aaSAndroid Build Coastguard Worker         /*stencilFail=*/   StencilOp::kKeep,
48*c8dee2aaSAndroid Build Coastguard Worker         /*depthFail=*/     StencilOp::kKeep,
49*c8dee2aaSAndroid Build Coastguard Worker         /*dsPass=*/        StencilOp::kIncWrap,
50*c8dee2aaSAndroid Build Coastguard Worker         /*compare=*/       CompareOp::kAlways,
51*c8dee2aaSAndroid Build Coastguard Worker         /*readMask=*/      0xffffffff,
52*c8dee2aaSAndroid Build Coastguard Worker         /*writeMask=*/     0xffffffff
53*c8dee2aaSAndroid Build Coastguard Worker };
54*c8dee2aaSAndroid Build Coastguard Worker 
55*c8dee2aaSAndroid Build Coastguard Worker // Decrements stencil value on counterclockwise triangles. Used for "winding" fill.
56*c8dee2aaSAndroid Build Coastguard Worker constexpr DepthStencilSettings::Face kDecrementCCW = {
57*c8dee2aaSAndroid Build Coastguard Worker         /*stencilFail=*/   StencilOp::kKeep,
58*c8dee2aaSAndroid Build Coastguard Worker         /*depthFail=*/     StencilOp::kKeep,
59*c8dee2aaSAndroid Build Coastguard Worker         /*dsPass=*/        StencilOp::kDecWrap,
60*c8dee2aaSAndroid Build Coastguard Worker         /*compare=*/       CompareOp::kAlways,
61*c8dee2aaSAndroid Build Coastguard Worker         /*readMask=*/      0xffffffff,
62*c8dee2aaSAndroid Build Coastguard Worker         /*writeMask=*/     0xffffffff
63*c8dee2aaSAndroid Build Coastguard Worker };
64*c8dee2aaSAndroid Build Coastguard Worker 
65*c8dee2aaSAndroid Build Coastguard Worker // Toggles the bottom stencil bit. Used for "even-odd" fill.
66*c8dee2aaSAndroid Build Coastguard Worker constexpr DepthStencilSettings::Face kToggle = {
67*c8dee2aaSAndroid Build Coastguard Worker         /*stencilFail=*/   StencilOp::kKeep,
68*c8dee2aaSAndroid Build Coastguard Worker         /*depthFail=*/     StencilOp::kKeep,
69*c8dee2aaSAndroid Build Coastguard Worker         /*dsPass=*/        StencilOp::kInvert,
70*c8dee2aaSAndroid Build Coastguard Worker         /*compare=*/       CompareOp::kAlways,
71*c8dee2aaSAndroid Build Coastguard Worker         /*readMask=*/      0xffffffff,
72*c8dee2aaSAndroid Build Coastguard Worker         /*writeMask=*/     0x00000001
73*c8dee2aaSAndroid Build Coastguard Worker };
74*c8dee2aaSAndroid Build Coastguard Worker 
75*c8dee2aaSAndroid Build Coastguard Worker // Stencil settings to use for a standard Redbook "stencil" pass corresponding to a "winding"
76*c8dee2aaSAndroid Build Coastguard Worker // fill rule (regular or inverse is selected by a follow-up pass).
77*c8dee2aaSAndroid Build Coastguard Worker constexpr DepthStencilSettings kWindingStencilPass = {
78*c8dee2aaSAndroid Build Coastguard Worker         /*front=*/       kIncrementCW,
79*c8dee2aaSAndroid Build Coastguard Worker         /*back=*/        kDecrementCCW,
80*c8dee2aaSAndroid Build Coastguard Worker         /*stencilRef=*/  0,
81*c8dee2aaSAndroid Build Coastguard Worker         /*stencilTest=*/ true,
82*c8dee2aaSAndroid Build Coastguard Worker         /*depthCompare=*/CompareOp::kGreater,
83*c8dee2aaSAndroid Build Coastguard Worker         /*depthTest=*/   true,
84*c8dee2aaSAndroid Build Coastguard Worker         /*depthWrite=*/  false // The depth write will be handled by the covering pass
85*c8dee2aaSAndroid Build Coastguard Worker };
86*c8dee2aaSAndroid Build Coastguard Worker 
87*c8dee2aaSAndroid Build Coastguard Worker // Stencil settings to use for a standard Redbook "stencil" pass corresponding to an "even-odd"
88*c8dee2aaSAndroid Build Coastguard Worker // fill rule (regular or inverse is selected by a follow-up pass).
89*c8dee2aaSAndroid Build Coastguard Worker constexpr DepthStencilSettings kEvenOddStencilPass = {
90*c8dee2aaSAndroid Build Coastguard Worker         /*front=*/       kToggle,
91*c8dee2aaSAndroid Build Coastguard Worker         /*back=*/        kToggle,
92*c8dee2aaSAndroid Build Coastguard Worker         /*stencilRef=*/  0,
93*c8dee2aaSAndroid Build Coastguard Worker         /*stencilTest=*/ true,
94*c8dee2aaSAndroid Build Coastguard Worker         /*depthCompare=*/CompareOp::kGreater,
95*c8dee2aaSAndroid Build Coastguard Worker         /*depthTest=*/   true,
96*c8dee2aaSAndroid Build Coastguard Worker         /*depthWrite=*/  false // The depth write will be handled by the covering pass
97*c8dee2aaSAndroid Build Coastguard Worker };
98*c8dee2aaSAndroid Build Coastguard Worker 
99*c8dee2aaSAndroid Build Coastguard Worker /**
100*c8dee2aaSAndroid Build Coastguard Worker  * "cover" pass DepthStencilSettings reusable for RenderSteps following some form of
101*c8dee2aaSAndroid Build Coastguard Worker  * stencil-then-cover multi-pass algorithm.
102*c8dee2aaSAndroid Build Coastguard Worker  */
103*c8dee2aaSAndroid Build Coastguard Worker 
104*c8dee2aaSAndroid Build Coastguard Worker // Resets non-zero bits to 0, passes when not zero. We set depthFail to kZero because if we
105*c8dee2aaSAndroid Build Coastguard Worker // encounter that case, the kNotEqual=0 stencil test passed, so it does need to be set back to 0
106*c8dee2aaSAndroid Build Coastguard Worker // and the dsPass op won't be run. In practice, since the stencil steps will fail the same depth
107*c8dee2aaSAndroid Build Coastguard Worker // test, the stencil value will likely not be non-zero, but best to be explicit.
108*c8dee2aaSAndroid Build Coastguard Worker constexpr DepthStencilSettings::Face kPassNonZero = {
109*c8dee2aaSAndroid Build Coastguard Worker         /*stencilFail=*/   StencilOp::kKeep,
110*c8dee2aaSAndroid Build Coastguard Worker         /*depthFail=*/     StencilOp::kZero,
111*c8dee2aaSAndroid Build Coastguard Worker         /*dsPass=*/        StencilOp::kZero,
112*c8dee2aaSAndroid Build Coastguard Worker         /*compare=*/       CompareOp::kNotEqual,
113*c8dee2aaSAndroid Build Coastguard Worker         /*readMask=*/      0xffffffff,
114*c8dee2aaSAndroid Build Coastguard Worker         /*writeMask=*/     0xffffffff
115*c8dee2aaSAndroid Build Coastguard Worker };
116*c8dee2aaSAndroid Build Coastguard Worker 
117*c8dee2aaSAndroid Build Coastguard Worker  // Resets non-zero bits to 0, passes when zero.
118*c8dee2aaSAndroid Build Coastguard Worker constexpr DepthStencilSettings::Face kPassZero = {
119*c8dee2aaSAndroid Build Coastguard Worker         /*stencilFail=*/   StencilOp::kZero,
120*c8dee2aaSAndroid Build Coastguard Worker         /*depthFail=*/     StencilOp::kKeep,
121*c8dee2aaSAndroid Build Coastguard Worker         /*dsPass=*/        StencilOp::kKeep,
122*c8dee2aaSAndroid Build Coastguard Worker         /*compare=*/       CompareOp::kEqual,
123*c8dee2aaSAndroid Build Coastguard Worker         /*readMask=*/      0xffffffff,
124*c8dee2aaSAndroid Build Coastguard Worker         /*writeMask=*/     0xffffffff
125*c8dee2aaSAndroid Build Coastguard Worker };
126*c8dee2aaSAndroid Build Coastguard Worker 
127*c8dee2aaSAndroid Build Coastguard Worker // Stencil settings to use for a standard Redbook "cover" pass for a regular fill, assuming that the
128*c8dee2aaSAndroid Build Coastguard Worker // stencil buffer has been modified by either kWindingStencilPass or kEvenOddStencilPass.
129*c8dee2aaSAndroid Build Coastguard Worker constexpr DepthStencilSettings kRegularCoverPass = {
130*c8dee2aaSAndroid Build Coastguard Worker         /*front=*/       kPassNonZero,
131*c8dee2aaSAndroid Build Coastguard Worker         /*back=*/        kPassNonZero,
132*c8dee2aaSAndroid Build Coastguard Worker         /*stencilRef=*/  0,
133*c8dee2aaSAndroid Build Coastguard Worker         /*stencilTest=*/ true,
134*c8dee2aaSAndroid Build Coastguard Worker         /*depthCompare=*/CompareOp::kGreater,
135*c8dee2aaSAndroid Build Coastguard Worker         /*depthTest=*/   true,
136*c8dee2aaSAndroid Build Coastguard Worker         /*depthWrite=*/  true
137*c8dee2aaSAndroid Build Coastguard Worker };
138*c8dee2aaSAndroid Build Coastguard Worker 
139*c8dee2aaSAndroid Build Coastguard Worker // Stencil settings to use for a standard Redbook "cover" pass for inverse fills, assuming that the
140*c8dee2aaSAndroid Build Coastguard Worker // stencil buffer has been modified by either kWindingStencilPass or kEvenOddStencilPass.
141*c8dee2aaSAndroid Build Coastguard Worker constexpr DepthStencilSettings kInverseCoverPass = {
142*c8dee2aaSAndroid Build Coastguard Worker         /*front=*/       kPassZero,
143*c8dee2aaSAndroid Build Coastguard Worker         /*back=*/        kPassZero,
144*c8dee2aaSAndroid Build Coastguard Worker         /*stencilRef=*/  0,
145*c8dee2aaSAndroid Build Coastguard Worker         /*stencilTest=*/ true,
146*c8dee2aaSAndroid Build Coastguard Worker         /*depthCompare=*/CompareOp::kGreater,
147*c8dee2aaSAndroid Build Coastguard Worker         /*depthTest=*/   true,
148*c8dee2aaSAndroid Build Coastguard Worker         /*depthWrite=*/  true
149*c8dee2aaSAndroid Build Coastguard Worker };
150*c8dee2aaSAndroid Build Coastguard Worker 
151*c8dee2aaSAndroid Build Coastguard Worker }  // namespace skgpu::graphite
152*c8dee2aaSAndroid Build Coastguard Worker 
153*c8dee2aaSAndroid Build Coastguard Worker #endif // skgpu_graphite_render_CommonDepthStencilSettings_DEFINED
154