blob: a01d0e57f575001208377d04492c02f66f876779 [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
Mike Kleinc0bd9f92019-04-23 12:05:21 -05008#include "tests/Test.h"
cdalton6fd158e2015-05-27 15:08:33 -07009
Mike Kleinc0bd9f92019-04-23 12:05:21 -050010#include "include/gpu/GrBackendSurface.h"
11#include "include/gpu/GrContextOptions.h"
12#include "src/gpu/GrContextPriv.h"
13#include "src/gpu/GrGpu.h"
14#include "src/gpu/GrProxyProvider.h"
15#include "src/gpu/GrXferProcessor.h"
16#include "src/gpu/effects/GrPorterDuffXferProcessor.h"
17#include "src/gpu/gl/GrGLCaps.h"
18#include "src/gpu/ops/GrMeshDrawOp.h"
19#include "tools/gpu/GrContextFactory.h"
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));
Chris Dalton6ce447a2019-06-23 18:07:38 -060070 bool hasMixedSampledCoverage = false;
Brian Osmancf860852018-10-31 14:04:39 -040071 SkPMColor4f overrideColor;
Chris Daltonb8fff0d2019-03-05 10:11:58 -070072 GrProcessorSet::Analysis analysis = procs.finalize(
Chris Dalton6ce447a2019-06-23 18:07:38 -060073 colorInput, coverageInput, nullptr, &GrUserStencilSettings::kUnused,
74 hasMixedSampledCoverage, caps, GrClampType::kAuto, &overrideColor);
Brian Salomon48d1b4c2017-04-08 07:38:53 -040075 return analysis;
76}
77
cdalton6fd158e2015-05-27 15:08:33 -070078class GrPorterDuffTest {
79public:
80 struct XPInfo {
Mike Reed7d954ad2016-10-28 15:42:34 -040081 XPInfo(skiatest::Reporter* reporter, SkBlendMode xfermode, const GrCaps& caps,
Brian Salomona811b122017-03-30 08:21:32 -040082 GrProcessorAnalysisColor inputColor, GrProcessorAnalysisCoverage inputCoverage) {
Brian Salomona1633922017-01-09 11:46:10 -050083 const GrXPFactory* xpf = GrPorterDuffXPFactory::Get(xfermode);
Brian Salomon48d1b4c2017-04-08 07:38:53 -040084
Greg Daniel79cdf282017-05-22 15:56:22 -040085 bool isLCD = GrProcessorAnalysisCoverage::kLCD == inputCoverage;
86
Brian Salomon48d1b4c2017-04-08 07:38:53 -040087 GrProcessorSet::Analysis analysis = do_analysis(xpf, inputColor, inputCoverage, caps);
Brian Salomon31853842017-03-28 16:32:05 -040088 fCompatibleWithCoverageAsAlpha = analysis.isCompatibleWithCoverageAsAlpha();
Brian Salomon48d1b4c2017-04-08 07:38:53 -040089 fIgnoresInputColor = analysis.inputColorIsIgnored();
Brian Salomond61c9d92017-04-10 10:54:25 -040090 sk_sp<const GrXferProcessor> xp(
Brian Osman5ced0bf2019-03-15 10:15:29 -040091 GrXPFactory::MakeXferProcessor(xpf, inputColor, inputCoverage, false, caps,
92 GrClampType::kAuto));
Greg Daniel79cdf282017-05-22 15:56:22 -040093 TEST_ASSERT(!analysis.requiresDstTexture() ||
94 (isLCD &&
95 !caps.shaderCaps()->dstReadInShaderSupport() &&
96 (SkBlendMode::kSrcOver != xfermode ||
97 !inputColor.isOpaque())));
Chris Dalton945ee652019-01-23 09:10:36 -070098 // Porter Duff modes currently only use fixed-function or shader blending, and Ganesh
99 // doesn't yet make use of framebuffer fetches that require a barrier
100 // (e.g., QCOM_shader_framebuffer_fetch_noncoherent). So dst textures and xfer barriers
101 // should always go hand in hand for Porter Duff modes.
102 TEST_ASSERT(analysis.requiresDstTexture() == analysis.requiresNonOverlappingDraws());
Hal Canary342b7ac2016-11-04 11:49:42 -0400103 GetXPOutputTypes(xp.get(), &fPrimaryOutputType, &fSecondaryOutputType);
Chris Daltonbbb3f642019-07-24 12:25:08 -0400104 fBlendInfo = xp->getBlendInfo();
Greg Daniel79cdf282017-05-22 15:56:22 -0400105 TEST_ASSERT(!xp->willReadDstColor() ||
106 (isLCD && (SkBlendMode::kSrcOver != xfermode ||
107 !inputColor.isOpaque())));
cdalton6fd158e2015-05-27 15:08:33 -0700108 TEST_ASSERT(xp->hasSecondaryOutput() == GrBlendCoeffRefsSrc2(fBlendInfo.fDstBlend));
109 }
110
Brian Salomon31853842017-03-28 16:32:05 -0400111 bool fCompatibleWithCoverageAsAlpha;
112 bool fIgnoresInputColor;
cdalton6fd158e2015-05-27 15:08:33 -0700113 int fPrimaryOutputType;
114 int fSecondaryOutputType;
115 GrXferProcessor::BlendInfo fBlendInfo;
116 };
117
118 static void GetXPOutputTypes(const GrXferProcessor* xp, int* outPrimary, int* outSecondary) {
egdanielf2342722015-11-20 15:12:59 -0800119 GrPorterDuffXPFactory::TestGetXPOutputTypes(xp, outPrimary, outSecondary);
cdalton6fd158e2015-05-27 15:08:33 -0700120 }
121};
122
egdaniel723b0502015-09-15 09:31:40 -0700123static void test_lcd_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Greg Daniel6ebe4b92017-05-19 10:56:46 -0400124 GrProcessorAnalysisColor inputColor = GrProcessorAnalysisColor::Opaque::kYes;
Brian Salomona811b122017-03-30 08:21:32 -0400125 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kLCD;
egdaniel723b0502015-09-15 09:31:40 -0700126
Mike Reed7d954ad2016-10-28 15:42:34 -0400127 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
128 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon31853842017-03-28 16:32:05 -0400129 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
egdaniel723b0502015-09-15 09:31:40 -0700130 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400131 case SkBlendMode::kClear:
Brian Salomon31853842017-03-28 16:32:05 -0400132 TEST_ASSERT(xpi.fIgnoresInputColor);
133 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400134 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
135 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
136 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
137 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
138 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700139 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
140 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400141 case SkBlendMode::kSrc:
Brian Salomon31853842017-03-28 16:32:05 -0400142 TEST_ASSERT(!xpi.fIgnoresInputColor);
143 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400144 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
145 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700146 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
147 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
Greg Daniel79cdf282017-05-22 15:56:22 -0400148 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700149 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
150 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400151 case SkBlendMode::kDst:
Brian Salomon31853842017-03-28 16:32:05 -0400152 TEST_ASSERT(xpi.fIgnoresInputColor);
153 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400154 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
155 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700156 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400157 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
158 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
159 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
egdaniel723b0502015-09-15 09:31:40 -0700160 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400161 case SkBlendMode::kSrcOver:
Brian Salomon31853842017-03-28 16:32:05 -0400162 TEST_ASSERT(!xpi.fIgnoresInputColor);
163 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
egdaniel723b0502015-09-15 09:31:40 -0700164 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
165 TEST_ASSERT(kSAModulate_OutputType == xpi.fSecondaryOutputType);
166 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
167 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
168 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
169 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
170 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400171 case SkBlendMode::kDstOver:
Brian Salomon31853842017-03-28 16:32:05 -0400172 TEST_ASSERT(!xpi.fIgnoresInputColor);
173 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400174 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
175 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700176 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400177 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
178 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700179 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
180 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400181 case SkBlendMode::kSrcIn:
Brian Salomon31853842017-03-28 16:32:05 -0400182 TEST_ASSERT(!xpi.fIgnoresInputColor);
183 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400184 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
185 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700186 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400187 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
188 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700189 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
190 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400191 case SkBlendMode::kDstIn:
Brian Salomon31853842017-03-28 16:32:05 -0400192 TEST_ASSERT(!xpi.fIgnoresInputColor);
193 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400194 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
195 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
196 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
197 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
198 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700199 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
200 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400201 case SkBlendMode::kSrcOut:
Brian Salomon31853842017-03-28 16:32:05 -0400202 TEST_ASSERT(!xpi.fIgnoresInputColor);
203 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400204 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
205 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700206 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400207 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
208 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700209 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
210 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400211 case SkBlendMode::kDstOut:
Brian Salomon31853842017-03-28 16:32:05 -0400212 TEST_ASSERT(!xpi.fIgnoresInputColor);
213 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400214 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
215 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700216 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400217 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
218 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700219 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
220 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400221 case SkBlendMode::kSrcATop:
Brian Salomon31853842017-03-28 16:32:05 -0400222 TEST_ASSERT(!xpi.fIgnoresInputColor);
223 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400224 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
225 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700226 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400227 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
228 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700229 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
230 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400231 case SkBlendMode::kDstATop:
Brian Salomon31853842017-03-28 16:32:05 -0400232 TEST_ASSERT(!xpi.fIgnoresInputColor);
233 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400234 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
235 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700236 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400237 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
238 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700239 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
240 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400241 case SkBlendMode::kXor:
Brian Salomon31853842017-03-28 16:32:05 -0400242 TEST_ASSERT(!xpi.fIgnoresInputColor);
243 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400244 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
245 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700246 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400247 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
248 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700249 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
250 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400251 case SkBlendMode::kPlus:
Brian Salomon31853842017-03-28 16:32:05 -0400252 TEST_ASSERT(!xpi.fIgnoresInputColor);
253 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400254 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
255 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700256 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
257 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
Greg Daniel79cdf282017-05-22 15:56:22 -0400258 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700259 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
260 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400261 case SkBlendMode::kModulate:
Brian Salomon31853842017-03-28 16:32:05 -0400262 TEST_ASSERT(!xpi.fIgnoresInputColor);
263 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400264 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
265 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
266 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
267 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
268 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700269 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
270 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400271 case SkBlendMode::kScreen:
Brian Salomon31853842017-03-28 16:32:05 -0400272 TEST_ASSERT(!xpi.fIgnoresInputColor);
273 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400274 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
275 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700276 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
277 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
Greg Daniel79cdf282017-05-22 15:56:22 -0400278 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700279 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
280 break;
281 default:
282 ERRORF(reporter, "Invalid xfermode.");
283 break;
284 }
285 }
286}
cdalton6fd158e2015-05-27 15:08:33 -0700287static void test_color_unknown_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomona811b122017-03-30 08:21:32 -0400288 GrProcessorAnalysisColor inputColor = GrProcessorAnalysisColor::Opaque::kNo;
289 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kSingleChannel;
cdalton6fd158e2015-05-27 15:08:33 -0700290
Mike Reed7d954ad2016-10-28 15:42:34 -0400291 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
292 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon31853842017-03-28 16:32:05 -0400293 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
cdalton6fd158e2015-05-27 15:08:33 -0700294 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400295 case SkBlendMode::kClear:
Brian Salomon31853842017-03-28 16:32:05 -0400296 TEST_ASSERT(xpi.fIgnoresInputColor);
297 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700298 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
299 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
300 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
301 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
302 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
303 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
304 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400305 case SkBlendMode::kSrc:
Brian Salomon31853842017-03-28 16:32:05 -0400306 TEST_ASSERT(!xpi.fIgnoresInputColor);
307 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700308 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
309 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
310 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
311 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
312 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
313 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
314 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400315 case SkBlendMode::kDst:
Brian Salomon31853842017-03-28 16:32:05 -0400316 TEST_ASSERT(xpi.fIgnoresInputColor);
317 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700318 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
319 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
320 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
321 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
322 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
323 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
324 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400325 case SkBlendMode::kSrcOver:
Brian Salomon31853842017-03-28 16:32:05 -0400326 TEST_ASSERT(!xpi.fIgnoresInputColor);
327 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700328 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
329 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
330 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
331 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
332 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
333 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
334 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400335 case SkBlendMode::kDstOver:
Brian Salomon31853842017-03-28 16:32:05 -0400336 TEST_ASSERT(!xpi.fIgnoresInputColor);
337 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700338 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
339 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
340 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
341 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
342 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
343 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
344 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400345 case SkBlendMode::kSrcIn:
Brian Salomon31853842017-03-28 16:32:05 -0400346 TEST_ASSERT(!xpi.fIgnoresInputColor);
347 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700348 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
349 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
350 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
351 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
352 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
353 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
354 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400355 case SkBlendMode::kDstIn:
Brian Salomon31853842017-03-28 16:32:05 -0400356 TEST_ASSERT(!xpi.fIgnoresInputColor);
357 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700358 TEST_ASSERT(kISAModulate_OutputType == xpi.fPrimaryOutputType);
359 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
360 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
361 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
362 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
363 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
364 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400365 case SkBlendMode::kSrcOut:
Brian Salomon31853842017-03-28 16:32:05 -0400366 TEST_ASSERT(!xpi.fIgnoresInputColor);
367 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700368 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
369 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
370 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
371 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
372 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
373 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
374 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400375 case SkBlendMode::kDstOut:
Brian Salomon31853842017-03-28 16:32:05 -0400376 TEST_ASSERT(!xpi.fIgnoresInputColor);
377 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700378 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
379 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
380 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
381 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
382 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
383 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
384 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400385 case SkBlendMode::kSrcATop:
Brian Salomon31853842017-03-28 16:32:05 -0400386 TEST_ASSERT(!xpi.fIgnoresInputColor);
387 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700388 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
389 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
390 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
391 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
392 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
393 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
394 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400395 case SkBlendMode::kDstATop:
Brian Salomon31853842017-03-28 16:32:05 -0400396 TEST_ASSERT(!xpi.fIgnoresInputColor);
397 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700398 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
399 TEST_ASSERT(kISAModulate_OutputType == xpi.fSecondaryOutputType);
400 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
401 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
402 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
403 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
404 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400405 case SkBlendMode::kXor:
Brian Salomon31853842017-03-28 16:32:05 -0400406 TEST_ASSERT(!xpi.fIgnoresInputColor);
407 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700408 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
409 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
410 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
411 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
412 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
413 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
414 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400415 case SkBlendMode::kPlus:
Brian Salomon31853842017-03-28 16:32:05 -0400416 TEST_ASSERT(!xpi.fIgnoresInputColor);
417 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700418 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
419 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
420 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
421 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
422 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
423 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
424 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400425 case SkBlendMode::kModulate:
Brian Salomon31853842017-03-28 16:32:05 -0400426 TEST_ASSERT(!xpi.fIgnoresInputColor);
427 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700428 TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType);
429 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
430 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
431 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
432 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
433 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
434 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400435 case SkBlendMode::kScreen:
Brian Salomon31853842017-03-28 16:32:05 -0400436 TEST_ASSERT(!xpi.fIgnoresInputColor);
437 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700438 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
439 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
440 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
441 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
442 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
443 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
444 break;
445 default:
446 ERRORF(reporter, "Invalid xfermode.");
447 break;
448 }
449 }
450}
451
Brian Salomon31853842017-03-28 16:32:05 -0400452static void test_color_not_opaque_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Osmancf860852018-10-31 14:04:39 -0400453 GrProcessorAnalysisColor inputColor(
454 SkPMColor4f::FromBytes_RGBA(GrColorPackRGBA(229, 0, 154, 240)));
Brian Salomona811b122017-03-30 08:21:32 -0400455 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kNone;
cdalton6fd158e2015-05-27 15:08:33 -0700456
Mike Reed7d954ad2016-10-28 15:42:34 -0400457 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
458 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon31853842017-03-28 16:32:05 -0400459 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
cdalton6fd158e2015-05-27 15:08:33 -0700460 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400461 case SkBlendMode::kClear:
Brian Salomon31853842017-03-28 16:32:05 -0400462 TEST_ASSERT(xpi.fIgnoresInputColor);
463 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700464 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
465 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
466 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
467 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
468 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
469 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
470 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400471 case SkBlendMode::kSrc:
Brian Salomon31853842017-03-28 16:32:05 -0400472 TEST_ASSERT(!xpi.fIgnoresInputColor);
473 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700474 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
475 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
476 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
477 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
478 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
479 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
480 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400481 case SkBlendMode::kDst:
Brian Salomon31853842017-03-28 16:32:05 -0400482 TEST_ASSERT(xpi.fIgnoresInputColor);
483 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700484 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
485 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
486 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
487 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
488 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
489 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
490 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400491 case SkBlendMode::kSrcOver:
Brian Salomon31853842017-03-28 16:32:05 -0400492 TEST_ASSERT(!xpi.fIgnoresInputColor);
493 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700494 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
495 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
496 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
497 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
498 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
499 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
500 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400501 case SkBlendMode::kDstOver:
Brian Salomon31853842017-03-28 16:32:05 -0400502 TEST_ASSERT(!xpi.fIgnoresInputColor);
503 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700504 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
505 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
506 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
507 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
508 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
509 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
510 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400511 case SkBlendMode::kSrcIn:
Brian Salomon31853842017-03-28 16:32:05 -0400512 TEST_ASSERT(!xpi.fIgnoresInputColor);
513 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700514 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
515 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
516 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
517 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
518 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
519 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
520 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400521 case SkBlendMode::kDstIn:
Brian Salomon31853842017-03-28 16:32:05 -0400522 TEST_ASSERT(!xpi.fIgnoresInputColor);
523 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700524 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
525 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
526 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
527 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
528 TEST_ASSERT(kSA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
529 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
530 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400531 case SkBlendMode::kSrcOut:
Brian Salomon31853842017-03-28 16:32:05 -0400532 TEST_ASSERT(!xpi.fIgnoresInputColor);
533 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700534 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
535 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
536 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
537 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
538 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
539 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
540 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400541 case SkBlendMode::kDstOut:
Brian Salomon31853842017-03-28 16:32:05 -0400542 TEST_ASSERT(!xpi.fIgnoresInputColor);
543 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700544 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
545 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
546 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
547 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
548 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
549 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
550 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400551 case SkBlendMode::kSrcATop:
Brian Salomon31853842017-03-28 16:32:05 -0400552 TEST_ASSERT(!xpi.fIgnoresInputColor);
553 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700554 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
555 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
556 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
557 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
558 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
559 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
560 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400561 case SkBlendMode::kDstATop:
Brian Salomon31853842017-03-28 16:32:05 -0400562 TEST_ASSERT(!xpi.fIgnoresInputColor);
563 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700564 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
565 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
566 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
567 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
568 TEST_ASSERT(kSA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
569 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
570 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400571 case SkBlendMode::kXor:
Brian Salomon31853842017-03-28 16:32:05 -0400572 TEST_ASSERT(!xpi.fIgnoresInputColor);
573 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700574 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
575 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
576 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
577 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
578 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
579 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
580 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400581 case SkBlendMode::kPlus:
Brian Salomon31853842017-03-28 16:32:05 -0400582 TEST_ASSERT(!xpi.fIgnoresInputColor);
583 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700584 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
585 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
586 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
587 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
588 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
589 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
590 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400591 case SkBlendMode::kModulate:
Brian Salomon31853842017-03-28 16:32:05 -0400592 TEST_ASSERT(!xpi.fIgnoresInputColor);
593 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700594 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
595 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
596 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
597 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
598 TEST_ASSERT(kSC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
599 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
600 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400601 case SkBlendMode::kScreen:
Brian Salomon31853842017-03-28 16:32:05 -0400602 TEST_ASSERT(!xpi.fIgnoresInputColor);
603 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700604 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
605 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
606 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
607 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
608 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
609 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
610 break;
611 default:
612 ERRORF(reporter, "Invalid xfermode.");
613 break;
614 }
615 }
616}
617
618static void test_color_opaque_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomona811b122017-03-30 08:21:32 -0400619 GrProcessorAnalysisColor inputColor = GrProcessorAnalysisColor::Opaque::kYes;
620 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kSingleChannel;
cdalton6fd158e2015-05-27 15:08:33 -0700621
Mike Reed7d954ad2016-10-28 15:42:34 -0400622 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
623 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon31853842017-03-28 16:32:05 -0400624 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
cdalton6fd158e2015-05-27 15:08:33 -0700625 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400626 case SkBlendMode::kClear:
Brian Salomon31853842017-03-28 16:32:05 -0400627 TEST_ASSERT(xpi.fIgnoresInputColor);
628 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700629 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
630 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
631 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
632 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
633 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
634 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
635 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400636 case SkBlendMode::kSrc:
Brian Salomon31853842017-03-28 16:32:05 -0400637 TEST_ASSERT(!xpi.fIgnoresInputColor);
638 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700639 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
640 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
641 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
642 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
643 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
644 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
645 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400646 case SkBlendMode::kDst:
Brian Salomon31853842017-03-28 16:32:05 -0400647 TEST_ASSERT(xpi.fIgnoresInputColor);
648 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700649 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
650 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
651 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
652 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
653 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
654 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
655 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400656 case SkBlendMode::kSrcOver:
Brian Salomon31853842017-03-28 16:32:05 -0400657 TEST_ASSERT(!xpi.fIgnoresInputColor);
658 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700659 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
660 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
661 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
662 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
663 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
664 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
665 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400666 case SkBlendMode::kDstOver:
Brian Salomon31853842017-03-28 16:32:05 -0400667 TEST_ASSERT(!xpi.fIgnoresInputColor);
668 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700669 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
670 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
671 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
672 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
673 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
674 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
675 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400676 case SkBlendMode::kSrcIn:
Brian Salomon31853842017-03-28 16:32:05 -0400677 TEST_ASSERT(!xpi.fIgnoresInputColor);
678 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700679 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
680 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
681 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
682 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
683 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
684 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
685 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400686 case SkBlendMode::kDstIn:
Brian Salomon31853842017-03-28 16:32:05 -0400687 TEST_ASSERT(xpi.fIgnoresInputColor);
688 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700689 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
690 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
691 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
692 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
693 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
694 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
695 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400696 case SkBlendMode::kSrcOut:
Brian Salomon31853842017-03-28 16:32:05 -0400697 TEST_ASSERT(!xpi.fIgnoresInputColor);
698 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700699 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
700 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
701 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
702 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
703 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
704 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
705 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400706 case SkBlendMode::kDstOut:
Brian Salomon31853842017-03-28 16:32:05 -0400707 TEST_ASSERT(xpi.fIgnoresInputColor);
708 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700709 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
710 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
711 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
712 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
713 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
714 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
715 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400716 case SkBlendMode::kSrcATop:
Brian Salomon31853842017-03-28 16:32:05 -0400717 TEST_ASSERT(!xpi.fIgnoresInputColor);
718 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700719 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
720 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
721 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
722 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
723 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
724 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
725 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400726 case SkBlendMode::kDstATop:
Brian Salomon31853842017-03-28 16:32:05 -0400727 TEST_ASSERT(!xpi.fIgnoresInputColor);
728 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700729 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
730 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
731 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
732 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
733 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
734 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
735 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400736 case SkBlendMode::kXor:
Brian Salomon31853842017-03-28 16:32:05 -0400737 TEST_ASSERT(!xpi.fIgnoresInputColor);
738 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700739 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
740 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
741 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
742 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
743 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
744 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
745 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400746 case SkBlendMode::kPlus:
Brian Salomon31853842017-03-28 16:32:05 -0400747 TEST_ASSERT(!xpi.fIgnoresInputColor);
748 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700749 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
750 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
751 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
752 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
753 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
754 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
755 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400756 case SkBlendMode::kModulate:
Brian Salomon31853842017-03-28 16:32:05 -0400757 TEST_ASSERT(!xpi.fIgnoresInputColor);
cdalton6fd158e2015-05-27 15:08:33 -0700758 TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType);
759 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
760 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
761 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
762 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
763 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
764 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400765 case SkBlendMode::kScreen:
Brian Salomon31853842017-03-28 16:32:05 -0400766 TEST_ASSERT(!xpi.fIgnoresInputColor);
767 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700768 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
769 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
770 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
771 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
772 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
773 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
774 break;
775 default:
776 ERRORF(reporter, "Invalid xfermode.");
777 break;
778 }
779 }
780}
781
782static void test_color_opaque_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomona811b122017-03-30 08:21:32 -0400783 GrProcessorAnalysisColor inputColor = GrProcessorAnalysisColor::Opaque::kYes;
784 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kNone;
cdalton6fd158e2015-05-27 15:08:33 -0700785
Mike Reed7d954ad2016-10-28 15:42:34 -0400786 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
787 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon31853842017-03-28 16:32:05 -0400788 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
cdalton6fd158e2015-05-27 15:08:33 -0700789
790 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400791 case SkBlendMode::kClear:
Brian Salomon31853842017-03-28 16:32:05 -0400792 TEST_ASSERT(xpi.fIgnoresInputColor);
793 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700794 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
795 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
796 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
797 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
798 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
799 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
800 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400801 case SkBlendMode::kSrc:
Brian Salomon31853842017-03-28 16:32:05 -0400802 TEST_ASSERT(!xpi.fIgnoresInputColor);
803 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700804 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
805 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
806 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
807 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
808 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
809 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
810 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400811 case SkBlendMode::kDst:
Brian Salomon31853842017-03-28 16:32:05 -0400812 TEST_ASSERT(xpi.fIgnoresInputColor);
813 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700814 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
815 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
816 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
817 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
818 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
819 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
820 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400821 case SkBlendMode::kSrcOver:
Brian Salomon28207df2017-06-05 12:25:13 -0400822 // We don't specialize opaque src-over. See note in GrPorterDuffXferProcessor.cpp
Brian Salomon31853842017-03-28 16:32:05 -0400823 TEST_ASSERT(!xpi.fIgnoresInputColor);
Brian Salomon28207df2017-06-05 12:25:13 -0400824 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700825 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
826 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
827 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
828 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
Brian Salomon28207df2017-06-05 12:25:13 -0400829 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
cdalton6fd158e2015-05-27 15:08:33 -0700830 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
831 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400832 case SkBlendMode::kDstOver:
Brian Salomon31853842017-03-28 16:32:05 -0400833 TEST_ASSERT(!xpi.fIgnoresInputColor);
834 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700835 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
836 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
837 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
838 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
839 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
840 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
841 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400842 case SkBlendMode::kSrcIn:
Brian Salomon31853842017-03-28 16:32:05 -0400843 TEST_ASSERT(!xpi.fIgnoresInputColor);
844 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700845 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
846 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
847 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
848 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
849 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
850 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
851 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400852 case SkBlendMode::kDstIn:
Brian Salomon31853842017-03-28 16:32:05 -0400853 TEST_ASSERT(xpi.fIgnoresInputColor);
854 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700855 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
856 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
857 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
858 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
859 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
860 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
861 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400862 case SkBlendMode::kSrcOut:
Brian Salomon31853842017-03-28 16:32:05 -0400863 TEST_ASSERT(!xpi.fIgnoresInputColor);
864 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700865 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
866 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
867 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
868 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
869 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
870 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
871 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400872 case SkBlendMode::kDstOut:
Brian Salomon31853842017-03-28 16:32:05 -0400873 TEST_ASSERT(xpi.fIgnoresInputColor);
874 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700875 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
876 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
877 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
878 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
879 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
880 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
881 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400882 case SkBlendMode::kSrcATop:
Brian Salomon31853842017-03-28 16:32:05 -0400883 TEST_ASSERT(!xpi.fIgnoresInputColor);
884 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700885 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
886 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
887 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
888 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
889 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
890 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
891 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400892 case SkBlendMode::kDstATop:
Brian Salomon31853842017-03-28 16:32:05 -0400893 TEST_ASSERT(!xpi.fIgnoresInputColor);
894 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700895 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
896 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
897 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
898 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
899 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
900 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
901 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400902 case SkBlendMode::kXor:
Brian Salomon31853842017-03-28 16:32:05 -0400903 TEST_ASSERT(!xpi.fIgnoresInputColor);
904 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700905 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
906 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
907 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
908 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
909 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
910 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
911 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400912 case SkBlendMode::kPlus:
Brian Salomon31853842017-03-28 16:32:05 -0400913 TEST_ASSERT(!xpi.fIgnoresInputColor);
914 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700915 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
916 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
917 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
918 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
919 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
920 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
921 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400922 case SkBlendMode::kModulate:
Brian Salomon31853842017-03-28 16:32:05 -0400923 TEST_ASSERT(!xpi.fIgnoresInputColor);
924 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700925 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
926 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
927 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
928 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
929 TEST_ASSERT(kSC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
930 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
931 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400932 case SkBlendMode::kScreen:
Brian Salomon31853842017-03-28 16:32:05 -0400933 TEST_ASSERT(!xpi.fIgnoresInputColor);
934 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700935 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
936 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
937 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
938 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
939 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
940 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
941 break;
942 default:
943 ERRORF(reporter, "Invalid xfermode.");
944 break;
945 }
946 }
947}
948
egdaniel723b0502015-09-15 09:31:40 -0700949static void test_lcd_coverage_fallback_case(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Osman5ced0bf2019-03-15 10:15:29 -0400950 constexpr GrClampType autoClamp = GrClampType::kAuto;
Brian Salomon31853842017-03-28 16:32:05 -0400951 const GrXPFactory* xpf = GrPorterDuffXPFactory::Get(SkBlendMode::kSrcOver);
Brian Osmancf860852018-10-31 14:04:39 -0400952 GrProcessorAnalysisColor color = SkPMColor4f::FromBytes_RGBA(GrColorPackRGBA(123, 45, 67, 255));
Brian Salomona811b122017-03-30 08:21:32 -0400953 GrProcessorAnalysisCoverage coverage = GrProcessorAnalysisCoverage::kLCD;
Brian Osman5ced0bf2019-03-15 10:15:29 -0400954 TEST_ASSERT(!(GrXPFactory::GetAnalysisProperties(xpf, color, coverage, caps, autoClamp) &
Greg Daniel6ebe4b92017-05-19 10:56:46 -0400955 GrXPFactory::AnalysisProperties::kRequiresDstTexture));
956 sk_sp<const GrXferProcessor> xp_opaque(
Brian Osman5ced0bf2019-03-15 10:15:29 -0400957 GrXPFactory::MakeXferProcessor(xpf, color, coverage, false, caps, autoClamp));
Greg Daniel6ebe4b92017-05-19 10:56:46 -0400958 if (!xp_opaque) {
959 ERRORF(reporter, "Failed to create an XP with LCD coverage.");
960 return;
961 }
962
Chris Daltonbbb3f642019-07-24 12:25:08 -0400963 GrXferProcessor::BlendInfo blendInfo = xp_opaque->getBlendInfo();
Greg Daniel6ebe4b92017-05-19 10:56:46 -0400964 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
Chris Daltonbbb3f642019-07-24 12:25:08 -0400978 blendInfo = xp->getBlendInfo();
cdalton6fd158e2015-05-27 15:08:33 -0700979 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 GrProxyProvider* proxyProvider = ctx->priv().proxyProvider();
993 const GrCaps& caps = *ctx->priv().caps();
cdalton6fd158e2015-05-27 15:08:33 -0700994 if (caps.shaderCaps()->dualSourceBlendingSupport()) {
Brian Osman7c597742019-03-26 11:10:11 -0400995 SK_ABORT("Mock context failed to honor request for no ARB_blend_func_extended.");
cdalton6fd158e2015-05-27 15:08:33 -0700996 return;
997 }
998
Robert Phillipsd21b2a52017-12-12 13:01:25 -0500999 GrBackendTexture backendTex =
Robert Phillips4bdd36f2019-06-04 11:03:06 -04001000 ctx->createBackendTexture(100, 100, kRGBA_8888_SkColorType, SkColors::kTransparent,
Robert Phillipsda2e67a2019-07-01 15:04:06 -04001001 GrMipMapped::kNo, GrRenderable::kNo, GrProtected::kNo);
Greg Daniel7ef28f32017-04-20 16:41:55 +00001002
Robert Phillipsbb581ce2017-05-29 15:05:15 -04001003 GrXferProcessor::DstProxy fakeDstProxy;
1004 {
Brian Salomonc67c31c2018-12-06 10:00:03 -05001005 sk_sp<GrTextureProxy> proxy = proxyProvider->wrapBackendTexture(
Robert Phillipsc80b0e92019-07-23 10:27:09 -04001006 backendTex, GrColorType::kRGBA_8888, kTopLeft_GrSurfaceOrigin,
1007 kBorrow_GrWrapOwnership, GrWrapCacheable::kNo, kRead_GrIOType);
Robert Phillipsbb581ce2017-05-29 15:05:15 -04001008 fakeDstProxy.setProxy(std::move(proxy));
1009 }
cdalton6fd158e2015-05-27 15:08:33 -07001010
Brian Salomona811b122017-03-30 08:21:32 -04001011 static const GrProcessorAnalysisColor colorInputs[] = {
1012 GrProcessorAnalysisColor::Opaque::kNo, GrProcessorAnalysisColor::Opaque::kYes,
Brian Osmancf860852018-10-31 14:04:39 -04001013 GrProcessorAnalysisColor(SkPMColor4f::FromBytes_RGBA(GrColorPackRGBA(0, 82, 17, 100))),
1014 GrProcessorAnalysisColor(SkPMColor4f::FromBytes_RGBA(GrColorPackRGBA(0, 82, 17, 255)))};
cdalton6fd158e2015-05-27 15:08:33 -07001015
Brian Salomonc6b71462017-02-14 11:33:01 -05001016 for (const auto& colorInput : colorInputs) {
Brian Salomona811b122017-03-30 08:21:32 -04001017 for (GrProcessorAnalysisCoverage coverageType :
1018 {GrProcessorAnalysisCoverage::kSingleChannel, GrProcessorAnalysisCoverage::kNone}) {
Mike Reed7d954ad2016-10-28 15:42:34 -04001019 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
1020 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomona1633922017-01-09 11:46:10 -05001021 const GrXPFactory* xpf = GrPorterDuffXPFactory::Get(xfermode);
Brian Salomond61c9d92017-04-10 10:54:25 -04001022 sk_sp<const GrXferProcessor> xp(
Brian Osman5ced0bf2019-03-15 10:15:29 -04001023 GrXPFactory::MakeXferProcessor(xpf, colorInput, coverageType, false, caps,
1024 GrClampType::kAuto));
cdalton6fd158e2015-05-27 15:08:33 -07001025 if (!xp) {
1026 ERRORF(reporter, "Failed to create an XP without dual source blending.");
1027 return;
1028 }
1029 TEST_ASSERT(!xp->hasSecondaryOutput());
cdalton6fd158e2015-05-27 15:08:33 -07001030 }
1031 }
1032 }
Robert Phillips5c7a25b2019-05-20 08:38:07 -04001033 ctx->deleteBackendTexture(backendTex);
cdalton6fd158e2015-05-27 15:08:33 -07001034}