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