• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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