Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(211)

Side by Side Diff: src/gpu/GrStencil.cpp

Issue 1933053002: Use constexpr constructors of GrStencilSettings rather than hacky macro system (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Address comment Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/gpu/GrStencil.h ('k') | src/gpu/batches/GrDefaultPathRenderer.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2011 Google Inc. 2 * Copyright 2011 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 8
9 #include "GrStencil.h" 9 #include "GrStencil.h"
10 10
11 #include "GrProcessor.h" 11 #include "GrProcessor.h"
12 12
13 //////////////////////////////////////////////////////////////////////////////// 13 ////////////////////////////////////////////////////////////////////////////////
14 // Stencil Rules for Merging user stencil space into clip 14 // Stencil Rules for Merging user stencil space into clip
15 15
16 // We can't include the clip bit in the ref or mask values because the division 16 // We can't include the clip bit in the ref or mask values because the division
17 // between user and clip bits in the stencil depends on the number of stencil 17 // between user and clip bits in the stencil depends on the number of stencil
18 // bits in the runtime. Comments below indicate what the code should do to 18 // bits in the runtime. Comments below indicate what the code should do to
19 // incorporate the clip bit into these settings. 19 // incorporate the clip bit into these settings.
20 20
21 /////// 21 ///////
22 // Replace 22 // Replace
23 23
24 // set the ref to be the clip bit, but mask it out for the test 24 // set the ref to be the clip bit, but mask it out for the test
25 GR_STATIC_CONST_SAME_STENCIL(gUserToClipReplace, 25 static constexpr GrStencilSettings gUserToClipReplace(
26 kReplace_StencilOp, 26 kReplace_StencilOp,
27 kZero_StencilOp, 27 kZero_StencilOp,
28 kLess_StencilFunc, 28 kLess_StencilFunc,
29 0xffff, // unset clip bit 29 0xffff, // unset clip bit
30 0x0000, // set clip bit 30 0x0000, // set clip bit
31 0xffff); 31 0xffff);
32 32
33 GR_STATIC_CONST_SAME_STENCIL(gInvUserToClipReplace, 33 static constexpr GrStencilSettings gInvUserToClipReplace(
34 kReplace_StencilOp, 34 kReplace_StencilOp,
35 kZero_StencilOp, 35 kZero_StencilOp,
36 kEqual_StencilFunc, 36 kEqual_StencilFunc,
37 0xffff, // unset clip bit 37 0xffff, // unset clip bit
38 0x0000, // set clip bit 38 0x0000, // set clip bit
39 0xffff); 39 0xffff);
40 40
41 /////// 41 ///////
42 // Intersect 42 // Intersect
43 GR_STATIC_CONST_SAME_STENCIL(gUserToClipIsect, 43 static constexpr GrStencilSettings gUserToClipIsect(
44 kReplace_StencilOp, 44 kReplace_StencilOp,
45 kZero_StencilOp, 45 kZero_StencilOp,
46 kLess_StencilFunc, 46 kLess_StencilFunc,
47 0xffff, 47 0xffff,
48 0x0000, // set clip bit 48 0x0000, // set clip bit
49 0xffff); 49 0xffff);
50 50
51 GR_STATIC_CONST_SAME_STENCIL(gInvUserToClipIsect, 51 static constexpr GrStencilSettings gInvUserToClipIsect(
52 kReplace_StencilOp, 52 kReplace_StencilOp,
53 kZero_StencilOp, 53 kZero_StencilOp,
54 kEqual_StencilFunc, 54 kEqual_StencilFunc,
55 0xffff, 55 0xffff,
56 0x0000, // set clip bit 56 0x0000, // set clip bit
57 0xffff); 57 0xffff);
58 58
59 /////// 59 ///////
60 // Difference 60 // Difference
61 GR_STATIC_CONST_SAME_STENCIL(gUserToClipDiff, 61 static constexpr GrStencilSettings gUserToClipDiff(
62 kReplace_StencilOp, 62 kReplace_StencilOp,
63 kZero_StencilOp, 63 kZero_StencilOp,
64 kEqual_StencilFunc, 64 kEqual_StencilFunc,
65 0xffff, 65 0xffff,
66 0x0000, // set clip bit 66 0x0000, // set clip bit
67 0xffff); 67 0xffff);
68 68
69 GR_STATIC_CONST_SAME_STENCIL(gInvUserToClipDiff, 69 static constexpr GrStencilSettings gInvUserToClipDiff(
70 kReplace_StencilOp, 70 kReplace_StencilOp,
71 kZero_StencilOp, 71 kZero_StencilOp,
72 kLess_StencilFunc, 72 kLess_StencilFunc,
73 0xffff, 73 0xffff,
74 0x0000, // set clip bit 74 0x0000, // set clip bit
75 0xffff); 75 0xffff);
76 76
77 /////// 77 ///////
78 // Union 78 // Union
79 79
80 // first pass makes all the passing cases >= just clip bit set. 80 // first pass makes all the passing cases >= just clip bit set.
81 GR_STATIC_CONST_SAME_STENCIL(gUserToClipUnionPass0, 81 static constexpr GrStencilSettings gUserToClipUnionPass0(
82 kReplace_StencilOp, 82 kReplace_StencilOp,
83 kKeep_StencilOp, 83 kKeep_StencilOp,
84 kLEqual_StencilFunc, 84 kLEqual_StencilFunc,
85 0xffff, 85 0xffff,
86 0x0001, // set clip bit 86 0x0001, // set clip bit
87 0xffff); 87 0xffff);
88 88
89 // second pass allows anything greater than just clip bit set to pass 89 // second pass allows anything greater than just clip bit set to pass
90 GR_STATIC_CONST_SAME_STENCIL(gUserToClipUnionPass1, 90 static constexpr GrStencilSettings gUserToClipUnionPass1(
91 kReplace_StencilOp, 91 kReplace_StencilOp,
92 kZero_StencilOp, 92 kZero_StencilOp,
93 kLEqual_StencilFunc, 93 kLEqual_StencilFunc,
94 0xffff, 94 0xffff,
95 0x0000, // set clip bit 95 0x0000, // set clip bit
96 0xffff); 96 0xffff);
97 97
98 // first pass finds zeros in the user bits and if found sets 98 // first pass finds zeros in the user bits and if found sets
99 // the clip bit to 1 99 // the clip bit to 1
100 GR_STATIC_CONST_SAME_STENCIL(gInvUserToClipUnionPass0, 100 static constexpr GrStencilSettings gInvUserToClipUnionPass0(
101 kReplace_StencilOp, 101 kReplace_StencilOp,
102 kKeep_StencilOp, 102 kKeep_StencilOp,
103 kEqual_StencilFunc, 103 kEqual_StencilFunc,
104 0xffff, 104 0xffff,
105 0x0000, // set clip bit 105 0x0000, // set clip bit
106 0x0000 // set clip bit 106 0x0000 // set clip bit
107 ); 107 );
108 108
109 // second pass zeros the user bits 109 // second pass zeros the user bits
110 GR_STATIC_CONST_SAME_STENCIL(gInvUserToClipUnionPass1, 110 static constexpr GrStencilSettings gInvUserToClipUnionPass1(
111 kZero_StencilOp, 111 kZero_StencilOp,
112 kZero_StencilOp, 112 kZero_StencilOp,
113 kLess_StencilFunc, 113 kLess_StencilFunc,
114 0xffff, 114 0xffff,
115 0x0000, 115 0x0000,
116 0xffff // unset clip bit 116 0xffff // unset clip bit
117 ); 117 );
118 118
119 /////// 119 ///////
120 // Xor 120 // Xor
121 GR_STATIC_CONST_SAME_STENCIL(gUserToClipXorPass0, 121 static constexpr GrStencilSettings gUserToClipXorPass0(
122 kInvert_StencilOp, 122 kInvert_StencilOp,
123 kKeep_StencilOp, 123 kKeep_StencilOp,
124 kEqual_StencilFunc, 124 kEqual_StencilFunc,
125 0xffff, // unset clip bit 125 0xffff, // unset clip bit
126 0x0000, 126 0x0000,
127 0xffff); 127 0xffff);
128 128
129 GR_STATIC_CONST_SAME_STENCIL(gUserToClipXorPass1, 129 static constexpr GrStencilSettings gUserToClipXorPass1(
130 kReplace_StencilOp, 130 kReplace_StencilOp,
131 kZero_StencilOp, 131 kZero_StencilOp,
132 kGreater_StencilFunc, 132 kGreater_StencilFunc,
133 0xffff, 133 0xffff,
134 0x0000, // set clip bit 134 0x0000, // set clip bit
135 0xffff); 135 0xffff);
136 136
137 GR_STATIC_CONST_SAME_STENCIL(gInvUserToClipXorPass0, 137 static constexpr GrStencilSettings gInvUserToClipXorPass0(
138 kInvert_StencilOp, 138 kInvert_StencilOp,
139 kKeep_StencilOp, 139 kKeep_StencilOp,
140 kEqual_StencilFunc, 140 kEqual_StencilFunc,
141 0xffff, // unset clip bit 141 0xffff, // unset clip bit
142 0x0000, 142 0x0000,
143 0xffff); 143 0xffff);
144 144
145 GR_STATIC_CONST_SAME_STENCIL(gInvUserToClipXorPass1, 145 static constexpr GrStencilSettings gInvUserToClipXorPass1(
146 kReplace_StencilOp, 146 kReplace_StencilOp,
147 kZero_StencilOp, 147 kZero_StencilOp,
148 kLess_StencilFunc, 148 kLess_StencilFunc,
149 0xffff, 149 0xffff,
150 0x0000, // set clip bit 150 0x0000, // set clip bit
151 0xffff); 151 0xffff);
152 152
153 /////// 153 ///////
154 // Reverse Diff 154 // Reverse Diff
155 GR_STATIC_CONST_SAME_STENCIL(gUserToClipRDiffPass0, 155 static constexpr GrStencilSettings gUserToClipRDiffPass0(
156 kInvert_StencilOp, 156 kInvert_StencilOp,
157 kZero_StencilOp, 157 kZero_StencilOp,
158 kLess_StencilFunc, 158 kLess_StencilFunc,
159 0xffff, // unset clip bit 159 0xffff, // unset clip bit
160 0x0000, // set clip bit 160 0x0000, // set clip bit
161 0xffff); 161 0xffff);
162 162
163 GR_STATIC_CONST_SAME_STENCIL(gUserToClipRDiffPass1, 163 static constexpr GrStencilSettings gUserToClipRDiffPass1(
164 kReplace_StencilOp, 164 kReplace_StencilOp,
165 kZero_StencilOp, 165 kZero_StencilOp,
166 kEqual_StencilFunc, 166 kEqual_StencilFunc,
167 0x0000, // set clip bit 167 0x0000, // set clip bit
168 0x0000, // set clip bit 168 0x0000, // set clip bit
169 0xffff); 169 0xffff);
170 170
171 // We are looking for stencil values that are all zero. The first pass sets the 171 // We are looking for stencil values that are all zero. The first pass sets the
172 // clip bit if the stencil is all zeros. The second pass clears the user bits. 172 // clip bit if the stencil is all zeros. The second pass clears the user bits.
173 GR_STATIC_CONST_SAME_STENCIL(gInvUserToClipRDiffPass0, 173 static constexpr GrStencilSettings gInvUserToClipRDiffPass0(
174 kInvert_StencilOp, 174 kInvert_StencilOp,
175 kZero_StencilOp, 175 kZero_StencilOp,
176 kEqual_StencilFunc, 176 kEqual_StencilFunc,
177 0xffff, 177 0xffff,
178 0x0000, 178 0x0000,
179 0x0000 // set clip bit 179 0x0000 // set clip bit
180 ); 180 );
181 181
182 GR_STATIC_CONST_SAME_STENCIL(gInvUserToClipRDiffPass1, 182 static constexpr GrStencilSettings gInvUserToClipRDiffPass1(
183 kZero_StencilOp, 183 kZero_StencilOp,
184 kZero_StencilOp, 184 kZero_StencilOp,
185 kAlways_StencilFunc, 185 kAlways_StencilFunc,
186 0xffff, 186 0xffff,
187 0x0000, 187 0x0000,
188 0xffff // unset clip bit 188 0xffff // unset clip bit
189 ); 189 );
190 190
191 /////// 191 ///////
192 // Direct to Stencil 192 // Direct to Stencil
193 193
194 // We can render a clip element directly without first writing to the client 194 // We can render a clip element directly without first writing to the client
195 // portion of the clip when the fill is not inverse and the set operation will 195 // portion of the clip when the fill is not inverse and the set operation will
196 // only modify the in/out status of samples covered by the clip element. 196 // only modify the in/out status of samples covered by the clip element.
197 197
198 // this one only works if used right after stencil clip was cleared. 198 // this one only works if used right after stencil clip was cleared.
199 // Our clip mask creation code doesn't allow midstream replace ops. 199 // Our clip mask creation code doesn't allow midstream replace ops.
200 GR_STATIC_CONST_SAME_STENCIL(gReplaceClip, 200 static constexpr GrStencilSettings gReplaceClip(
201 kReplace_StencilOp, 201 kReplace_StencilOp,
202 kReplace_StencilOp, 202 kReplace_StencilOp,
203 kAlways_StencilFunc, 203 kAlways_StencilFunc,
204 0xffff, 204 0xffff,
205 0x0000, // set clip bit 205 0x0000, // set clip bit
206 0x0000 // set clipBit 206 0x0000 // set clipBit
207 ); 207 );
208 208
209 GR_STATIC_CONST_SAME_STENCIL(gUnionClip, 209 static constexpr GrStencilSettings gUnionClip(
210 kReplace_StencilOp, 210 kReplace_StencilOp,
211 kReplace_StencilOp, 211 kReplace_StencilOp,
212 kAlways_StencilFunc, 212 kAlways_StencilFunc,
213 0xffff, 213 0xffff,
214 0x0000, // set clip bit 214 0x0000, // set clip bit
215 0x0000 // set clip bit 215 0x0000 // set clip bit
216 ); 216 );
217 217
218 GR_STATIC_CONST_SAME_STENCIL(gXorClip, 218 static constexpr GrStencilSettings gXorClip(
219 kInvert_StencilOp, 219 kInvert_StencilOp,
220 kInvert_StencilOp, 220 kInvert_StencilOp,
221 kAlways_StencilFunc, 221 kAlways_StencilFunc,
222 0xffff, 222 0xffff,
223 0x0000, 223 0x0000,
224 0x0000 // set clip bit 224 0x0000 // set clip bit
225 ); 225 );
226 226
227 GR_STATIC_CONST_SAME_STENCIL(gDiffClip, 227 static constexpr GrStencilSettings gDiffClip(
228 kZero_StencilOp, 228 kZero_StencilOp,
229 kZero_StencilOp, 229 kZero_StencilOp,
230 kAlways_StencilFunc, 230 kAlways_StencilFunc,
231 0xffff, 231 0xffff,
232 0x0000, 232 0x0000,
233 0x0000 // set clip bit 233 0x0000 // set clip bit
234 ); 234 );
235 235
236 bool GrStencilSettings::GetClipPasses( 236 bool GrStencilSettings::GetClipPasses(
237 SkRegion::Op op, 237 SkRegion::Op op,
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after
394 } 394 }
395 return false; 395 return false;
396 } 396 }
397 397
398 void GrStencilSettings::genKey(GrProcessorKeyBuilder* b) const { 398 void GrStencilSettings::genKey(GrProcessorKeyBuilder* b) const {
399 static const int kCount = sizeof(GrStencilSettings) / sizeof(uint32_t); 399 static const int kCount = sizeof(GrStencilSettings) / sizeof(uint32_t);
400 GR_STATIC_ASSERT(0 == sizeof(GrStencilSettings) % sizeof(uint32_t)); 400 GR_STATIC_ASSERT(0 == sizeof(GrStencilSettings) % sizeof(uint32_t));
401 uint32_t* key = b->add32n(kCount); 401 uint32_t* key = b->add32n(kCount);
402 memcpy(key, this, sizeof(GrStencilSettings)); 402 memcpy(key, this, sizeof(GrStencilSettings));
403 } 403 }
OLDNEW
« no previous file with comments | « src/gpu/GrStencil.h ('k') | src/gpu/batches/GrDefaultPathRenderer.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698