1 /*
2 * Copyright 2015 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
8 #include "Test.h"
9
10 #if SK_SUPPORT_GPU
11
12 #include "GrContextFactory.h"
13 #include "GrContextOptions.h"
14 #include "GrContextPriv.h"
15 #include "GrGpu.h"
16 #include "GrTest.h"
17 #include "GrXferProcessor.h"
18 #include "effects/GrPorterDuffXferProcessor.h"
19 #include "gl/GrGLCaps.h"
20 #include "ops/GrMeshDrawOp.h"
21
22 ////////////////////////////////////////////////////////////////////////////////
23
24 static void test_color_unknown_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps);
25 static void test_color_not_opaque_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps);
26 static void test_color_opaque_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps);
27 static void test_color_opaque_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps);
28 static void test_lcd_coverage(skiatest::Reporter* reporter, const GrCaps& caps);
29 static void test_lcd_coverage_fallback_case(skiatest::Reporter* reporter, const GrCaps& caps);
30
DEF_GPUTEST_FOR_NULLGL_CONTEXT(GrPorterDuff,reporter,ctxInfo)31 DEF_GPUTEST_FOR_NULLGL_CONTEXT(GrPorterDuff, reporter, ctxInfo) {
32 const GrCaps& caps = *ctxInfo.grContext()->getGpu()->caps();
33 if (!caps.shaderCaps()->dualSourceBlendingSupport()) {
34 SkFAIL("Null context does not support dual source blending.");
35 return;
36 }
37
38 test_color_unknown_with_coverage(reporter, caps);
39 test_color_not_opaque_no_coverage(reporter, caps);
40 test_color_opaque_with_coverage(reporter, caps);
41 test_color_opaque_no_coverage(reporter, caps);
42 test_lcd_coverage(reporter, caps);
43 test_lcd_coverage_fallback_case(reporter, caps);
44 }
45
46 ////////////////////////////////////////////////////////////////////////////////
47
48 #define TEST_ASSERT(...) REPORTER_ASSERT(reporter, __VA_ARGS__)
49
50 enum {
51 kNone_OutputType,
52 kCoverage_OutputType,
53 kModulate_OutputType,
54 kSAModulate_OutputType,
55 kISAModulate_OutputType,
56 kISCModulate_OutputType
57 };
58 static const int kInvalid_OutputType = -1;
59
do_analysis(const GrXPFactory * xpf,const GrProcessorAnalysisColor & colorInput,GrProcessorAnalysisCoverage coverageInput,const GrCaps & caps)60 static GrProcessorSet::Analysis do_analysis(const GrXPFactory* xpf,
61 const GrProcessorAnalysisColor& colorInput,
62 GrProcessorAnalysisCoverage coverageInput,
63 const GrCaps& caps) {
64 GrPaint paint;
65 paint.setXPFactory(xpf);
66 GrProcessorSet procs(std::move(paint));
67 GrColor overrideColor;
68 GrProcessorSet::Analysis analysis =
69 procs.finalize(colorInput, coverageInput, nullptr, false, caps, &overrideColor);
70 return analysis;
71 }
72
73 class GrPorterDuffTest {
74 public:
75 struct XPInfo {
XPInfoGrPorterDuffTest::XPInfo76 XPInfo(skiatest::Reporter* reporter, SkBlendMode xfermode, const GrCaps& caps,
77 GrProcessorAnalysisColor inputColor, GrProcessorAnalysisCoverage inputCoverage) {
78 const GrXPFactory* xpf = GrPorterDuffXPFactory::Get(xfermode);
79
80 bool isLCD = GrProcessorAnalysisCoverage::kLCD == inputCoverage;
81
82 GrProcessorSet::Analysis analysis = do_analysis(xpf, inputColor, inputCoverage, caps);
83 fCompatibleWithCoverageAsAlpha = analysis.isCompatibleWithCoverageAsAlpha();
84 fCanCombineOverlappedStencilAndCover = analysis.canCombineOverlappedStencilAndCover();
85 fIgnoresInputColor = analysis.inputColorIsIgnored();
86 sk_sp<const GrXferProcessor> xp(
87 GrXPFactory::MakeXferProcessor(xpf, inputColor, inputCoverage, false, caps));
88 TEST_ASSERT(!analysis.requiresDstTexture() ||
89 (isLCD &&
90 !caps.shaderCaps()->dstReadInShaderSupport() &&
91 (SkBlendMode::kSrcOver != xfermode ||
92 !inputColor.isOpaque())));
93 GetXPOutputTypes(xp.get(), &fPrimaryOutputType, &fSecondaryOutputType);
94 xp->getBlendInfo(&fBlendInfo);
95 TEST_ASSERT(!xp->willReadDstColor() ||
96 (isLCD && (SkBlendMode::kSrcOver != xfermode ||
97 !inputColor.isOpaque())));
98 TEST_ASSERT(xp->hasSecondaryOutput() == GrBlendCoeffRefsSrc2(fBlendInfo.fDstBlend));
99 }
100
101 bool fCanCombineOverlappedStencilAndCover;
102 bool fCompatibleWithCoverageAsAlpha;
103 bool fIgnoresInputColor;
104 int fPrimaryOutputType;
105 int fSecondaryOutputType;
106 GrXferProcessor::BlendInfo fBlendInfo;
107 };
108
GetXPOutputTypes(const GrXferProcessor * xp,int * outPrimary,int * outSecondary)109 static void GetXPOutputTypes(const GrXferProcessor* xp, int* outPrimary, int* outSecondary) {
110 GrPorterDuffXPFactory::TestGetXPOutputTypes(xp, outPrimary, outSecondary);
111 }
112 };
113
test_lcd_coverage(skiatest::Reporter * reporter,const GrCaps & caps)114 static void test_lcd_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
115 GrProcessorAnalysisColor inputColor = GrProcessorAnalysisColor::Opaque::kYes;
116 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kLCD;
117
118 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
119 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
120 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
121 switch (xfermode) {
122 case SkBlendMode::kClear:
123 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
124 TEST_ASSERT(xpi.fIgnoresInputColor);
125 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
126 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
127 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
128 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
129 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
130 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
131 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
132 break;
133 case SkBlendMode::kSrc:
134 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
135 TEST_ASSERT(!xpi.fIgnoresInputColor);
136 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
137 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
138 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
139 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
140 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
141 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
142 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
143 break;
144 case SkBlendMode::kDst:
145 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
146 TEST_ASSERT(xpi.fIgnoresInputColor);
147 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
148 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
149 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
150 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
151 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
152 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
153 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
154 break;
155 case SkBlendMode::kSrcOver:
156 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
157 TEST_ASSERT(!xpi.fIgnoresInputColor);
158 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
159 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
160 TEST_ASSERT(kSAModulate_OutputType == xpi.fSecondaryOutputType);
161 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
162 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
163 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
164 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
165 break;
166 case SkBlendMode::kDstOver:
167 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
168 TEST_ASSERT(!xpi.fIgnoresInputColor);
169 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
170 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
171 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
172 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
173 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
174 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
175 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
176 break;
177 case SkBlendMode::kSrcIn:
178 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
179 TEST_ASSERT(!xpi.fIgnoresInputColor);
180 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
181 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
182 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
183 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
184 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
185 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
186 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
187 break;
188 case SkBlendMode::kDstIn:
189 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
190 TEST_ASSERT(!xpi.fIgnoresInputColor);
191 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
192 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
193 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
194 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
195 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
196 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
197 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
198 break;
199 case SkBlendMode::kSrcOut:
200 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
201 TEST_ASSERT(!xpi.fIgnoresInputColor);
202 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
203 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
204 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
205 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
206 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
207 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
208 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
209 break;
210 case SkBlendMode::kDstOut:
211 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
212 TEST_ASSERT(!xpi.fIgnoresInputColor);
213 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
214 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
215 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
216 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
217 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
218 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
219 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
220 break;
221 case SkBlendMode::kSrcATop:
222 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
223 TEST_ASSERT(!xpi.fIgnoresInputColor);
224 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
225 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
226 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
227 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
228 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
229 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
230 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
231 break;
232 case SkBlendMode::kDstATop:
233 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
234 TEST_ASSERT(!xpi.fIgnoresInputColor);
235 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
236 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
237 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
238 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
239 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
240 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
241 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
242 break;
243 case SkBlendMode::kXor:
244 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
245 TEST_ASSERT(!xpi.fIgnoresInputColor);
246 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
247 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
248 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
249 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
250 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
251 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
252 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
253 break;
254 case SkBlendMode::kPlus:
255 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
256 TEST_ASSERT(!xpi.fIgnoresInputColor);
257 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
258 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
259 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
260 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
261 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
262 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
263 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
264 break;
265 case SkBlendMode::kModulate:
266 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
267 TEST_ASSERT(!xpi.fIgnoresInputColor);
268 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
269 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
270 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
271 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
272 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
273 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
274 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
275 break;
276 case SkBlendMode::kScreen:
277 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
278 TEST_ASSERT(!xpi.fIgnoresInputColor);
279 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
280 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
281 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
282 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
283 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
284 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
285 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
286 break;
287 default:
288 ERRORF(reporter, "Invalid xfermode.");
289 break;
290 }
291 }
292 }
test_color_unknown_with_coverage(skiatest::Reporter * reporter,const GrCaps & caps)293 static void test_color_unknown_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
294 GrProcessorAnalysisColor inputColor = GrProcessorAnalysisColor::Opaque::kNo;
295 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kSingleChannel;
296
297 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
298 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
299 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
300 switch (xfermode) {
301 case SkBlendMode::kClear:
302 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
303 TEST_ASSERT(xpi.fIgnoresInputColor);
304 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
305 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
306 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
307 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
308 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
309 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
310 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
311 break;
312 case SkBlendMode::kSrc:
313 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
314 TEST_ASSERT(!xpi.fIgnoresInputColor);
315 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
316 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
317 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
318 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
319 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
320 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
321 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
322 break;
323 case SkBlendMode::kDst:
324 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
325 TEST_ASSERT(xpi.fIgnoresInputColor);
326 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
327 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
328 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
329 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
330 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
331 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
332 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
333 break;
334 case SkBlendMode::kSrcOver:
335 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
336 TEST_ASSERT(!xpi.fIgnoresInputColor);
337 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
338 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
339 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
340 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
341 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
342 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
343 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
344 break;
345 case SkBlendMode::kDstOver:
346 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
347 TEST_ASSERT(!xpi.fIgnoresInputColor);
348 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
349 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
350 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
351 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
352 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
353 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
354 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
355 break;
356 case SkBlendMode::kSrcIn:
357 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
358 TEST_ASSERT(!xpi.fIgnoresInputColor);
359 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
360 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
361 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
362 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
363 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
364 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
365 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
366 break;
367 case SkBlendMode::kDstIn:
368 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
369 TEST_ASSERT(!xpi.fIgnoresInputColor);
370 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
371 TEST_ASSERT(kISAModulate_OutputType == xpi.fPrimaryOutputType);
372 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
373 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
374 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
375 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
376 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
377 break;
378 case SkBlendMode::kSrcOut:
379 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
380 TEST_ASSERT(!xpi.fIgnoresInputColor);
381 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
382 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
383 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
384 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
385 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
386 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
387 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
388 break;
389 case SkBlendMode::kDstOut:
390 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
391 TEST_ASSERT(!xpi.fIgnoresInputColor);
392 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
393 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
394 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
395 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
396 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
397 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
398 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
399 break;
400 case SkBlendMode::kSrcATop:
401 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
402 TEST_ASSERT(!xpi.fIgnoresInputColor);
403 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
404 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
405 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
406 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
407 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
408 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
409 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
410 break;
411 case SkBlendMode::kDstATop:
412 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
413 TEST_ASSERT(!xpi.fIgnoresInputColor);
414 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
415 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
416 TEST_ASSERT(kISAModulate_OutputType == xpi.fSecondaryOutputType);
417 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
418 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
419 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
420 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
421 break;
422 case SkBlendMode::kXor:
423 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
424 TEST_ASSERT(!xpi.fIgnoresInputColor);
425 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
426 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
427 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
428 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
429 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
430 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
431 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
432 break;
433 case SkBlendMode::kPlus:
434 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
435 TEST_ASSERT(!xpi.fIgnoresInputColor);
436 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
437 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
438 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
439 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
440 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
441 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
442 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
443 break;
444 case SkBlendMode::kModulate:
445 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
446 TEST_ASSERT(!xpi.fIgnoresInputColor);
447 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
448 TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType);
449 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
450 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
451 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
452 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
453 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
454 break;
455 case SkBlendMode::kScreen:
456 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
457 TEST_ASSERT(!xpi.fIgnoresInputColor);
458 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
459 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
460 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
461 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
462 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
463 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
464 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
465 break;
466 default:
467 ERRORF(reporter, "Invalid xfermode.");
468 break;
469 }
470 }
471 }
472
test_color_not_opaque_no_coverage(skiatest::Reporter * reporter,const GrCaps & caps)473 static void test_color_not_opaque_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
474 GrProcessorAnalysisColor inputColor(GrColorPackRGBA(229, 0, 154, 240));
475 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kNone;
476
477 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
478 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
479 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
480 switch (xfermode) {
481 case SkBlendMode::kClear:
482 TEST_ASSERT(xpi.fCanCombineOverlappedStencilAndCover);
483 TEST_ASSERT(xpi.fIgnoresInputColor);
484 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
485 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
486 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
487 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
488 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
489 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
490 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
491 break;
492 case SkBlendMode::kSrc:
493 TEST_ASSERT(xpi.fCanCombineOverlappedStencilAndCover);
494 TEST_ASSERT(!xpi.fIgnoresInputColor);
495 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
496 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
497 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
498 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
499 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
500 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
501 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
502 break;
503 case SkBlendMode::kDst:
504 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
505 TEST_ASSERT(xpi.fIgnoresInputColor);
506 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
507 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
508 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
509 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
510 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
511 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
512 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
513 break;
514 case SkBlendMode::kSrcOver:
515 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
516 TEST_ASSERT(!xpi.fIgnoresInputColor);
517 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
518 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
519 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
520 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
521 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
522 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
523 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
524 break;
525 case SkBlendMode::kDstOver:
526 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
527 TEST_ASSERT(!xpi.fIgnoresInputColor);
528 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
529 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
530 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
531 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
532 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
533 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
534 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
535 break;
536 case SkBlendMode::kSrcIn:
537 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
538 TEST_ASSERT(!xpi.fIgnoresInputColor);
539 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
540 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
541 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
542 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
543 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
544 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
545 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
546 break;
547 case SkBlendMode::kDstIn:
548 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
549 TEST_ASSERT(!xpi.fIgnoresInputColor);
550 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
551 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
552 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
553 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
554 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
555 TEST_ASSERT(kSA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
556 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
557 break;
558 case SkBlendMode::kSrcOut:
559 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
560 TEST_ASSERT(!xpi.fIgnoresInputColor);
561 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
562 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
563 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
564 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
565 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
566 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
567 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
568 break;
569 case SkBlendMode::kDstOut:
570 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
571 TEST_ASSERT(!xpi.fIgnoresInputColor);
572 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
573 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
574 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
575 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
576 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
577 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
578 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
579 break;
580 case SkBlendMode::kSrcATop:
581 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
582 TEST_ASSERT(!xpi.fIgnoresInputColor);
583 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
584 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
585 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
586 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
587 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
588 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
589 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
590 break;
591 case SkBlendMode::kDstATop:
592 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
593 TEST_ASSERT(!xpi.fIgnoresInputColor);
594 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
595 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
596 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
597 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
598 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
599 TEST_ASSERT(kSA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
600 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
601 break;
602 case SkBlendMode::kXor:
603 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
604 TEST_ASSERT(!xpi.fIgnoresInputColor);
605 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
606 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
607 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
608 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
609 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
610 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
611 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
612 break;
613 case SkBlendMode::kPlus:
614 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
615 TEST_ASSERT(!xpi.fIgnoresInputColor);
616 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
617 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
618 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
619 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
620 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
621 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
622 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
623 break;
624 case SkBlendMode::kModulate:
625 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
626 TEST_ASSERT(!xpi.fIgnoresInputColor);
627 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
628 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
629 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
630 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
631 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
632 TEST_ASSERT(kSC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
633 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
634 break;
635 case SkBlendMode::kScreen:
636 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
637 TEST_ASSERT(!xpi.fIgnoresInputColor);
638 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
639 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
640 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
641 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
642 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
643 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
644 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
645 break;
646 default:
647 ERRORF(reporter, "Invalid xfermode.");
648 break;
649 }
650 }
651 }
652
test_color_opaque_with_coverage(skiatest::Reporter * reporter,const GrCaps & caps)653 static void test_color_opaque_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
654 GrProcessorAnalysisColor inputColor = GrProcessorAnalysisColor::Opaque::kYes;
655 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kSingleChannel;
656
657 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
658 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
659 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
660 switch (xfermode) {
661 case SkBlendMode::kClear:
662 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
663 TEST_ASSERT(xpi.fIgnoresInputColor);
664 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
665 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
666 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
667 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
668 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
669 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
670 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
671 break;
672 case SkBlendMode::kSrc:
673 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
674 TEST_ASSERT(!xpi.fIgnoresInputColor);
675 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
676 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
677 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
678 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
679 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
680 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
681 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
682 break;
683 case SkBlendMode::kDst:
684 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
685 TEST_ASSERT(xpi.fIgnoresInputColor);
686 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
687 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
688 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
689 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
690 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
691 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
692 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
693 break;
694 case SkBlendMode::kSrcOver:
695 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
696 TEST_ASSERT(!xpi.fIgnoresInputColor);
697 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
698 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
699 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
700 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
701 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
702 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
703 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
704 break;
705 case SkBlendMode::kDstOver:
706 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
707 TEST_ASSERT(!xpi.fIgnoresInputColor);
708 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
709 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
710 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
711 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
712 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
713 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
714 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
715 break;
716 case SkBlendMode::kSrcIn:
717 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
718 TEST_ASSERT(!xpi.fIgnoresInputColor);
719 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
720 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
721 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
722 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
723 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
724 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
725 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
726 break;
727 case SkBlendMode::kDstIn:
728 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
729 TEST_ASSERT(xpi.fIgnoresInputColor);
730 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
731 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
732 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
733 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
734 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
735 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
736 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
737 break;
738 case SkBlendMode::kSrcOut:
739 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
740 TEST_ASSERT(!xpi.fIgnoresInputColor);
741 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
742 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
743 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
744 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
745 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
746 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
747 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
748 break;
749 case SkBlendMode::kDstOut:
750 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
751 TEST_ASSERT(xpi.fIgnoresInputColor);
752 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
753 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
754 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
755 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
756 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
757 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
758 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
759 break;
760 case SkBlendMode::kSrcATop:
761 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
762 TEST_ASSERT(!xpi.fIgnoresInputColor);
763 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
764 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
765 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
766 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
767 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
768 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
769 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
770 break;
771 case SkBlendMode::kDstATop:
772 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
773 TEST_ASSERT(!xpi.fIgnoresInputColor);
774 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
775 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
776 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
777 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
778 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
779 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
780 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
781 break;
782 case SkBlendMode::kXor:
783 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
784 TEST_ASSERT(!xpi.fIgnoresInputColor);
785 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
786 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
787 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
788 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
789 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
790 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
791 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
792 break;
793 case SkBlendMode::kPlus:
794 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
795 TEST_ASSERT(!xpi.fIgnoresInputColor);
796 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
797 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
798 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
799 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
800 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
801 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
802 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
803 break;
804 case SkBlendMode::kModulate:
805 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
806 TEST_ASSERT(!xpi.fIgnoresInputColor);
807 TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType);
808 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
809 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
810 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
811 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
812 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
813 break;
814 case SkBlendMode::kScreen:
815 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
816 TEST_ASSERT(!xpi.fIgnoresInputColor);
817 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
818 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
819 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
820 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
821 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
822 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
823 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
824 break;
825 default:
826 ERRORF(reporter, "Invalid xfermode.");
827 break;
828 }
829 }
830 }
831
test_color_opaque_no_coverage(skiatest::Reporter * reporter,const GrCaps & caps)832 static void test_color_opaque_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
833 GrProcessorAnalysisColor inputColor = GrProcessorAnalysisColor::Opaque::kYes;
834 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kNone;
835
836 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
837 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
838 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
839
840 switch (xfermode) {
841 case SkBlendMode::kClear:
842 TEST_ASSERT(xpi.fCanCombineOverlappedStencilAndCover);
843 TEST_ASSERT(xpi.fIgnoresInputColor);
844 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
845 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
846 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
847 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
848 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
849 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
850 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
851 break;
852 case SkBlendMode::kSrc:
853 TEST_ASSERT(xpi.fCanCombineOverlappedStencilAndCover);
854 TEST_ASSERT(!xpi.fIgnoresInputColor);
855 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
856 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
857 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
858 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
859 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
860 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
861 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
862 break;
863 case SkBlendMode::kDst:
864 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
865 TEST_ASSERT(xpi.fIgnoresInputColor);
866 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
867 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
868 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
869 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
870 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
871 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
872 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
873 break;
874 case SkBlendMode::kSrcOver:
875 // We don't specialize opaque src-over. See note in GrPorterDuffXferProcessor.cpp
876 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
877 TEST_ASSERT(!xpi.fIgnoresInputColor);
878 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
879 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
880 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
881 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
882 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
883 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
884 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
885 break;
886 case SkBlendMode::kDstOver:
887 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
888 TEST_ASSERT(!xpi.fIgnoresInputColor);
889 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
890 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
891 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
892 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
893 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
894 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
895 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
896 break;
897 case SkBlendMode::kSrcIn:
898 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
899 TEST_ASSERT(!xpi.fIgnoresInputColor);
900 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
901 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
902 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
903 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
904 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
905 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
906 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
907 break;
908 case SkBlendMode::kDstIn:
909 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
910 TEST_ASSERT(xpi.fIgnoresInputColor);
911 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
912 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
913 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
914 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
915 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
916 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
917 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
918 break;
919 case SkBlendMode::kSrcOut:
920 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
921 TEST_ASSERT(!xpi.fIgnoresInputColor);
922 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
923 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
924 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
925 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
926 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
927 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
928 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
929 break;
930 case SkBlendMode::kDstOut:
931 TEST_ASSERT(xpi.fCanCombineOverlappedStencilAndCover);
932 TEST_ASSERT(xpi.fIgnoresInputColor);
933 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
934 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
935 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
936 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
937 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
938 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
939 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
940 break;
941 case SkBlendMode::kSrcATop:
942 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
943 TEST_ASSERT(!xpi.fIgnoresInputColor);
944 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
945 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
946 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
947 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
948 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
949 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
950 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
951 break;
952 case SkBlendMode::kDstATop:
953 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
954 TEST_ASSERT(!xpi.fIgnoresInputColor);
955 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
956 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
957 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
958 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
959 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
960 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
961 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
962 break;
963 case SkBlendMode::kXor:
964 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
965 TEST_ASSERT(!xpi.fIgnoresInputColor);
966 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
967 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
968 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
969 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
970 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
971 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
972 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
973 break;
974 case SkBlendMode::kPlus:
975 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
976 TEST_ASSERT(!xpi.fIgnoresInputColor);
977 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
978 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
979 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
980 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
981 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
982 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
983 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
984 break;
985 case SkBlendMode::kModulate:
986 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
987 TEST_ASSERT(!xpi.fIgnoresInputColor);
988 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
989 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
990 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
991 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
992 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
993 TEST_ASSERT(kSC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
994 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
995 break;
996 case SkBlendMode::kScreen:
997 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
998 TEST_ASSERT(!xpi.fIgnoresInputColor);
999 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
1000 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
1001 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
1002 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
1003 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
1004 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
1005 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
1006 break;
1007 default:
1008 ERRORF(reporter, "Invalid xfermode.");
1009 break;
1010 }
1011 }
1012 }
1013
test_lcd_coverage_fallback_case(skiatest::Reporter * reporter,const GrCaps & caps)1014 static void test_lcd_coverage_fallback_case(skiatest::Reporter* reporter, const GrCaps& caps) {
1015 const GrXPFactory* xpf = GrPorterDuffXPFactory::Get(SkBlendMode::kSrcOver);
1016 GrProcessorAnalysisColor color = GrColorPackRGBA(123, 45, 67, 255);
1017 GrProcessorAnalysisCoverage coverage = GrProcessorAnalysisCoverage::kLCD;
1018 TEST_ASSERT(!(GrXPFactory::GetAnalysisProperties(xpf, color, coverage, caps) &
1019 GrXPFactory::AnalysisProperties::kRequiresDstTexture));
1020 sk_sp<const GrXferProcessor> xp_opaque(
1021 GrXPFactory::MakeXferProcessor(xpf, color, coverage, false, caps));
1022 if (!xp_opaque) {
1023 ERRORF(reporter, "Failed to create an XP with LCD coverage.");
1024 return;
1025 }
1026
1027 GrXferProcessor::BlendInfo blendInfo;
1028 xp_opaque->getBlendInfo(&blendInfo);
1029 TEST_ASSERT(blendInfo.fWriteColor);
1030
1031 // Test with non-opaque alpha
1032 color = GrColorPackRGBA(123, 45, 67, 221);
1033 coverage = GrProcessorAnalysisCoverage::kLCD;
1034 TEST_ASSERT(!(GrXPFactory::GetAnalysisProperties(xpf, color, coverage, caps) &
1035 GrXPFactory::AnalysisProperties::kRequiresDstTexture));
1036 sk_sp<const GrXferProcessor> xp(
1037 GrXPFactory::MakeXferProcessor(xpf, color, coverage, false, caps));
1038 if (!xp) {
1039 ERRORF(reporter, "Failed to create an XP with LCD coverage.");
1040 return;
1041 }
1042
1043 xp->getBlendInfo(&blendInfo);
1044 TEST_ASSERT(blendInfo.fWriteColor);
1045 }
1046
1047 DEF_GPUTEST(PorterDuffNoDualSourceBlending, reporter, /*factory*/) {
1048 GrContextOptions opts;
1049 opts.fSuppressDualSourceBlending = true;
1050 sk_gpu_test::GrContextFactory mockFactory(opts);
1051 GrContext* ctx = mockFactory.get(sk_gpu_test::GrContextFactory::kNullGL_ContextType);
1052 if (!ctx) {
1053 SkFAIL("Failed to create null context without ARB_blend_func_extended.");
1054 return;
1055 }
1056
1057 const GrCaps& caps = *ctx->caps();
1058 if (caps.shaderCaps()->dualSourceBlendingSupport()) {
1059 SkFAIL("Null context failed to honor request for no ARB_blend_func_extended.");
1060 return;
1061 }
1062
1063 GrBackendObject backendTexHandle =
1064 ctx->getGpu()->createTestingOnlyBackendTexture(nullptr, 100, 100, kRGBA_8888_GrPixelConfig);
1065 GrBackendTexture backendTex = GrTest::CreateBackendTexture(ctx->contextPriv().getBackend(),
1066 100,
1067 100,
1068 kRGBA_8888_GrPixelConfig,
1069 backendTexHandle);
1070
1071 GrXferProcessor::DstProxy fakeDstProxy;
1072 {
1073 sk_sp<GrTextureProxy> proxy = GrSurfaceProxy::MakeWrappedBackend(ctx, backendTex,
1074 kTopLeft_GrSurfaceOrigin);
1075 fakeDstProxy.setProxy(std::move(proxy));
1076 }
1077
1078 static const GrProcessorAnalysisColor colorInputs[] = {
1079 GrProcessorAnalysisColor::Opaque::kNo, GrProcessorAnalysisColor::Opaque::kYes,
1080 GrProcessorAnalysisColor(GrColorPackRGBA(0, 82, 17, 100)),
1081 GrProcessorAnalysisColor(GrColorPackRGBA(0, 82, 17, 255))};
1082
1083 for (const auto& colorInput : colorInputs) {
1084 for (GrProcessorAnalysisCoverage coverageType :
1085 {GrProcessorAnalysisCoverage::kSingleChannel, GrProcessorAnalysisCoverage::kNone}) {
1086 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
1087 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
1088 const GrXPFactory* xpf = GrPorterDuffXPFactory::Get(xfermode);
1089 sk_sp<const GrXferProcessor> xp(
1090 GrXPFactory::MakeXferProcessor(xpf, colorInput, coverageType, false, caps));
1091 if (!xp) {
1092 ERRORF(reporter, "Failed to create an XP without dual source blending.");
1093 return;
1094 }
1095 TEST_ASSERT(!xp->hasSecondaryOutput());
1096 }
1097 }
1098 }
1099 ctx->getGpu()->deleteTestingOnlyBackendTexture(backendTexHandle);
1100 }
1101
1102 #endif
1103