blob: d386090aed4c733930223405aeb3aa4aabdc9a8d [file] [log] [blame]
cdalton6fd158e2015-05-27 15:08:33 -07001/*
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
cdalton6fd158e2015-05-27 15:08:33 -07008#include "Test.h"
9
Herb Derbyd3895d82018-09-04 13:27:00 -040010#include "GrBackendSurface.h"
cdalton6fd158e2015-05-27 15:08:33 -070011#include "GrContextFactory.h"
12#include "GrContextOptions.h"
Greg Daniel7ef28f32017-04-20 16:41:55 +000013#include "GrContextPriv.h"
cdalton6fd158e2015-05-27 15:08:33 -070014#include "GrGpu.h"
Robert Phillips0bd24dc2018-01-16 08:06:32 -050015#include "GrProxyProvider.h"
cdalton6fd158e2015-05-27 15:08:33 -070016#include "GrXferProcessor.h"
17#include "effects/GrPorterDuffXferProcessor.h"
18#include "gl/GrGLCaps.h"
Brian Salomon89527432016-12-16 09:52:16 -050019#include "ops/GrMeshDrawOp.h"
cdalton6fd158e2015-05-27 15:08:33 -070020
21////////////////////////////////////////////////////////////////////////////////
22
23static void test_color_unknown_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps);
Brian Salomon31853842017-03-28 16:32:05 -040024static void test_color_not_opaque_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps);
cdalton6fd158e2015-05-27 15:08:33 -070025static void test_color_opaque_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps);
26static void test_color_opaque_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps);
27static void test_lcd_coverage(skiatest::Reporter* reporter, const GrCaps& caps);
egdaniel723b0502015-09-15 09:31:40 -070028static void test_lcd_coverage_fallback_case(skiatest::Reporter* reporter, const GrCaps& caps);
cdalton6fd158e2015-05-27 15:08:33 -070029
Brian Osmand2ca3122019-03-26 11:31:16 -040030DEF_GPUTEST(GrPorterDuff, reporter, /*ctxInfo*/) {
31 GrMockOptions mockOptions;
32 mockOptions.fDualSourceBlendingSupport = true;
33 auto context = GrContext::MakeMock(&mockOptions, GrContextOptions());
34 const GrCaps& caps = *context->priv().getGpu()->caps();
35
cdalton6fd158e2015-05-27 15:08:33 -070036 if (!caps.shaderCaps()->dualSourceBlendingSupport()) {
Ben Wagnerb4aab9a2017-08-16 10:53:04 -040037 SK_ABORT("Null context does not support dual source blending.");
cdalton6fd158e2015-05-27 15:08:33 -070038 return;
39 }
40
41 test_color_unknown_with_coverage(reporter, caps);
Brian Salomon31853842017-03-28 16:32:05 -040042 test_color_not_opaque_no_coverage(reporter, caps);
cdalton6fd158e2015-05-27 15:08:33 -070043 test_color_opaque_with_coverage(reporter, caps);
44 test_color_opaque_no_coverage(reporter, caps);
45 test_lcd_coverage(reporter, caps);
egdaniel723b0502015-09-15 09:31:40 -070046 test_lcd_coverage_fallback_case(reporter, caps);
cdalton6fd158e2015-05-27 15:08:33 -070047}
48
49////////////////////////////////////////////////////////////////////////////////
50
51#define TEST_ASSERT(...) REPORTER_ASSERT(reporter, __VA_ARGS__)
52
53enum {
54 kNone_OutputType,
55 kCoverage_OutputType,
56 kModulate_OutputType,
egdaniel723b0502015-09-15 09:31:40 -070057 kSAModulate_OutputType,
cdalton6fd158e2015-05-27 15:08:33 -070058 kISAModulate_OutputType,
59 kISCModulate_OutputType
60};
Greg Daniel79cdf282017-05-22 15:56:22 -040061static const int kInvalid_OutputType = -1;
cdalton6fd158e2015-05-27 15:08:33 -070062
Brian Salomon48d1b4c2017-04-08 07:38:53 -040063static GrProcessorSet::Analysis do_analysis(const GrXPFactory* xpf,
64 const GrProcessorAnalysisColor& colorInput,
65 GrProcessorAnalysisCoverage coverageInput,
66 const GrCaps& caps) {
67 GrPaint paint;
68 paint.setXPFactory(xpf);
69 GrProcessorSet procs(std::move(paint));
Brian Osmancf860852018-10-31 14:04:39 -040070 SkPMColor4f overrideColor;
Chris Daltonb8fff0d2019-03-05 10:11:58 -070071 GrProcessorSet::Analysis analysis = procs.finalize(
72 colorInput, coverageInput, nullptr, &GrUserStencilSettings::kUnused, GrFSAAType::kNone,
Brian Osman5ced0bf2019-03-15 10:15:29 -040073 caps, GrClampType::kAuto, &overrideColor);
Brian Salomon48d1b4c2017-04-08 07:38:53 -040074 return analysis;
75}
76
cdalton6fd158e2015-05-27 15:08:33 -070077class GrPorterDuffTest {
78public:
79 struct XPInfo {
Mike Reed7d954ad2016-10-28 15:42:34 -040080 XPInfo(skiatest::Reporter* reporter, SkBlendMode xfermode, const GrCaps& caps,
Brian Salomona811b122017-03-30 08:21:32 -040081 GrProcessorAnalysisColor inputColor, GrProcessorAnalysisCoverage inputCoverage) {
Brian Salomona1633922017-01-09 11:46:10 -050082 const GrXPFactory* xpf = GrPorterDuffXPFactory::Get(xfermode);
Brian Salomon48d1b4c2017-04-08 07:38:53 -040083
Greg Daniel79cdf282017-05-22 15:56:22 -040084 bool isLCD = GrProcessorAnalysisCoverage::kLCD == inputCoverage;
85
Brian Salomon48d1b4c2017-04-08 07:38:53 -040086 GrProcessorSet::Analysis analysis = do_analysis(xpf, inputColor, inputCoverage, caps);
Brian Salomon31853842017-03-28 16:32:05 -040087 fCompatibleWithCoverageAsAlpha = analysis.isCompatibleWithCoverageAsAlpha();
Brian Salomon48d1b4c2017-04-08 07:38:53 -040088 fIgnoresInputColor = analysis.inputColorIsIgnored();
Brian Salomond61c9d92017-04-10 10:54:25 -040089 sk_sp<const GrXferProcessor> xp(
Brian Osman5ced0bf2019-03-15 10:15:29 -040090 GrXPFactory::MakeXferProcessor(xpf, inputColor, inputCoverage, false, caps,
91 GrClampType::kAuto));
Greg Daniel79cdf282017-05-22 15:56:22 -040092 TEST_ASSERT(!analysis.requiresDstTexture() ||
93 (isLCD &&
94 !caps.shaderCaps()->dstReadInShaderSupport() &&
95 (SkBlendMode::kSrcOver != xfermode ||
96 !inputColor.isOpaque())));
Chris Dalton945ee652019-01-23 09:10:36 -070097 // Porter Duff modes currently only use fixed-function or shader blending, and Ganesh
98 // doesn't yet make use of framebuffer fetches that require a barrier
99 // (e.g., QCOM_shader_framebuffer_fetch_noncoherent). So dst textures and xfer barriers
100 // should always go hand in hand for Porter Duff modes.
101 TEST_ASSERT(analysis.requiresDstTexture() == analysis.requiresNonOverlappingDraws());
Hal Canary342b7ac2016-11-04 11:49:42 -0400102 GetXPOutputTypes(xp.get(), &fPrimaryOutputType, &fSecondaryOutputType);
cdalton6fd158e2015-05-27 15:08:33 -0700103 xp->getBlendInfo(&fBlendInfo);
Greg Daniel79cdf282017-05-22 15:56:22 -0400104 TEST_ASSERT(!xp->willReadDstColor() ||
105 (isLCD && (SkBlendMode::kSrcOver != xfermode ||
106 !inputColor.isOpaque())));
cdalton6fd158e2015-05-27 15:08:33 -0700107 TEST_ASSERT(xp->hasSecondaryOutput() == GrBlendCoeffRefsSrc2(fBlendInfo.fDstBlend));
108 }
109
Brian Salomon31853842017-03-28 16:32:05 -0400110 bool fCompatibleWithCoverageAsAlpha;
111 bool fIgnoresInputColor;
cdalton6fd158e2015-05-27 15:08:33 -0700112 int fPrimaryOutputType;
113 int fSecondaryOutputType;
114 GrXferProcessor::BlendInfo fBlendInfo;
115 };
116
117 static void GetXPOutputTypes(const GrXferProcessor* xp, int* outPrimary, int* outSecondary) {
egdanielf2342722015-11-20 15:12:59 -0800118 GrPorterDuffXPFactory::TestGetXPOutputTypes(xp, outPrimary, outSecondary);
cdalton6fd158e2015-05-27 15:08:33 -0700119 }
120};
121
egdaniel723b0502015-09-15 09:31:40 -0700122static void test_lcd_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Greg Daniel6ebe4b92017-05-19 10:56:46 -0400123 GrProcessorAnalysisColor inputColor = GrProcessorAnalysisColor::Opaque::kYes;
Brian Salomona811b122017-03-30 08:21:32 -0400124 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kLCD;
egdaniel723b0502015-09-15 09:31:40 -0700125
Mike Reed7d954ad2016-10-28 15:42:34 -0400126 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
127 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon31853842017-03-28 16:32:05 -0400128 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
egdaniel723b0502015-09-15 09:31:40 -0700129 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400130 case SkBlendMode::kClear:
Brian Salomon31853842017-03-28 16:32:05 -0400131 TEST_ASSERT(xpi.fIgnoresInputColor);
132 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400133 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
134 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
135 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
136 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
137 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700138 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
139 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400140 case SkBlendMode::kSrc:
Brian Salomon31853842017-03-28 16:32:05 -0400141 TEST_ASSERT(!xpi.fIgnoresInputColor);
142 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400143 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
144 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700145 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
146 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
Greg Daniel79cdf282017-05-22 15:56:22 -0400147 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700148 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
149 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400150 case SkBlendMode::kDst:
Brian Salomon31853842017-03-28 16:32:05 -0400151 TEST_ASSERT(xpi.fIgnoresInputColor);
152 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400153 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
154 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700155 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400156 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
157 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
158 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
egdaniel723b0502015-09-15 09:31:40 -0700159 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400160 case SkBlendMode::kSrcOver:
Brian Salomon31853842017-03-28 16:32:05 -0400161 TEST_ASSERT(!xpi.fIgnoresInputColor);
162 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
egdaniel723b0502015-09-15 09:31:40 -0700163 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
164 TEST_ASSERT(kSAModulate_OutputType == xpi.fSecondaryOutputType);
165 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
166 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
167 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
168 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
169 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400170 case SkBlendMode::kDstOver:
Brian Salomon31853842017-03-28 16:32:05 -0400171 TEST_ASSERT(!xpi.fIgnoresInputColor);
172 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400173 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
174 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700175 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400176 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
177 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700178 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
179 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400180 case SkBlendMode::kSrcIn:
Brian Salomon31853842017-03-28 16:32:05 -0400181 TEST_ASSERT(!xpi.fIgnoresInputColor);
182 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400183 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
184 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700185 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400186 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
187 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700188 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
189 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400190 case SkBlendMode::kDstIn:
Brian Salomon31853842017-03-28 16:32:05 -0400191 TEST_ASSERT(!xpi.fIgnoresInputColor);
192 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400193 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
194 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
195 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
196 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
197 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700198 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
199 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400200 case SkBlendMode::kSrcOut:
Brian Salomon31853842017-03-28 16:32:05 -0400201 TEST_ASSERT(!xpi.fIgnoresInputColor);
202 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400203 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
204 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700205 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400206 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
207 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700208 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
209 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400210 case SkBlendMode::kDstOut:
Brian Salomon31853842017-03-28 16:32:05 -0400211 TEST_ASSERT(!xpi.fIgnoresInputColor);
212 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400213 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
214 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700215 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400216 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
217 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700218 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
219 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400220 case SkBlendMode::kSrcATop:
Brian Salomon31853842017-03-28 16:32:05 -0400221 TEST_ASSERT(!xpi.fIgnoresInputColor);
222 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400223 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
224 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700225 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400226 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
227 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700228 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
229 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400230 case SkBlendMode::kDstATop:
Brian Salomon31853842017-03-28 16:32:05 -0400231 TEST_ASSERT(!xpi.fIgnoresInputColor);
232 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400233 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
234 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700235 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400236 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
237 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700238 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
239 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400240 case SkBlendMode::kXor:
Brian Salomon31853842017-03-28 16:32:05 -0400241 TEST_ASSERT(!xpi.fIgnoresInputColor);
242 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400243 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
244 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700245 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400246 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
247 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700248 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
249 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400250 case SkBlendMode::kPlus:
Brian Salomon31853842017-03-28 16:32:05 -0400251 TEST_ASSERT(!xpi.fIgnoresInputColor);
252 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400253 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
254 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700255 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
256 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
Greg Daniel79cdf282017-05-22 15:56:22 -0400257 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700258 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
259 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400260 case SkBlendMode::kModulate:
Brian Salomon31853842017-03-28 16:32:05 -0400261 TEST_ASSERT(!xpi.fIgnoresInputColor);
262 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400263 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
264 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
265 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
266 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
267 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700268 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
269 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400270 case SkBlendMode::kScreen:
Brian Salomon31853842017-03-28 16:32:05 -0400271 TEST_ASSERT(!xpi.fIgnoresInputColor);
272 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400273 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
274 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700275 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
276 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
Greg Daniel79cdf282017-05-22 15:56:22 -0400277 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700278 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
279 break;
280 default:
281 ERRORF(reporter, "Invalid xfermode.");
282 break;
283 }
284 }
285}
cdalton6fd158e2015-05-27 15:08:33 -0700286static void test_color_unknown_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomona811b122017-03-30 08:21:32 -0400287 GrProcessorAnalysisColor inputColor = GrProcessorAnalysisColor::Opaque::kNo;
288 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kSingleChannel;
cdalton6fd158e2015-05-27 15:08:33 -0700289
Mike Reed7d954ad2016-10-28 15:42:34 -0400290 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
291 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon31853842017-03-28 16:32:05 -0400292 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
cdalton6fd158e2015-05-27 15:08:33 -0700293 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400294 case SkBlendMode::kClear:
Brian Salomon31853842017-03-28 16:32:05 -0400295 TEST_ASSERT(xpi.fIgnoresInputColor);
296 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700297 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
298 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
299 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
300 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
301 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
302 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
303 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400304 case SkBlendMode::kSrc:
Brian Salomon31853842017-03-28 16:32:05 -0400305 TEST_ASSERT(!xpi.fIgnoresInputColor);
306 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700307 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
308 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
309 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
310 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
311 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
312 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
313 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400314 case SkBlendMode::kDst:
Brian Salomon31853842017-03-28 16:32:05 -0400315 TEST_ASSERT(xpi.fIgnoresInputColor);
316 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700317 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
318 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
319 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
320 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
321 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
322 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
323 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400324 case SkBlendMode::kSrcOver:
Brian Salomon31853842017-03-28 16:32:05 -0400325 TEST_ASSERT(!xpi.fIgnoresInputColor);
326 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700327 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
328 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
329 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
330 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
331 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
332 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
333 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400334 case SkBlendMode::kDstOver:
Brian Salomon31853842017-03-28 16:32:05 -0400335 TEST_ASSERT(!xpi.fIgnoresInputColor);
336 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700337 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
338 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
339 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
340 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
341 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
342 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
343 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400344 case SkBlendMode::kSrcIn:
Brian Salomon31853842017-03-28 16:32:05 -0400345 TEST_ASSERT(!xpi.fIgnoresInputColor);
346 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700347 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
348 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
349 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
350 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
351 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
352 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
353 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400354 case SkBlendMode::kDstIn:
Brian Salomon31853842017-03-28 16:32:05 -0400355 TEST_ASSERT(!xpi.fIgnoresInputColor);
356 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700357 TEST_ASSERT(kISAModulate_OutputType == xpi.fPrimaryOutputType);
358 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
359 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
360 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
361 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
362 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
363 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400364 case SkBlendMode::kSrcOut:
Brian Salomon31853842017-03-28 16:32:05 -0400365 TEST_ASSERT(!xpi.fIgnoresInputColor);
366 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700367 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
368 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
369 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
370 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
371 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
372 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
373 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400374 case SkBlendMode::kDstOut:
Brian Salomon31853842017-03-28 16:32:05 -0400375 TEST_ASSERT(!xpi.fIgnoresInputColor);
376 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700377 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
378 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
379 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
380 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
381 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
382 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
383 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400384 case SkBlendMode::kSrcATop:
Brian Salomon31853842017-03-28 16:32:05 -0400385 TEST_ASSERT(!xpi.fIgnoresInputColor);
386 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700387 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
388 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
389 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
390 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
391 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
392 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
393 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400394 case SkBlendMode::kDstATop:
Brian Salomon31853842017-03-28 16:32:05 -0400395 TEST_ASSERT(!xpi.fIgnoresInputColor);
396 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700397 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
398 TEST_ASSERT(kISAModulate_OutputType == xpi.fSecondaryOutputType);
399 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
400 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
401 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
402 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
403 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400404 case SkBlendMode::kXor:
Brian Salomon31853842017-03-28 16:32:05 -0400405 TEST_ASSERT(!xpi.fIgnoresInputColor);
406 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700407 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
408 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
409 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
410 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
411 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
412 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
413 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400414 case SkBlendMode::kPlus:
Brian Salomon31853842017-03-28 16:32:05 -0400415 TEST_ASSERT(!xpi.fIgnoresInputColor);
416 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700417 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
418 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
419 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
420 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
421 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
422 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
423 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400424 case SkBlendMode::kModulate:
Brian Salomon31853842017-03-28 16:32:05 -0400425 TEST_ASSERT(!xpi.fIgnoresInputColor);
426 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700427 TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType);
428 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
429 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
430 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
431 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
432 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
433 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400434 case SkBlendMode::kScreen:
Brian Salomon31853842017-03-28 16:32:05 -0400435 TEST_ASSERT(!xpi.fIgnoresInputColor);
436 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700437 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
438 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
439 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
440 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
441 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
442 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
443 break;
444 default:
445 ERRORF(reporter, "Invalid xfermode.");
446 break;
447 }
448 }
449}
450
Brian Salomon31853842017-03-28 16:32:05 -0400451static void test_color_not_opaque_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Osmancf860852018-10-31 14:04:39 -0400452 GrProcessorAnalysisColor inputColor(
453 SkPMColor4f::FromBytes_RGBA(GrColorPackRGBA(229, 0, 154, 240)));
Brian Salomona811b122017-03-30 08:21:32 -0400454 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kNone;
cdalton6fd158e2015-05-27 15:08:33 -0700455
Mike Reed7d954ad2016-10-28 15:42:34 -0400456 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
457 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon31853842017-03-28 16:32:05 -0400458 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
cdalton6fd158e2015-05-27 15:08:33 -0700459 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400460 case SkBlendMode::kClear:
Brian Salomon31853842017-03-28 16:32:05 -0400461 TEST_ASSERT(xpi.fIgnoresInputColor);
462 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700463 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
464 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
465 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
466 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
467 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
468 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
469 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400470 case SkBlendMode::kSrc:
Brian Salomon31853842017-03-28 16:32:05 -0400471 TEST_ASSERT(!xpi.fIgnoresInputColor);
472 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700473 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
474 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
475 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
476 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
477 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
478 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
479 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400480 case SkBlendMode::kDst:
Brian Salomon31853842017-03-28 16:32:05 -0400481 TEST_ASSERT(xpi.fIgnoresInputColor);
482 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700483 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
484 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
485 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
486 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
487 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
488 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
489 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400490 case SkBlendMode::kSrcOver:
Brian Salomon31853842017-03-28 16:32:05 -0400491 TEST_ASSERT(!xpi.fIgnoresInputColor);
492 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700493 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
494 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
495 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
496 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
497 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
498 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
499 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400500 case SkBlendMode::kDstOver:
Brian Salomon31853842017-03-28 16:32:05 -0400501 TEST_ASSERT(!xpi.fIgnoresInputColor);
502 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700503 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
504 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
505 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
506 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
507 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
508 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
509 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400510 case SkBlendMode::kSrcIn:
Brian Salomon31853842017-03-28 16:32:05 -0400511 TEST_ASSERT(!xpi.fIgnoresInputColor);
512 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700513 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
514 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
515 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
516 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
517 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
518 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
519 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400520 case SkBlendMode::kDstIn:
Brian Salomon31853842017-03-28 16:32:05 -0400521 TEST_ASSERT(!xpi.fIgnoresInputColor);
522 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700523 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
524 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
525 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
526 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
527 TEST_ASSERT(kSA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
528 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
529 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400530 case SkBlendMode::kSrcOut:
Brian Salomon31853842017-03-28 16:32:05 -0400531 TEST_ASSERT(!xpi.fIgnoresInputColor);
532 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700533 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
534 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
535 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
536 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
537 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
538 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
539 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400540 case SkBlendMode::kDstOut:
Brian Salomon31853842017-03-28 16:32:05 -0400541 TEST_ASSERT(!xpi.fIgnoresInputColor);
542 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700543 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
544 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
545 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
546 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
547 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
548 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
549 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400550 case SkBlendMode::kSrcATop:
Brian Salomon31853842017-03-28 16:32:05 -0400551 TEST_ASSERT(!xpi.fIgnoresInputColor);
552 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700553 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
554 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
555 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
556 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
557 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
558 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
559 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400560 case SkBlendMode::kDstATop:
Brian Salomon31853842017-03-28 16:32:05 -0400561 TEST_ASSERT(!xpi.fIgnoresInputColor);
562 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700563 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
564 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
565 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
566 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
567 TEST_ASSERT(kSA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
568 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
569 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400570 case SkBlendMode::kXor:
Brian Salomon31853842017-03-28 16:32:05 -0400571 TEST_ASSERT(!xpi.fIgnoresInputColor);
572 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700573 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
574 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
575 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
576 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
577 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
578 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
579 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400580 case SkBlendMode::kPlus:
Brian Salomon31853842017-03-28 16:32:05 -0400581 TEST_ASSERT(!xpi.fIgnoresInputColor);
582 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700583 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
584 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
585 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
586 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
587 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
588 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
589 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400590 case SkBlendMode::kModulate:
Brian Salomon31853842017-03-28 16:32:05 -0400591 TEST_ASSERT(!xpi.fIgnoresInputColor);
592 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700593 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
594 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
595 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
596 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
597 TEST_ASSERT(kSC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
598 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
599 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400600 case SkBlendMode::kScreen:
Brian Salomon31853842017-03-28 16:32:05 -0400601 TEST_ASSERT(!xpi.fIgnoresInputColor);
602 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700603 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
604 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
605 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
606 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
607 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
608 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
609 break;
610 default:
611 ERRORF(reporter, "Invalid xfermode.");
612 break;
613 }
614 }
615}
616
617static void test_color_opaque_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomona811b122017-03-30 08:21:32 -0400618 GrProcessorAnalysisColor inputColor = GrProcessorAnalysisColor::Opaque::kYes;
619 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kSingleChannel;
cdalton6fd158e2015-05-27 15:08:33 -0700620
Mike Reed7d954ad2016-10-28 15:42:34 -0400621 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
622 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon31853842017-03-28 16:32:05 -0400623 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
cdalton6fd158e2015-05-27 15:08:33 -0700624 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400625 case SkBlendMode::kClear:
Brian Salomon31853842017-03-28 16:32:05 -0400626 TEST_ASSERT(xpi.fIgnoresInputColor);
627 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700628 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
629 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
630 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
631 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
632 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
633 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
634 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400635 case SkBlendMode::kSrc:
Brian Salomon31853842017-03-28 16:32:05 -0400636 TEST_ASSERT(!xpi.fIgnoresInputColor);
637 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700638 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
639 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
640 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
641 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
642 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
643 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
644 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400645 case SkBlendMode::kDst:
Brian Salomon31853842017-03-28 16:32:05 -0400646 TEST_ASSERT(xpi.fIgnoresInputColor);
647 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700648 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
649 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
650 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
651 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
652 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
653 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
654 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400655 case SkBlendMode::kSrcOver:
Brian Salomon31853842017-03-28 16:32:05 -0400656 TEST_ASSERT(!xpi.fIgnoresInputColor);
657 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700658 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
659 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
660 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
661 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
662 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
663 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
664 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400665 case SkBlendMode::kDstOver:
Brian Salomon31853842017-03-28 16:32:05 -0400666 TEST_ASSERT(!xpi.fIgnoresInputColor);
667 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700668 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
669 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
670 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
671 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
672 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
673 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
674 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400675 case SkBlendMode::kSrcIn:
Brian Salomon31853842017-03-28 16:32:05 -0400676 TEST_ASSERT(!xpi.fIgnoresInputColor);
677 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700678 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
679 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
680 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
681 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
682 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
683 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
684 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400685 case SkBlendMode::kDstIn:
Brian Salomon31853842017-03-28 16:32:05 -0400686 TEST_ASSERT(xpi.fIgnoresInputColor);
687 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700688 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
689 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
690 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
691 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
692 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
693 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
694 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400695 case SkBlendMode::kSrcOut:
Brian Salomon31853842017-03-28 16:32:05 -0400696 TEST_ASSERT(!xpi.fIgnoresInputColor);
697 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700698 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
699 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
700 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
701 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
702 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
703 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
704 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400705 case SkBlendMode::kDstOut:
Brian Salomon31853842017-03-28 16:32:05 -0400706 TEST_ASSERT(xpi.fIgnoresInputColor);
707 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700708 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
709 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
710 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
711 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
712 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
713 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
714 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400715 case SkBlendMode::kSrcATop:
Brian Salomon31853842017-03-28 16:32:05 -0400716 TEST_ASSERT(!xpi.fIgnoresInputColor);
717 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700718 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
719 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
720 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
721 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
722 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
723 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
724 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400725 case SkBlendMode::kDstATop:
Brian Salomon31853842017-03-28 16:32:05 -0400726 TEST_ASSERT(!xpi.fIgnoresInputColor);
727 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700728 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
729 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
730 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
731 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
732 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
733 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
734 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400735 case SkBlendMode::kXor:
Brian Salomon31853842017-03-28 16:32:05 -0400736 TEST_ASSERT(!xpi.fIgnoresInputColor);
737 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700738 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
739 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
740 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
741 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
742 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
743 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
744 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400745 case SkBlendMode::kPlus:
Brian Salomon31853842017-03-28 16:32:05 -0400746 TEST_ASSERT(!xpi.fIgnoresInputColor);
747 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700748 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
749 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
750 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
751 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
752 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
753 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
754 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400755 case SkBlendMode::kModulate:
Brian Salomon31853842017-03-28 16:32:05 -0400756 TEST_ASSERT(!xpi.fIgnoresInputColor);
cdalton6fd158e2015-05-27 15:08:33 -0700757 TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType);
758 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
759 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
760 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
761 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
762 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
763 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400764 case SkBlendMode::kScreen:
Brian Salomon31853842017-03-28 16:32:05 -0400765 TEST_ASSERT(!xpi.fIgnoresInputColor);
766 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700767 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
768 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
769 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
770 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
771 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
772 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
773 break;
774 default:
775 ERRORF(reporter, "Invalid xfermode.");
776 break;
777 }
778 }
779}
780
781static void test_color_opaque_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomona811b122017-03-30 08:21:32 -0400782 GrProcessorAnalysisColor inputColor = GrProcessorAnalysisColor::Opaque::kYes;
783 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kNone;
cdalton6fd158e2015-05-27 15:08:33 -0700784
Mike Reed7d954ad2016-10-28 15:42:34 -0400785 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
786 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon31853842017-03-28 16:32:05 -0400787 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
cdalton6fd158e2015-05-27 15:08:33 -0700788
789 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400790 case SkBlendMode::kClear:
Brian Salomon31853842017-03-28 16:32:05 -0400791 TEST_ASSERT(xpi.fIgnoresInputColor);
792 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700793 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
794 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
795 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
796 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
797 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
798 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
799 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400800 case SkBlendMode::kSrc:
Brian Salomon31853842017-03-28 16:32:05 -0400801 TEST_ASSERT(!xpi.fIgnoresInputColor);
802 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700803 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
804 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
805 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
806 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
807 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
808 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
809 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400810 case SkBlendMode::kDst:
Brian Salomon31853842017-03-28 16:32:05 -0400811 TEST_ASSERT(xpi.fIgnoresInputColor);
812 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700813 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
814 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
815 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
816 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
817 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
818 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
819 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400820 case SkBlendMode::kSrcOver:
Brian Salomon28207df2017-06-05 12:25:13 -0400821 // We don't specialize opaque src-over. See note in GrPorterDuffXferProcessor.cpp
Brian Salomon31853842017-03-28 16:32:05 -0400822 TEST_ASSERT(!xpi.fIgnoresInputColor);
Brian Salomon28207df2017-06-05 12:25:13 -0400823 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700824 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
825 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
826 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
827 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
Brian Salomon28207df2017-06-05 12:25:13 -0400828 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
cdalton6fd158e2015-05-27 15:08:33 -0700829 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
830 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400831 case SkBlendMode::kDstOver:
Brian Salomon31853842017-03-28 16:32:05 -0400832 TEST_ASSERT(!xpi.fIgnoresInputColor);
833 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700834 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
835 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
836 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
837 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
838 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
839 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
840 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400841 case SkBlendMode::kSrcIn:
Brian Salomon31853842017-03-28 16:32:05 -0400842 TEST_ASSERT(!xpi.fIgnoresInputColor);
843 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700844 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
845 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
846 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
847 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
848 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
849 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
850 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400851 case SkBlendMode::kDstIn:
Brian Salomon31853842017-03-28 16:32:05 -0400852 TEST_ASSERT(xpi.fIgnoresInputColor);
853 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700854 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
855 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
856 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
857 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
858 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
859 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
860 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400861 case SkBlendMode::kSrcOut:
Brian Salomon31853842017-03-28 16:32:05 -0400862 TEST_ASSERT(!xpi.fIgnoresInputColor);
863 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700864 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
865 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
866 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
867 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
868 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
869 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
870 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400871 case SkBlendMode::kDstOut:
Brian Salomon31853842017-03-28 16:32:05 -0400872 TEST_ASSERT(xpi.fIgnoresInputColor);
873 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700874 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
875 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
876 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
877 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
878 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
879 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
880 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400881 case SkBlendMode::kSrcATop:
Brian Salomon31853842017-03-28 16:32:05 -0400882 TEST_ASSERT(!xpi.fIgnoresInputColor);
883 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700884 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
885 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
886 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
887 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
888 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
889 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
890 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400891 case SkBlendMode::kDstATop:
Brian Salomon31853842017-03-28 16:32:05 -0400892 TEST_ASSERT(!xpi.fIgnoresInputColor);
893 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700894 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
895 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
896 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
897 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
898 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
899 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
900 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400901 case SkBlendMode::kXor:
Brian Salomon31853842017-03-28 16:32:05 -0400902 TEST_ASSERT(!xpi.fIgnoresInputColor);
903 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700904 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
905 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
906 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
907 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
908 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
909 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
910 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400911 case SkBlendMode::kPlus:
Brian Salomon31853842017-03-28 16:32:05 -0400912 TEST_ASSERT(!xpi.fIgnoresInputColor);
913 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700914 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
915 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
916 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
917 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
918 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
919 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
920 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400921 case SkBlendMode::kModulate:
Brian Salomon31853842017-03-28 16:32:05 -0400922 TEST_ASSERT(!xpi.fIgnoresInputColor);
923 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700924 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
925 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
926 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
927 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
928 TEST_ASSERT(kSC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
929 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
930 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400931 case SkBlendMode::kScreen:
Brian Salomon31853842017-03-28 16:32:05 -0400932 TEST_ASSERT(!xpi.fIgnoresInputColor);
933 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700934 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
935 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
936 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
937 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
938 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
939 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
940 break;
941 default:
942 ERRORF(reporter, "Invalid xfermode.");
943 break;
944 }
945 }
946}
947
egdaniel723b0502015-09-15 09:31:40 -0700948static void test_lcd_coverage_fallback_case(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Osman5ced0bf2019-03-15 10:15:29 -0400949 constexpr GrClampType autoClamp = GrClampType::kAuto;
Brian Salomon31853842017-03-28 16:32:05 -0400950 const GrXPFactory* xpf = GrPorterDuffXPFactory::Get(SkBlendMode::kSrcOver);
Brian Osmancf860852018-10-31 14:04:39 -0400951 GrProcessorAnalysisColor color = SkPMColor4f::FromBytes_RGBA(GrColorPackRGBA(123, 45, 67, 255));
Brian Salomona811b122017-03-30 08:21:32 -0400952 GrProcessorAnalysisCoverage coverage = GrProcessorAnalysisCoverage::kLCD;
Brian Osman5ced0bf2019-03-15 10:15:29 -0400953 TEST_ASSERT(!(GrXPFactory::GetAnalysisProperties(xpf, color, coverage, caps, autoClamp) &
Greg Daniel6ebe4b92017-05-19 10:56:46 -0400954 GrXPFactory::AnalysisProperties::kRequiresDstTexture));
955 sk_sp<const GrXferProcessor> xp_opaque(
Brian Osman5ced0bf2019-03-15 10:15:29 -0400956 GrXPFactory::MakeXferProcessor(xpf, color, coverage, false, caps, autoClamp));
Greg Daniel6ebe4b92017-05-19 10:56:46 -0400957 if (!xp_opaque) {
958 ERRORF(reporter, "Failed to create an XP with LCD coverage.");
959 return;
960 }
961
962 GrXferProcessor::BlendInfo blendInfo;
963 xp_opaque->getBlendInfo(&blendInfo);
964 TEST_ASSERT(blendInfo.fWriteColor);
965
966 // Test with non-opaque alpha
Brian Osmancf860852018-10-31 14:04:39 -0400967 color = SkPMColor4f::FromBytes_RGBA(GrColorPackRGBA(123, 45, 67, 221));
Greg Daniel6ebe4b92017-05-19 10:56:46 -0400968 coverage = GrProcessorAnalysisCoverage::kLCD;
Brian Osman5ced0bf2019-03-15 10:15:29 -0400969 TEST_ASSERT(!(GrXPFactory::GetAnalysisProperties(xpf, color, coverage, caps, autoClamp) &
Greg Danield7b11592017-06-14 13:37:12 -0400970 GrXPFactory::AnalysisProperties::kRequiresDstTexture));
Brian Salomond61c9d92017-04-10 10:54:25 -0400971 sk_sp<const GrXferProcessor> xp(
Brian Osman5ced0bf2019-03-15 10:15:29 -0400972 GrXPFactory::MakeXferProcessor(xpf, color, coverage, false, caps, autoClamp));
cdalton6fd158e2015-05-27 15:08:33 -0700973 if (!xp) {
974 ERRORF(reporter, "Failed to create an XP with LCD coverage.");
975 return;
976 }
977
cdalton6fd158e2015-05-27 15:08:33 -0700978 xp->getBlendInfo(&blendInfo);
979 TEST_ASSERT(blendInfo.fWriteColor);
980}
981
Brian Salomondcfca432017-11-15 15:48:03 -0500982DEF_GPUTEST(PorterDuffNoDualSourceBlending, reporter, options) {
983 GrContextOptions opts = options;
cdalton6fd158e2015-05-27 15:08:33 -0700984 opts.fSuppressDualSourceBlending = true;
bsalomon3724e572016-03-30 18:56:19 -0700985 sk_gpu_test::GrContextFactory mockFactory(opts);
Brian Osman7c597742019-03-26 11:10:11 -0400986 GrContext* ctx = mockFactory.get(sk_gpu_test::GrContextFactory::kMock_ContextType);
cdalton6fd158e2015-05-27 15:08:33 -0700987 if (!ctx) {
Brian Osman7c597742019-03-26 11:10:11 -0400988 SK_ABORT("Failed to create mock context without ARB_blend_func_extended.");
cdalton6fd158e2015-05-27 15:08:33 -0700989 return;
990 }
991
Robert Phillips9da87e02019-02-04 13:26:26 -0500992 GrGpu* gpu = ctx->priv().getGpu();
993 GrProxyProvider* proxyProvider = ctx->priv().proxyProvider();
994 const GrCaps& caps = *ctx->priv().caps();
cdalton6fd158e2015-05-27 15:08:33 -0700995 if (caps.shaderCaps()->dualSourceBlendingSupport()) {
Brian Osman7c597742019-03-26 11:10:11 -0400996 SK_ABORT("Mock context failed to honor request for no ARB_blend_func_extended.");
cdalton6fd158e2015-05-27 15:08:33 -0700997 return;
998 }
999
Robert Phillipsd21b2a52017-12-12 13:01:25 -05001000 GrBackendTexture backendTex =
Robert Phillips646f6372018-09-25 09:31:10 -04001001 gpu->createTestingOnlyBackendTexture(nullptr, 100, 100, GrColorType::kRGBA_8888,
Robert Phillipsf35fd8d2018-01-22 10:48:15 -05001002 false, GrMipMapped::kNo);
Greg Daniel7ef28f32017-04-20 16:41:55 +00001003
Robert Phillipsbb581ce2017-05-29 15:05:15 -04001004 GrXferProcessor::DstProxy fakeDstProxy;
1005 {
Brian Salomonc67c31c2018-12-06 10:00:03 -05001006 sk_sp<GrTextureProxy> proxy = proxyProvider->wrapBackendTexture(
Brian Salomonaa6ca0a2019-01-24 16:03:07 -05001007 backendTex, kTopLeft_GrSurfaceOrigin, kBorrow_GrWrapOwnership, GrWrapCacheable::kNo,
1008 kRead_GrIOType);
Robert Phillipsbb581ce2017-05-29 15:05:15 -04001009 fakeDstProxy.setProxy(std::move(proxy));
1010 }
cdalton6fd158e2015-05-27 15:08:33 -07001011
Brian Salomona811b122017-03-30 08:21:32 -04001012 static const GrProcessorAnalysisColor colorInputs[] = {
1013 GrProcessorAnalysisColor::Opaque::kNo, GrProcessorAnalysisColor::Opaque::kYes,
Brian Osmancf860852018-10-31 14:04:39 -04001014 GrProcessorAnalysisColor(SkPMColor4f::FromBytes_RGBA(GrColorPackRGBA(0, 82, 17, 100))),
1015 GrProcessorAnalysisColor(SkPMColor4f::FromBytes_RGBA(GrColorPackRGBA(0, 82, 17, 255)))};
cdalton6fd158e2015-05-27 15:08:33 -07001016
Brian Salomonc6b71462017-02-14 11:33:01 -05001017 for (const auto& colorInput : colorInputs) {
Brian Salomona811b122017-03-30 08:21:32 -04001018 for (GrProcessorAnalysisCoverage coverageType :
1019 {GrProcessorAnalysisCoverage::kSingleChannel, GrProcessorAnalysisCoverage::kNone}) {
Mike Reed7d954ad2016-10-28 15:42:34 -04001020 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
1021 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomona1633922017-01-09 11:46:10 -05001022 const GrXPFactory* xpf = GrPorterDuffXPFactory::Get(xfermode);
Brian Salomond61c9d92017-04-10 10:54:25 -04001023 sk_sp<const GrXferProcessor> xp(
Brian Osman5ced0bf2019-03-15 10:15:29 -04001024 GrXPFactory::MakeXferProcessor(xpf, colorInput, coverageType, false, caps,
1025 GrClampType::kAuto));
cdalton6fd158e2015-05-27 15:08:33 -07001026 if (!xp) {
1027 ERRORF(reporter, "Failed to create an XP without dual source blending.");
1028 return;
1029 }
1030 TEST_ASSERT(!xp->hasSecondaryOutput());
cdalton6fd158e2015-05-27 15:08:33 -07001031 }
1032 }
1033 }
Brian Salomon26102cb2018-03-09 09:33:19 -05001034 gpu->deleteTestingOnlyBackendTexture(backendTex);
cdalton6fd158e2015-05-27 15:08:33 -07001035}