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