blob: 3a8444e24e338f2f489d85452529cd1fa3f60948 [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"
Robert Phillips6d344c32020-07-06 10:56:46 -040012#include "include/gpu/GrDirectContext.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050013#include "src/gpu/GrContextPriv.h"
14#include "src/gpu/GrGpu.h"
15#include "src/gpu/GrProxyProvider.h"
16#include "src/gpu/GrXferProcessor.h"
17#include "src/gpu/effects/GrPorterDuffXferProcessor.h"
18#include "src/gpu/gl/GrGLCaps.h"
19#include "src/gpu/ops/GrMeshDrawOp.h"
Greg Danielc1ad77c2020-05-06 11:40:03 -040020#include "tests/TestUtils.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050021#include "tools/gpu/GrContextFactory.h"
cdalton6fd158e2015-05-27 15:08:33 -070022
23////////////////////////////////////////////////////////////////////////////////
24
25static void test_color_unknown_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps);
Brian Salomon31853842017-03-28 16:32:05 -040026static void test_color_not_opaque_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps);
cdalton6fd158e2015-05-27 15:08:33 -070027static void test_color_opaque_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps);
28static void test_color_opaque_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps);
29static void test_lcd_coverage(skiatest::Reporter* reporter, const GrCaps& caps);
egdaniel723b0502015-09-15 09:31:40 -070030static void test_lcd_coverage_fallback_case(skiatest::Reporter* reporter, const GrCaps& caps);
cdalton6fd158e2015-05-27 15:08:33 -070031
Brian Osmand2ca3122019-03-26 11:31:16 -040032DEF_GPUTEST(GrPorterDuff, reporter, /*ctxInfo*/) {
33 GrMockOptions mockOptions;
34 mockOptions.fDualSourceBlendingSupport = true;
35 auto context = GrContext::MakeMock(&mockOptions, GrContextOptions());
36 const GrCaps& caps = *context->priv().getGpu()->caps();
37
cdalton6fd158e2015-05-27 15:08:33 -070038 if (!caps.shaderCaps()->dualSourceBlendingSupport()) {
Ben Wagnerb4aab9a2017-08-16 10:53:04 -040039 SK_ABORT("Null context does not support dual source blending.");
cdalton6fd158e2015-05-27 15:08:33 -070040 }
41
42 test_color_unknown_with_coverage(reporter, caps);
Brian Salomon31853842017-03-28 16:32:05 -040043 test_color_not_opaque_no_coverage(reporter, caps);
cdalton6fd158e2015-05-27 15:08:33 -070044 test_color_opaque_with_coverage(reporter, caps);
45 test_color_opaque_no_coverage(reporter, caps);
46 test_lcd_coverage(reporter, caps);
egdaniel723b0502015-09-15 09:31:40 -070047 test_lcd_coverage_fallback_case(reporter, caps);
cdalton6fd158e2015-05-27 15:08:33 -070048}
49
50////////////////////////////////////////////////////////////////////////////////
51
52#define TEST_ASSERT(...) REPORTER_ASSERT(reporter, __VA_ARGS__)
53
54enum {
55 kNone_OutputType,
56 kCoverage_OutputType,
57 kModulate_OutputType,
egdaniel723b0502015-09-15 09:31:40 -070058 kSAModulate_OutputType,
cdalton6fd158e2015-05-27 15:08:33 -070059 kISAModulate_OutputType,
60 kISCModulate_OutputType
61};
Greg Daniel79cdf282017-05-22 15:56:22 -040062static const int kInvalid_OutputType = -1;
cdalton6fd158e2015-05-27 15:08:33 -070063
Brian Salomon48d1b4c2017-04-08 07:38:53 -040064static GrProcessorSet::Analysis do_analysis(const GrXPFactory* xpf,
65 const GrProcessorAnalysisColor& colorInput,
66 GrProcessorAnalysisCoverage coverageInput,
67 const GrCaps& caps) {
68 GrPaint paint;
69 paint.setXPFactory(xpf);
70 GrProcessorSet procs(std::move(paint));
Chris Dalton6ce447a2019-06-23 18:07:38 -060071 bool hasMixedSampledCoverage = false;
Brian Osmancf860852018-10-31 14:04:39 -040072 SkPMColor4f overrideColor;
Chris Daltonb8fff0d2019-03-05 10:11:58 -070073 GrProcessorSet::Analysis analysis = procs.finalize(
Chris Dalton6ce447a2019-06-23 18:07:38 -060074 colorInput, coverageInput, nullptr, &GrUserStencilSettings::kUnused,
75 hasMixedSampledCoverage, caps, GrClampType::kAuto, &overrideColor);
Brian Salomon48d1b4c2017-04-08 07:38:53 -040076 return analysis;
77}
78
cdalton6fd158e2015-05-27 15:08:33 -070079class GrPorterDuffTest {
80public:
81 struct XPInfo {
Mike Reed7d954ad2016-10-28 15:42:34 -040082 XPInfo(skiatest::Reporter* reporter, SkBlendMode xfermode, const GrCaps& caps,
Brian Salomona811b122017-03-30 08:21:32 -040083 GrProcessorAnalysisColor inputColor, GrProcessorAnalysisCoverage inputCoverage) {
Brian Salomona1633922017-01-09 11:46:10 -050084 const GrXPFactory* xpf = GrPorterDuffXPFactory::Get(xfermode);
Brian Salomon48d1b4c2017-04-08 07:38:53 -040085
Greg Daniel79cdf282017-05-22 15:56:22 -040086 bool isLCD = GrProcessorAnalysisCoverage::kLCD == inputCoverage;
87
Brian Salomon48d1b4c2017-04-08 07:38:53 -040088 GrProcessorSet::Analysis analysis = do_analysis(xpf, inputColor, inputCoverage, caps);
Brian Salomon31853842017-03-28 16:32:05 -040089 fCompatibleWithCoverageAsAlpha = analysis.isCompatibleWithCoverageAsAlpha();
Brian Salomon48d1b4c2017-04-08 07:38:53 -040090 fIgnoresInputColor = analysis.inputColorIsIgnored();
Brian Salomond61c9d92017-04-10 10:54:25 -040091 sk_sp<const GrXferProcessor> xp(
Brian Osman5ced0bf2019-03-15 10:15:29 -040092 GrXPFactory::MakeXferProcessor(xpf, inputColor, inputCoverage, false, caps,
93 GrClampType::kAuto));
Greg Daniel79cdf282017-05-22 15:56:22 -040094 TEST_ASSERT(!analysis.requiresDstTexture() ||
95 (isLCD &&
96 !caps.shaderCaps()->dstReadInShaderSupport() &&
97 (SkBlendMode::kSrcOver != xfermode ||
98 !inputColor.isOpaque())));
Chris Dalton945ee652019-01-23 09:10:36 -070099 // Porter Duff modes currently only use fixed-function or shader blending, and Ganesh
100 // doesn't yet make use of framebuffer fetches that require a barrier
101 // (e.g., QCOM_shader_framebuffer_fetch_noncoherent). So dst textures and xfer barriers
102 // should always go hand in hand for Porter Duff modes.
103 TEST_ASSERT(analysis.requiresDstTexture() == analysis.requiresNonOverlappingDraws());
Hal Canary342b7ac2016-11-04 11:49:42 -0400104 GetXPOutputTypes(xp.get(), &fPrimaryOutputType, &fSecondaryOutputType);
Chris Daltonbbb3f642019-07-24 12:25:08 -0400105 fBlendInfo = xp->getBlendInfo();
Greg Daniel79cdf282017-05-22 15:56:22 -0400106 TEST_ASSERT(!xp->willReadDstColor() ||
107 (isLCD && (SkBlendMode::kSrcOver != xfermode ||
108 !inputColor.isOpaque())));
cdalton6fd158e2015-05-27 15:08:33 -0700109 TEST_ASSERT(xp->hasSecondaryOutput() == GrBlendCoeffRefsSrc2(fBlendInfo.fDstBlend));
110 }
111
Brian Salomon31853842017-03-28 16:32:05 -0400112 bool fCompatibleWithCoverageAsAlpha;
113 bool fIgnoresInputColor;
cdalton6fd158e2015-05-27 15:08:33 -0700114 int fPrimaryOutputType;
115 int fSecondaryOutputType;
116 GrXferProcessor::BlendInfo fBlendInfo;
117 };
118
119 static void GetXPOutputTypes(const GrXferProcessor* xp, int* outPrimary, int* outSecondary) {
egdanielf2342722015-11-20 15:12:59 -0800120 GrPorterDuffXPFactory::TestGetXPOutputTypes(xp, outPrimary, outSecondary);
cdalton6fd158e2015-05-27 15:08:33 -0700121 }
122};
123
egdaniel723b0502015-09-15 09:31:40 -0700124static void test_lcd_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Greg Daniel6ebe4b92017-05-19 10:56:46 -0400125 GrProcessorAnalysisColor inputColor = GrProcessorAnalysisColor::Opaque::kYes;
Brian Salomona811b122017-03-30 08:21:32 -0400126 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kLCD;
egdaniel723b0502015-09-15 09:31:40 -0700127
Mike Reed7d954ad2016-10-28 15:42:34 -0400128 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
129 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon31853842017-03-28 16:32:05 -0400130 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
egdaniel723b0502015-09-15 09:31:40 -0700131 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400132 case SkBlendMode::kClear:
Brian Salomon31853842017-03-28 16:32:05 -0400133 TEST_ASSERT(xpi.fIgnoresInputColor);
134 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400135 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
136 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
137 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
138 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
139 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700140 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
141 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400142 case SkBlendMode::kSrc:
Brian Salomon31853842017-03-28 16:32:05 -0400143 TEST_ASSERT(!xpi.fIgnoresInputColor);
144 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400145 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
146 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700147 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
148 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
Greg Daniel79cdf282017-05-22 15:56:22 -0400149 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700150 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
151 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400152 case SkBlendMode::kDst:
Brian Salomon31853842017-03-28 16:32:05 -0400153 TEST_ASSERT(xpi.fIgnoresInputColor);
154 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400155 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
156 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700157 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400158 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
159 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
160 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
egdaniel723b0502015-09-15 09:31:40 -0700161 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400162 case SkBlendMode::kSrcOver:
Brian Salomon31853842017-03-28 16:32:05 -0400163 TEST_ASSERT(!xpi.fIgnoresInputColor);
164 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
egdaniel723b0502015-09-15 09:31:40 -0700165 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
166 TEST_ASSERT(kSAModulate_OutputType == xpi.fSecondaryOutputType);
167 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
168 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
169 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
170 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
171 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400172 case SkBlendMode::kDstOver:
Brian Salomon31853842017-03-28 16:32:05 -0400173 TEST_ASSERT(!xpi.fIgnoresInputColor);
174 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400175 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
176 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700177 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400178 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
179 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700180 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
181 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400182 case SkBlendMode::kSrcIn:
Brian Salomon31853842017-03-28 16:32:05 -0400183 TEST_ASSERT(!xpi.fIgnoresInputColor);
184 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400185 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
186 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700187 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400188 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
189 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700190 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
191 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400192 case SkBlendMode::kDstIn:
Brian Salomon31853842017-03-28 16:32:05 -0400193 TEST_ASSERT(!xpi.fIgnoresInputColor);
194 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400195 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
196 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
197 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
198 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
199 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700200 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
201 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400202 case SkBlendMode::kSrcOut:
Brian Salomon31853842017-03-28 16:32:05 -0400203 TEST_ASSERT(!xpi.fIgnoresInputColor);
204 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400205 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
206 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700207 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400208 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
209 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700210 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
211 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400212 case SkBlendMode::kDstOut:
Brian Salomon31853842017-03-28 16:32:05 -0400213 TEST_ASSERT(!xpi.fIgnoresInputColor);
214 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400215 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
216 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700217 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400218 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
219 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700220 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
221 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400222 case SkBlendMode::kSrcATop:
Brian Salomon31853842017-03-28 16:32:05 -0400223 TEST_ASSERT(!xpi.fIgnoresInputColor);
224 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400225 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
226 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700227 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400228 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
229 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700230 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
231 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400232 case SkBlendMode::kDstATop:
Brian Salomon31853842017-03-28 16:32:05 -0400233 TEST_ASSERT(!xpi.fIgnoresInputColor);
234 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400235 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
236 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700237 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400238 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
239 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700240 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
241 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400242 case SkBlendMode::kXor:
Brian Salomon31853842017-03-28 16:32:05 -0400243 TEST_ASSERT(!xpi.fIgnoresInputColor);
244 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400245 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
246 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700247 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400248 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
249 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700250 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
251 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400252 case SkBlendMode::kPlus:
Brian Salomon31853842017-03-28 16:32:05 -0400253 TEST_ASSERT(!xpi.fIgnoresInputColor);
254 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400255 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
256 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700257 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
258 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
Greg Daniel79cdf282017-05-22 15:56:22 -0400259 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700260 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
261 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400262 case SkBlendMode::kModulate:
Brian Salomon31853842017-03-28 16:32:05 -0400263 TEST_ASSERT(!xpi.fIgnoresInputColor);
264 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400265 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
266 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
267 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
268 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
269 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700270 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
271 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400272 case SkBlendMode::kScreen:
Brian Salomon31853842017-03-28 16:32:05 -0400273 TEST_ASSERT(!xpi.fIgnoresInputColor);
274 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400275 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
276 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700277 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
278 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
Greg Daniel79cdf282017-05-22 15:56:22 -0400279 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700280 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
281 break;
282 default:
283 ERRORF(reporter, "Invalid xfermode.");
284 break;
285 }
286 }
287}
cdalton6fd158e2015-05-27 15:08:33 -0700288static void test_color_unknown_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomona811b122017-03-30 08:21:32 -0400289 GrProcessorAnalysisColor inputColor = GrProcessorAnalysisColor::Opaque::kNo;
290 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kSingleChannel;
cdalton6fd158e2015-05-27 15:08:33 -0700291
Mike Reed7d954ad2016-10-28 15:42:34 -0400292 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
293 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon31853842017-03-28 16:32:05 -0400294 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
cdalton6fd158e2015-05-27 15:08:33 -0700295 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400296 case SkBlendMode::kClear:
Brian Salomon31853842017-03-28 16:32:05 -0400297 TEST_ASSERT(xpi.fIgnoresInputColor);
298 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700299 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
300 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
301 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
302 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
303 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
304 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
305 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400306 case SkBlendMode::kSrc:
Brian Salomon31853842017-03-28 16:32:05 -0400307 TEST_ASSERT(!xpi.fIgnoresInputColor);
308 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700309 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
310 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
311 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
312 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
313 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
314 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
315 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400316 case SkBlendMode::kDst:
Brian Salomon31853842017-03-28 16:32:05 -0400317 TEST_ASSERT(xpi.fIgnoresInputColor);
318 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700319 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
320 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
321 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
322 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
323 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
324 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
325 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400326 case SkBlendMode::kSrcOver:
Brian Salomon31853842017-03-28 16:32:05 -0400327 TEST_ASSERT(!xpi.fIgnoresInputColor);
328 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700329 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
330 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
331 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
332 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
333 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
334 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
335 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400336 case SkBlendMode::kDstOver:
Brian Salomon31853842017-03-28 16:32:05 -0400337 TEST_ASSERT(!xpi.fIgnoresInputColor);
338 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700339 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
340 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
341 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
342 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
343 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
344 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
345 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400346 case SkBlendMode::kSrcIn:
Brian Salomon31853842017-03-28 16:32:05 -0400347 TEST_ASSERT(!xpi.fIgnoresInputColor);
348 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700349 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
350 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
351 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
352 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
353 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
354 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
355 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400356 case SkBlendMode::kDstIn:
Brian Salomon31853842017-03-28 16:32:05 -0400357 TEST_ASSERT(!xpi.fIgnoresInputColor);
358 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700359 TEST_ASSERT(kISAModulate_OutputType == xpi.fPrimaryOutputType);
360 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
361 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
362 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
363 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
364 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
365 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400366 case SkBlendMode::kSrcOut:
Brian Salomon31853842017-03-28 16:32:05 -0400367 TEST_ASSERT(!xpi.fIgnoresInputColor);
368 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700369 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
370 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
371 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
372 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
373 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
374 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
375 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400376 case SkBlendMode::kDstOut:
Brian Salomon31853842017-03-28 16:32:05 -0400377 TEST_ASSERT(!xpi.fIgnoresInputColor);
378 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700379 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
380 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
381 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
382 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
383 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
384 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
385 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400386 case SkBlendMode::kSrcATop:
Brian Salomon31853842017-03-28 16:32:05 -0400387 TEST_ASSERT(!xpi.fIgnoresInputColor);
388 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700389 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
390 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
391 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
392 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
393 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
394 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
395 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400396 case SkBlendMode::kDstATop:
Brian Salomon31853842017-03-28 16:32:05 -0400397 TEST_ASSERT(!xpi.fIgnoresInputColor);
398 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700399 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
400 TEST_ASSERT(kISAModulate_OutputType == xpi.fSecondaryOutputType);
401 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
402 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
403 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
404 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
405 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400406 case SkBlendMode::kXor:
Brian Salomon31853842017-03-28 16:32:05 -0400407 TEST_ASSERT(!xpi.fIgnoresInputColor);
408 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700409 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
410 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
411 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
412 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
413 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
414 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
415 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400416 case SkBlendMode::kPlus:
Brian Salomon31853842017-03-28 16:32:05 -0400417 TEST_ASSERT(!xpi.fIgnoresInputColor);
418 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700419 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
420 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
421 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
422 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
423 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
424 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
425 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400426 case SkBlendMode::kModulate:
Brian Salomon31853842017-03-28 16:32:05 -0400427 TEST_ASSERT(!xpi.fIgnoresInputColor);
428 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700429 TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType);
430 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
431 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
432 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
433 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
434 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
435 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400436 case SkBlendMode::kScreen:
Brian Salomon31853842017-03-28 16:32:05 -0400437 TEST_ASSERT(!xpi.fIgnoresInputColor);
438 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700439 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
440 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
441 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
442 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
443 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
444 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
445 break;
446 default:
447 ERRORF(reporter, "Invalid xfermode.");
448 break;
449 }
450 }
451}
452
Brian Salomon31853842017-03-28 16:32:05 -0400453static void test_color_not_opaque_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Osmancf860852018-10-31 14:04:39 -0400454 GrProcessorAnalysisColor inputColor(
455 SkPMColor4f::FromBytes_RGBA(GrColorPackRGBA(229, 0, 154, 240)));
Brian Salomona811b122017-03-30 08:21:32 -0400456 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kNone;
cdalton6fd158e2015-05-27 15:08:33 -0700457
Mike Reed7d954ad2016-10-28 15:42:34 -0400458 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
459 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon31853842017-03-28 16:32:05 -0400460 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
cdalton6fd158e2015-05-27 15:08:33 -0700461 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400462 case SkBlendMode::kClear:
Brian Salomon31853842017-03-28 16:32:05 -0400463 TEST_ASSERT(xpi.fIgnoresInputColor);
Greg Danielc5296812020-02-28 13:06:02 -0500464 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700465 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
466 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
467 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
468 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
469 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
470 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
471 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400472 case SkBlendMode::kSrc:
Brian Salomon31853842017-03-28 16:32:05 -0400473 TEST_ASSERT(!xpi.fIgnoresInputColor);
Greg Danielc5296812020-02-28 13:06:02 -0500474 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700475 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
476 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
477 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
478 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
479 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
480 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
481 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400482 case SkBlendMode::kDst:
Brian Salomon31853842017-03-28 16:32:05 -0400483 TEST_ASSERT(xpi.fIgnoresInputColor);
484 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700485 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
486 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
487 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
488 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
489 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
490 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
491 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400492 case SkBlendMode::kSrcOver:
Brian Salomon31853842017-03-28 16:32:05 -0400493 TEST_ASSERT(!xpi.fIgnoresInputColor);
494 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700495 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
496 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
497 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
498 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
499 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
500 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
501 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400502 case SkBlendMode::kDstOver:
Brian Salomon31853842017-03-28 16:32:05 -0400503 TEST_ASSERT(!xpi.fIgnoresInputColor);
504 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700505 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
506 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
507 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
508 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
509 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
510 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
511 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400512 case SkBlendMode::kSrcIn:
Brian Salomon31853842017-03-28 16:32:05 -0400513 TEST_ASSERT(!xpi.fIgnoresInputColor);
Greg Danielc5296812020-02-28 13:06:02 -0500514 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700515 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
516 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
517 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
518 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
519 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
520 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
521 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400522 case SkBlendMode::kDstIn:
Brian Salomon31853842017-03-28 16:32:05 -0400523 TEST_ASSERT(!xpi.fIgnoresInputColor);
Greg Danielc5296812020-02-28 13:06:02 -0500524 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700525 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
526 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
527 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
528 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
529 TEST_ASSERT(kSA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
530 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
531 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400532 case SkBlendMode::kSrcOut:
Brian Salomon31853842017-03-28 16:32:05 -0400533 TEST_ASSERT(!xpi.fIgnoresInputColor);
Greg Danielc5296812020-02-28 13:06:02 -0500534 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700535 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
536 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
537 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
538 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
539 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
540 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
541 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400542 case SkBlendMode::kDstOut:
Brian Salomon31853842017-03-28 16:32:05 -0400543 TEST_ASSERT(!xpi.fIgnoresInputColor);
544 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700545 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
546 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
547 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
548 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
549 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
550 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
551 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400552 case SkBlendMode::kSrcATop:
Brian Salomon31853842017-03-28 16:32:05 -0400553 TEST_ASSERT(!xpi.fIgnoresInputColor);
554 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700555 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
556 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
557 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
558 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
559 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
560 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
561 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400562 case SkBlendMode::kDstATop:
Brian Salomon31853842017-03-28 16:32:05 -0400563 TEST_ASSERT(!xpi.fIgnoresInputColor);
Greg Danielc5296812020-02-28 13:06:02 -0500564 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700565 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
566 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
567 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
568 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
569 TEST_ASSERT(kSA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
570 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
571 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400572 case SkBlendMode::kXor:
Brian Salomon31853842017-03-28 16:32:05 -0400573 TEST_ASSERT(!xpi.fIgnoresInputColor);
574 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700575 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
576 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
577 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
578 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
579 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
580 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
581 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400582 case SkBlendMode::kPlus:
Brian Salomon31853842017-03-28 16:32:05 -0400583 TEST_ASSERT(!xpi.fIgnoresInputColor);
584 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700585 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
586 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
587 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
588 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
589 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
590 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
591 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400592 case SkBlendMode::kModulate:
Brian Salomon31853842017-03-28 16:32:05 -0400593 TEST_ASSERT(!xpi.fIgnoresInputColor);
Greg Danielc5296812020-02-28 13:06:02 -0500594 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700595 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
596 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
597 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
598 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
599 TEST_ASSERT(kSC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
600 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
601 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400602 case SkBlendMode::kScreen:
Brian Salomon31853842017-03-28 16:32:05 -0400603 TEST_ASSERT(!xpi.fIgnoresInputColor);
604 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700605 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
606 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
607 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
608 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
609 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
610 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
611 break;
612 default:
613 ERRORF(reporter, "Invalid xfermode.");
614 break;
615 }
616 }
617}
618
619static void test_color_opaque_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomona811b122017-03-30 08:21:32 -0400620 GrProcessorAnalysisColor inputColor = GrProcessorAnalysisColor::Opaque::kYes;
621 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kSingleChannel;
cdalton6fd158e2015-05-27 15:08:33 -0700622
Mike Reed7d954ad2016-10-28 15:42:34 -0400623 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
624 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon31853842017-03-28 16:32:05 -0400625 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
cdalton6fd158e2015-05-27 15:08:33 -0700626 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400627 case SkBlendMode::kClear:
Brian Salomon31853842017-03-28 16:32:05 -0400628 TEST_ASSERT(xpi.fIgnoresInputColor);
629 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700630 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
631 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
632 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
633 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
634 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
635 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
636 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400637 case SkBlendMode::kSrc:
Brian Salomon31853842017-03-28 16:32:05 -0400638 TEST_ASSERT(!xpi.fIgnoresInputColor);
639 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700640 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
641 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
642 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
643 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
644 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
645 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
646 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400647 case SkBlendMode::kDst:
Brian Salomon31853842017-03-28 16:32:05 -0400648 TEST_ASSERT(xpi.fIgnoresInputColor);
649 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700650 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
651 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
652 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
653 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
654 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
655 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
656 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400657 case SkBlendMode::kSrcOver:
Brian Salomon31853842017-03-28 16:32:05 -0400658 TEST_ASSERT(!xpi.fIgnoresInputColor);
659 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700660 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
661 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
662 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
663 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
664 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
665 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
666 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400667 case SkBlendMode::kDstOver:
Brian Salomon31853842017-03-28 16:32:05 -0400668 TEST_ASSERT(!xpi.fIgnoresInputColor);
669 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700670 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
671 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
672 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
673 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
674 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
675 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
676 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400677 case SkBlendMode::kSrcIn:
Brian Salomon31853842017-03-28 16:32:05 -0400678 TEST_ASSERT(!xpi.fIgnoresInputColor);
679 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700680 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
681 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
682 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
683 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
684 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
685 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
686 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400687 case SkBlendMode::kDstIn:
Brian Salomon31853842017-03-28 16:32:05 -0400688 TEST_ASSERT(xpi.fIgnoresInputColor);
689 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700690 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
691 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
692 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
693 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
694 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
695 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
696 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400697 case SkBlendMode::kSrcOut:
Brian Salomon31853842017-03-28 16:32:05 -0400698 TEST_ASSERT(!xpi.fIgnoresInputColor);
699 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700700 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
701 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
702 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
703 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
704 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
705 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
706 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400707 case SkBlendMode::kDstOut:
Brian Salomon31853842017-03-28 16:32:05 -0400708 TEST_ASSERT(xpi.fIgnoresInputColor);
709 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700710 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
711 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
712 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
713 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
714 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
715 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
716 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400717 case SkBlendMode::kSrcATop:
Brian Salomon31853842017-03-28 16:32:05 -0400718 TEST_ASSERT(!xpi.fIgnoresInputColor);
719 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700720 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
721 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
722 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
723 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
724 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
725 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
726 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400727 case SkBlendMode::kDstATop:
Brian Salomon31853842017-03-28 16:32:05 -0400728 TEST_ASSERT(!xpi.fIgnoresInputColor);
729 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700730 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
731 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
732 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
733 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
734 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
735 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
736 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400737 case SkBlendMode::kXor:
Brian Salomon31853842017-03-28 16:32:05 -0400738 TEST_ASSERT(!xpi.fIgnoresInputColor);
739 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700740 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
741 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
742 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
743 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
744 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
745 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
746 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400747 case SkBlendMode::kPlus:
Brian Salomon31853842017-03-28 16:32:05 -0400748 TEST_ASSERT(!xpi.fIgnoresInputColor);
749 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700750 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
751 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
752 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
753 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
754 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
755 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
756 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400757 case SkBlendMode::kModulate:
Brian Salomon31853842017-03-28 16:32:05 -0400758 TEST_ASSERT(!xpi.fIgnoresInputColor);
cdalton6fd158e2015-05-27 15:08:33 -0700759 TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType);
760 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
761 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
762 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
763 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
764 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
765 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400766 case SkBlendMode::kScreen:
Brian Salomon31853842017-03-28 16:32:05 -0400767 TEST_ASSERT(!xpi.fIgnoresInputColor);
768 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700769 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
770 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
771 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
772 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
773 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
774 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
775 break;
776 default:
777 ERRORF(reporter, "Invalid xfermode.");
778 break;
779 }
780 }
781}
782
783static void test_color_opaque_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomona811b122017-03-30 08:21:32 -0400784 GrProcessorAnalysisColor inputColor = GrProcessorAnalysisColor::Opaque::kYes;
785 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kNone;
cdalton6fd158e2015-05-27 15:08:33 -0700786
Mike Reed7d954ad2016-10-28 15:42:34 -0400787 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
788 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon31853842017-03-28 16:32:05 -0400789 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
cdalton6fd158e2015-05-27 15:08:33 -0700790
791 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400792 case SkBlendMode::kClear:
Brian Salomon31853842017-03-28 16:32:05 -0400793 TEST_ASSERT(xpi.fIgnoresInputColor);
Greg Danielc5296812020-02-28 13:06:02 -0500794 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700795 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
796 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
797 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
798 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
799 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
800 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
801 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400802 case SkBlendMode::kSrc:
Brian Salomon31853842017-03-28 16:32:05 -0400803 TEST_ASSERT(!xpi.fIgnoresInputColor);
Greg Danielc5296812020-02-28 13:06:02 -0500804 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700805 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
806 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
807 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
808 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
809 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
810 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
811 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400812 case SkBlendMode::kDst:
Brian Salomon31853842017-03-28 16:32:05 -0400813 TEST_ASSERT(xpi.fIgnoresInputColor);
814 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700815 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
816 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
817 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
818 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
819 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
820 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
821 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400822 case SkBlendMode::kSrcOver:
Brian Salomon28207df2017-06-05 12:25:13 -0400823 // We don't specialize opaque src-over. See note in GrPorterDuffXferProcessor.cpp
Brian Salomon31853842017-03-28 16:32:05 -0400824 TEST_ASSERT(!xpi.fIgnoresInputColor);
Brian Salomon28207df2017-06-05 12:25:13 -0400825 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700826 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
827 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
828 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
829 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
Greg Danielf6d60d32020-01-08 13:39:16 -0500830 if (caps.shouldCollapseSrcOverToSrcWhenAble()) {
831 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
832 } else {
833 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
834 }
cdalton6fd158e2015-05-27 15:08:33 -0700835 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
836 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400837 case SkBlendMode::kDstOver:
Brian Salomon31853842017-03-28 16:32:05 -0400838 TEST_ASSERT(!xpi.fIgnoresInputColor);
839 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700840 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
841 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
842 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
843 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
844 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
845 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
846 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400847 case SkBlendMode::kSrcIn:
Brian Salomon31853842017-03-28 16:32:05 -0400848 TEST_ASSERT(!xpi.fIgnoresInputColor);
Greg Danielc5296812020-02-28 13:06:02 -0500849 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700850 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
851 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
852 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
853 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
854 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
855 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
856 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400857 case SkBlendMode::kDstIn:
Brian Salomon31853842017-03-28 16:32:05 -0400858 TEST_ASSERT(xpi.fIgnoresInputColor);
859 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700860 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
861 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
862 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
863 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
864 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
865 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
866 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400867 case SkBlendMode::kSrcOut:
Brian Salomon31853842017-03-28 16:32:05 -0400868 TEST_ASSERT(!xpi.fIgnoresInputColor);
Greg Danielc5296812020-02-28 13:06:02 -0500869 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700870 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
871 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
872 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
873 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
874 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
875 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
876 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400877 case SkBlendMode::kDstOut:
Brian Salomon31853842017-03-28 16:32:05 -0400878 TEST_ASSERT(xpi.fIgnoresInputColor);
Greg Danielc5296812020-02-28 13:06:02 -0500879 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700880 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
881 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
882 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
883 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
884 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
885 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
886 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400887 case SkBlendMode::kSrcATop:
Brian Salomon31853842017-03-28 16:32:05 -0400888 TEST_ASSERT(!xpi.fIgnoresInputColor);
Greg Danielc5296812020-02-28 13:06:02 -0500889 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700890 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
891 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
892 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
893 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
894 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
895 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
896 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400897 case SkBlendMode::kDstATop:
Brian Salomon31853842017-03-28 16:32:05 -0400898 TEST_ASSERT(!xpi.fIgnoresInputColor);
899 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700900 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
901 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
902 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
903 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
904 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
905 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
906 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400907 case SkBlendMode::kXor:
Brian Salomon31853842017-03-28 16:32:05 -0400908 TEST_ASSERT(!xpi.fIgnoresInputColor);
Greg Danielc5296812020-02-28 13:06:02 -0500909 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700910 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
911 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
912 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
913 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
914 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
915 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
916 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400917 case SkBlendMode::kPlus:
Brian Salomon31853842017-03-28 16:32:05 -0400918 TEST_ASSERT(!xpi.fIgnoresInputColor);
919 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700920 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
921 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
922 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
923 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
924 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
925 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
926 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400927 case SkBlendMode::kModulate:
Brian Salomon31853842017-03-28 16:32:05 -0400928 TEST_ASSERT(!xpi.fIgnoresInputColor);
Greg Danielc5296812020-02-28 13:06:02 -0500929 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700930 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
931 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
932 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
933 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
934 TEST_ASSERT(kSC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
935 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
936 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400937 case SkBlendMode::kScreen:
Brian Salomon31853842017-03-28 16:32:05 -0400938 TEST_ASSERT(!xpi.fIgnoresInputColor);
939 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700940 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
941 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
942 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
943 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
944 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
945 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
946 break;
947 default:
948 ERRORF(reporter, "Invalid xfermode.");
949 break;
950 }
951 }
952}
953
egdaniel723b0502015-09-15 09:31:40 -0700954static void test_lcd_coverage_fallback_case(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Osman5ced0bf2019-03-15 10:15:29 -0400955 constexpr GrClampType autoClamp = GrClampType::kAuto;
Brian Salomon31853842017-03-28 16:32:05 -0400956 const GrXPFactory* xpf = GrPorterDuffXPFactory::Get(SkBlendMode::kSrcOver);
Brian Osmancf860852018-10-31 14:04:39 -0400957 GrProcessorAnalysisColor color = SkPMColor4f::FromBytes_RGBA(GrColorPackRGBA(123, 45, 67, 255));
Brian Salomona811b122017-03-30 08:21:32 -0400958 GrProcessorAnalysisCoverage coverage = GrProcessorAnalysisCoverage::kLCD;
Brian Osman5ced0bf2019-03-15 10:15:29 -0400959 TEST_ASSERT(!(GrXPFactory::GetAnalysisProperties(xpf, color, coverage, caps, autoClamp) &
Greg Daniel6ebe4b92017-05-19 10:56:46 -0400960 GrXPFactory::AnalysisProperties::kRequiresDstTexture));
961 sk_sp<const GrXferProcessor> xp_opaque(
Brian Osman5ced0bf2019-03-15 10:15:29 -0400962 GrXPFactory::MakeXferProcessor(xpf, color, coverage, false, caps, autoClamp));
Greg Daniel6ebe4b92017-05-19 10:56:46 -0400963 if (!xp_opaque) {
964 ERRORF(reporter, "Failed to create an XP with LCD coverage.");
965 return;
966 }
967
Chris Daltonbbb3f642019-07-24 12:25:08 -0400968 GrXferProcessor::BlendInfo blendInfo = xp_opaque->getBlendInfo();
Greg Daniel6ebe4b92017-05-19 10:56:46 -0400969 TEST_ASSERT(blendInfo.fWriteColor);
970
971 // Test with non-opaque alpha
Brian Osmancf860852018-10-31 14:04:39 -0400972 color = SkPMColor4f::FromBytes_RGBA(GrColorPackRGBA(123, 45, 67, 221));
Greg Daniel6ebe4b92017-05-19 10:56:46 -0400973 coverage = GrProcessorAnalysisCoverage::kLCD;
Brian Osman5ced0bf2019-03-15 10:15:29 -0400974 TEST_ASSERT(!(GrXPFactory::GetAnalysisProperties(xpf, color, coverage, caps, autoClamp) &
Greg Danield7b11592017-06-14 13:37:12 -0400975 GrXPFactory::AnalysisProperties::kRequiresDstTexture));
Brian Salomond61c9d92017-04-10 10:54:25 -0400976 sk_sp<const GrXferProcessor> xp(
Brian Osman5ced0bf2019-03-15 10:15:29 -0400977 GrXPFactory::MakeXferProcessor(xpf, color, coverage, false, caps, autoClamp));
cdalton6fd158e2015-05-27 15:08:33 -0700978 if (!xp) {
979 ERRORF(reporter, "Failed to create an XP with LCD coverage.");
980 return;
981 }
982
Chris Daltonbbb3f642019-07-24 12:25:08 -0400983 blendInfo = xp->getBlendInfo();
cdalton6fd158e2015-05-27 15:08:33 -0700984 TEST_ASSERT(blendInfo.fWriteColor);
985}
986
Brian Salomondcfca432017-11-15 15:48:03 -0500987DEF_GPUTEST(PorterDuffNoDualSourceBlending, reporter, options) {
988 GrContextOptions opts = options;
cdalton6fd158e2015-05-27 15:08:33 -0700989 opts.fSuppressDualSourceBlending = true;
bsalomon3724e572016-03-30 18:56:19 -0700990 sk_gpu_test::GrContextFactory mockFactory(opts);
Robert Phillips6d344c32020-07-06 10:56:46 -0400991 auto ctx = mockFactory.get(sk_gpu_test::GrContextFactory::kMock_ContextType);
cdalton6fd158e2015-05-27 15:08:33 -0700992 if (!ctx) {
Brian Osman7c597742019-03-26 11:10:11 -0400993 SK_ABORT("Failed to create mock context without ARB_blend_func_extended.");
cdalton6fd158e2015-05-27 15:08:33 -0700994 }
995
Robert Phillips9da87e02019-02-04 13:26:26 -0500996 GrProxyProvider* proxyProvider = ctx->priv().proxyProvider();
997 const GrCaps& caps = *ctx->priv().caps();
cdalton6fd158e2015-05-27 15:08:33 -0700998 if (caps.shaderCaps()->dualSourceBlendingSupport()) {
Brian Osman7c597742019-03-26 11:10:11 -0400999 SK_ABORT("Mock context failed to honor request for no ARB_blend_func_extended.");
cdalton6fd158e2015-05-27 15:08:33 -07001000 }
1001
Greg Danielc1ad77c2020-05-06 11:40:03 -04001002 GrBackendTexture backendTex;
1003 CreateBackendTexture(ctx, &backendTex, 100, 100, kRGBA_8888_SkColorType,
1004 SkColors::kTransparent, GrMipMapped::kNo, GrRenderable::kNo);
Greg Daniel7ef28f32017-04-20 16:41:55 +00001005
Greg Daniel524e28b2019-11-01 11:48:53 -04001006 GrXferProcessor::DstProxyView fakeDstProxyView;
Robert Phillipsbb581ce2017-05-29 15:05:15 -04001007 {
Brian Salomonc67c31c2018-12-06 10:00:03 -05001008 sk_sp<GrTextureProxy> proxy = proxyProvider->wrapBackendTexture(
Brian Salomon8a78e9c2020-03-27 10:42:15 -04001009 backendTex, kBorrow_GrWrapOwnership, GrWrapCacheable::kNo, kRead_GrIOType);
Greg Daniel14b57212019-12-17 16:18:06 -05001010 GrSwizzle swizzle = caps.getReadSwizzle(backendTex.getBackendFormat(),
Greg Daniel524e28b2019-11-01 11:48:53 -04001011 GrColorType::kRGBA_8888);
1012 fakeDstProxyView.setProxyView({std::move(proxy), kTopLeft_GrSurfaceOrigin, swizzle});
Robert Phillipsbb581ce2017-05-29 15:05:15 -04001013 }
cdalton6fd158e2015-05-27 15:08:33 -07001014
Brian Salomona811b122017-03-30 08:21:32 -04001015 static const GrProcessorAnalysisColor colorInputs[] = {
1016 GrProcessorAnalysisColor::Opaque::kNo, GrProcessorAnalysisColor::Opaque::kYes,
Brian Osmancf860852018-10-31 14:04:39 -04001017 GrProcessorAnalysisColor(SkPMColor4f::FromBytes_RGBA(GrColorPackRGBA(0, 82, 17, 100))),
1018 GrProcessorAnalysisColor(SkPMColor4f::FromBytes_RGBA(GrColorPackRGBA(0, 82, 17, 255)))};
cdalton6fd158e2015-05-27 15:08:33 -07001019
Brian Salomonc6b71462017-02-14 11:33:01 -05001020 for (const auto& colorInput : colorInputs) {
Brian Salomona811b122017-03-30 08:21:32 -04001021 for (GrProcessorAnalysisCoverage coverageType :
1022 {GrProcessorAnalysisCoverage::kSingleChannel, GrProcessorAnalysisCoverage::kNone}) {
Mike Reed7d954ad2016-10-28 15:42:34 -04001023 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
1024 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomona1633922017-01-09 11:46:10 -05001025 const GrXPFactory* xpf = GrPorterDuffXPFactory::Get(xfermode);
Brian Salomond61c9d92017-04-10 10:54:25 -04001026 sk_sp<const GrXferProcessor> xp(
Brian Osman5ced0bf2019-03-15 10:15:29 -04001027 GrXPFactory::MakeXferProcessor(xpf, colorInput, coverageType, false, caps,
1028 GrClampType::kAuto));
cdalton6fd158e2015-05-27 15:08:33 -07001029 if (!xp) {
1030 ERRORF(reporter, "Failed to create an XP without dual source blending.");
1031 return;
1032 }
1033 TEST_ASSERT(!xp->hasSecondaryOutput());
cdalton6fd158e2015-05-27 15:08:33 -07001034 }
1035 }
1036 }
Robert Phillips5c7a25b2019-05-20 08:38:07 -04001037 ctx->deleteBackendTexture(backendTex);
cdalton6fd158e2015-05-27 15:08:33 -07001038}