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