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