/src/skia/src/gpu/ganesh/GrStencilSettings.h
Line | Count | Source (jump to first uncovered line) |
1 | | /* |
2 | | * Copyright 2016 Google Inc. |
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 | | #ifndef GrStencilSettings_DEFINED |
8 | | #define GrStencilSettings_DEFINED |
9 | | |
10 | | #include "include/gpu/GrTypes.h" |
11 | | #include "include/private/base/SkAssert.h" |
12 | | #include "src/gpu/ganesh/GrUserStencilSettings.h" |
13 | | |
14 | | #include <cstdint> |
15 | | |
16 | | namespace skgpu { |
17 | | class KeyBuilder; |
18 | | } |
19 | | |
20 | | enum class GrStencilTest : uint16_t { |
21 | | kAlways, |
22 | | kNever, |
23 | | kGreater, |
24 | | kGEqual, |
25 | | kLess, |
26 | | kLEqual, |
27 | | kEqual, |
28 | | kNotEqual |
29 | | }; |
30 | | static constexpr int kGrStencilTestCount = 1 + (int)GrStencilTest::kNotEqual; |
31 | | |
32 | | enum class GrStencilOp : uint8_t { |
33 | | kKeep, |
34 | | kZero, |
35 | | kReplace, // Replace stencil value with fRef (only the bits enabled in fWriteMask). |
36 | | kInvert, |
37 | | kIncWrap, |
38 | | kDecWrap, |
39 | | // NOTE: clamping occurs before the write mask. So if the MSB is zero and masked out, stencil |
40 | | // values will still wrap when using clamping ops. |
41 | | kIncClamp, |
42 | | kDecClamp |
43 | | }; |
44 | | static constexpr int kGrStencilOpCount = 1 + (int)GrStencilOp::kDecClamp; |
45 | | |
46 | | /** |
47 | | * This class defines concrete stencil settings that map directly to the underlying hardware. It |
48 | | * is deduced from user stencil settings, stencil clip status, and the number of bits in the |
49 | | * target stencil buffer. |
50 | | */ |
51 | | class GrStencilSettings { |
52 | | public: |
53 | 0 | GrStencilSettings() { this->setDisabled(); } |
54 | 0 | GrStencilSettings(const GrUserStencilSettings& user, bool hasStencilClip, int numStencilBits) { |
55 | 0 | this->reset(user, hasStencilClip, numStencilBits); |
56 | 0 | } |
57 | 0 | GrStencilSettings(const GrStencilSettings& that) { this->reset(that); } |
58 | 0 | GrStencilSettings& operator=(const GrStencilSettings& that) { this->reset(that); return *this; } |
59 | | |
60 | 0 | void invalidate() { fFlags |= kInvalid_PrivateFlag; } |
61 | 0 | void setDisabled() { fFlags = kAll_StencilFlags; } |
62 | | void reset(const GrUserStencilSettings&, bool hasStencilClip, int numStencilBits); |
63 | | void reset(const GrStencilSettings&); |
64 | | |
65 | 0 | bool isValid() const { return !(fFlags & kInvalid_PrivateFlag); } |
66 | 0 | bool isDisabled() const { SkASSERT(this->isValid()); return fFlags & kDisabled_StencilFlag; } Unexecuted instantiation: GrStencilSettings::isDisabled() const Unexecuted instantiation: GrStencilSettings::isDisabled() const |
67 | 0 | bool doesWrite() const { SkASSERT(this->isValid()); |
68 | 0 | return !(fFlags & kNoModifyStencil_StencilFlag); } |
69 | 0 | bool isTwoSided() const { SkASSERT(this->isValid()); |
70 | 0 | return !(fFlags & kSingleSided_StencilFlag); } Unexecuted instantiation: GrStencilSettings::isTwoSided() const Unexecuted instantiation: GrStencilSettings::isTwoSided() const |
71 | 0 | bool usesWrapOp() const { SkASSERT(this->isValid()); |
72 | 0 | return !(fFlags & kNoWrapOps_StencilFlag); } |
73 | | |
74 | | void genKey(skgpu::KeyBuilder* b, bool includeRefsAndMasks) const; |
75 | | |
76 | 0 | bool operator!=(const GrStencilSettings& that) const { return !(*this == that); } |
77 | | bool operator==(const GrStencilSettings&) const; |
78 | | |
79 | | struct Face : public GrTStencilFaceSettings<GrStencilTest, GrStencilOp> { |
80 | | void reset(const GrUserStencilSettings::Face&, bool useStencilClip, int numStencilBits); |
81 | | void setDisabled(); |
82 | | }; |
83 | | |
84 | 0 | const Face& singleSidedFace() const { |
85 | 0 | SkASSERT(!this->isDisabled()); |
86 | 0 | SkASSERT(!this->isTwoSided()); |
87 | 0 | return fCWFace; |
88 | 0 | } Unexecuted instantiation: GrStencilSettings::singleSidedFace() const Unexecuted instantiation: GrStencilSettings::singleSidedFace() const |
89 | | // Returns the stencil settings for triangles that wind clockwise in "post-origin" space. |
90 | | // (i.e., the space that results after a potential y-axis flip on device space for bottom-left |
91 | | // origins.) |
92 | 0 | const Face& postOriginCWFace(GrSurfaceOrigin origin) const { |
93 | 0 | SkASSERT(this->isTwoSided()); |
94 | 0 | return (kTopLeft_GrSurfaceOrigin == origin) ? fCWFace : fCCWFace; |
95 | 0 | } Unexecuted instantiation: GrStencilSettings::postOriginCWFace(GrSurfaceOrigin) const Unexecuted instantiation: GrStencilSettings::postOriginCWFace(GrSurfaceOrigin) const |
96 | | // Returns the stencil settings for triangles that wind counter-clockwise in "post-origin" |
97 | | // space. (i.e., the space that results after a potential y-axis flip on device space for |
98 | | // bottom-left origins.) |
99 | 0 | const Face& postOriginCCWFace(GrSurfaceOrigin origin) const { |
100 | 0 | SkASSERT(this->isTwoSided()); |
101 | 0 | return (kTopLeft_GrSurfaceOrigin == origin) ? fCCWFace : fCWFace; |
102 | 0 | } Unexecuted instantiation: GrStencilSettings::postOriginCCWFace(GrSurfaceOrigin) const Unexecuted instantiation: GrStencilSettings::postOriginCCWFace(GrSurfaceOrigin) const |
103 | | |
104 | | /** Gets the user stencil settings to directly set the clip bit. */ |
105 | | static const GrUserStencilSettings* SetClipBitSettings(bool setToInside); |
106 | | |
107 | | private: |
108 | | // Internal flag for backends to optionally mark their tracked stencil state as invalid. |
109 | | // NOTE: This value is outside the declared range of GrStencilFlags, but since that type is |
110 | | // explicitly backed by 'int', it can still represent this constant. clang 11 complains about |
111 | | // mixing enum types in bit operations, so this works around that. |
112 | | inline static constexpr GrStencilFlags kInvalid_PrivateFlag = |
113 | | static_cast<GrStencilFlags>(kLast_StencilFlag << 1); |
114 | | |
115 | | uint32_t fFlags; |
116 | | Face fCWFace; |
117 | | Face fCCWFace; |
118 | | }; |
119 | | |
120 | | #endif |