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