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