blob: d82339d928d7f23d425ffa1063a5b99e4a1dd632 [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"
Adlai Hollera0693042020-10-14 11:23:11 -040013#include "src/gpu/GrDirectContextPriv.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050014#include "src/gpu/GrGpu.h"
15#include "src/gpu/GrProxyProvider.h"
16#include "src/gpu/GrXferProcessor.h"
17#include "src/gpu/effects/GrPorterDuffXferProcessor.h"
18#include "src/gpu/gl/GrGLCaps.h"
19#include "src/gpu/ops/GrMeshDrawOp.h"
20#include "tools/gpu/GrContextFactory.h"
Brian Salomon72050802020-10-12 20:45:06 -040021#include "tools/gpu/ManagedBackendTexture.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;
Robert Phillipsf4f80112020-07-13 16:13:31 -040035 sk_sp<GrDirectContext> context = GrDirectContext::MakeMock(&mockOptions, GrContextOptions());
Brian Osmand2ca3122019-03-26 11:31:16 -040036 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();
Chris Daltonf2fb80f2020-12-03 12:37:59 -070090 fUnaffectedByDstValue = analysis.unaffectedByDstValue();
Brian Salomon48d1b4c2017-04-08 07:38:53 -040091 fIgnoresInputColor = analysis.inputColorIsIgnored();
Brian Salomond61c9d92017-04-10 10:54:25 -040092 sk_sp<const GrXferProcessor> xp(
Brian Osman5ced0bf2019-03-15 10:15:29 -040093 GrXPFactory::MakeXferProcessor(xpf, inputColor, inputCoverage, false, caps,
94 GrClampType::kAuto));
Greg Daniel79cdf282017-05-22 15:56:22 -040095 TEST_ASSERT(!analysis.requiresDstTexture() ||
96 (isLCD &&
97 !caps.shaderCaps()->dstReadInShaderSupport() &&
98 (SkBlendMode::kSrcOver != xfermode ||
99 !inputColor.isOpaque())));
Chris Dalton945ee652019-01-23 09:10:36 -0700100 // Porter Duff modes currently only use fixed-function or shader blending, and Ganesh
101 // doesn't yet make use of framebuffer fetches that require a barrier
102 // (e.g., QCOM_shader_framebuffer_fetch_noncoherent). So dst textures and xfer barriers
103 // should always go hand in hand for Porter Duff modes.
104 TEST_ASSERT(analysis.requiresDstTexture() == analysis.requiresNonOverlappingDraws());
Hal Canary342b7ac2016-11-04 11:49:42 -0400105 GetXPOutputTypes(xp.get(), &fPrimaryOutputType, &fSecondaryOutputType);
Chris Daltonbbb3f642019-07-24 12:25:08 -0400106 fBlendInfo = xp->getBlendInfo();
Greg Daniel79cdf282017-05-22 15:56:22 -0400107 TEST_ASSERT(!xp->willReadDstColor() ||
108 (isLCD && (SkBlendMode::kSrcOver != xfermode ||
109 !inputColor.isOpaque())));
cdalton6fd158e2015-05-27 15:08:33 -0700110 TEST_ASSERT(xp->hasSecondaryOutput() == GrBlendCoeffRefsSrc2(fBlendInfo.fDstBlend));
111 }
112
Brian Salomon31853842017-03-28 16:32:05 -0400113 bool fCompatibleWithCoverageAsAlpha;
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700114 bool fUnaffectedByDstValue;
Brian Salomon31853842017-03-28 16:32:05 -0400115 bool fIgnoresInputColor;
cdalton6fd158e2015-05-27 15:08:33 -0700116 int fPrimaryOutputType;
117 int fSecondaryOutputType;
118 GrXferProcessor::BlendInfo fBlendInfo;
119 };
120
121 static void GetXPOutputTypes(const GrXferProcessor* xp, int* outPrimary, int* outSecondary) {
egdanielf2342722015-11-20 15:12:59 -0800122 GrPorterDuffXPFactory::TestGetXPOutputTypes(xp, outPrimary, outSecondary);
cdalton6fd158e2015-05-27 15:08:33 -0700123 }
124};
125
egdaniel723b0502015-09-15 09:31:40 -0700126static void test_lcd_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Greg Daniel6ebe4b92017-05-19 10:56:46 -0400127 GrProcessorAnalysisColor inputColor = GrProcessorAnalysisColor::Opaque::kYes;
Brian Salomona811b122017-03-30 08:21:32 -0400128 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kLCD;
egdaniel723b0502015-09-15 09:31:40 -0700129
Mike Reed7d954ad2016-10-28 15:42:34 -0400130 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
131 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon31853842017-03-28 16:32:05 -0400132 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
egdaniel723b0502015-09-15 09:31:40 -0700133 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400134 case SkBlendMode::kClear:
Brian Salomon31853842017-03-28 16:32:05 -0400135 TEST_ASSERT(xpi.fIgnoresInputColor);
136 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700137 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
Greg Daniel79cdf282017-05-22 15:56:22 -0400138 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
139 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
140 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
141 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
142 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700143 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
144 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400145 case SkBlendMode::kSrc:
Brian Salomon31853842017-03-28 16:32:05 -0400146 TEST_ASSERT(!xpi.fIgnoresInputColor);
147 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700148 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
Greg Daniel79cdf282017-05-22 15:56:22 -0400149 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
150 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700151 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
152 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
Greg Daniel79cdf282017-05-22 15:56:22 -0400153 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700154 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
155 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400156 case SkBlendMode::kDst:
Brian Salomon31853842017-03-28 16:32:05 -0400157 TEST_ASSERT(xpi.fIgnoresInputColor);
158 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700159 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
Greg Daniel79cdf282017-05-22 15:56:22 -0400160 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
161 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700162 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400163 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
164 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
165 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
egdaniel723b0502015-09-15 09:31:40 -0700166 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400167 case SkBlendMode::kSrcOver:
Brian Salomon31853842017-03-28 16:32:05 -0400168 TEST_ASSERT(!xpi.fIgnoresInputColor);
169 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700170 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
egdaniel723b0502015-09-15 09:31:40 -0700171 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
172 TEST_ASSERT(kSAModulate_OutputType == xpi.fSecondaryOutputType);
173 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
174 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
175 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
176 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
177 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400178 case SkBlendMode::kDstOver:
Brian Salomon31853842017-03-28 16:32:05 -0400179 TEST_ASSERT(!xpi.fIgnoresInputColor);
180 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700181 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
Greg Daniel79cdf282017-05-22 15:56:22 -0400182 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
183 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700184 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400185 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
186 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700187 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
188 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400189 case SkBlendMode::kSrcIn:
Brian Salomon31853842017-03-28 16:32:05 -0400190 TEST_ASSERT(!xpi.fIgnoresInputColor);
191 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700192 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
Greg Daniel79cdf282017-05-22 15:56:22 -0400193 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
194 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700195 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400196 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
197 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700198 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
199 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400200 case SkBlendMode::kDstIn:
Brian Salomon31853842017-03-28 16:32:05 -0400201 TEST_ASSERT(!xpi.fIgnoresInputColor);
202 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700203 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
Greg Daniel79cdf282017-05-22 15:56:22 -0400204 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
205 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
206 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
207 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::kSrcOut:
Brian Salomon31853842017-03-28 16:32:05 -0400212 TEST_ASSERT(!xpi.fIgnoresInputColor);
213 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700214 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
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::kDstOut:
Brian Salomon31853842017-03-28 16:32:05 -0400223 TEST_ASSERT(!xpi.fIgnoresInputColor);
224 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700225 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
Greg Daniel79cdf282017-05-22 15:56:22 -0400226 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
227 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700228 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400229 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
230 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700231 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
232 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400233 case SkBlendMode::kSrcATop:
Brian Salomon31853842017-03-28 16:32:05 -0400234 TEST_ASSERT(!xpi.fIgnoresInputColor);
235 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700236 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
Greg Daniel79cdf282017-05-22 15:56:22 -0400237 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
238 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700239 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400240 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
241 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700242 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
243 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400244 case SkBlendMode::kDstATop:
Brian Salomon31853842017-03-28 16:32:05 -0400245 TEST_ASSERT(!xpi.fIgnoresInputColor);
246 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700247 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
Greg Daniel79cdf282017-05-22 15:56:22 -0400248 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
249 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700250 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400251 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
252 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700253 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
254 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400255 case SkBlendMode::kXor:
Brian Salomon31853842017-03-28 16:32:05 -0400256 TEST_ASSERT(!xpi.fIgnoresInputColor);
257 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700258 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
Greg Daniel79cdf282017-05-22 15:56:22 -0400259 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
260 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700261 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400262 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
263 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700264 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
265 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400266 case SkBlendMode::kPlus:
Brian Salomon31853842017-03-28 16:32:05 -0400267 TEST_ASSERT(!xpi.fIgnoresInputColor);
268 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700269 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
Greg Daniel79cdf282017-05-22 15:56:22 -0400270 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
271 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700272 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
273 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
Greg Daniel79cdf282017-05-22 15:56:22 -0400274 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700275 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
276 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400277 case SkBlendMode::kModulate:
Brian Salomon31853842017-03-28 16:32:05 -0400278 TEST_ASSERT(!xpi.fIgnoresInputColor);
279 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700280 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
Greg Daniel79cdf282017-05-22 15:56:22 -0400281 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
282 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
283 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
284 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
285 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700286 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
287 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400288 case SkBlendMode::kScreen:
Brian Salomon31853842017-03-28 16:32:05 -0400289 TEST_ASSERT(!xpi.fIgnoresInputColor);
290 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700291 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
Greg Daniel79cdf282017-05-22 15:56:22 -0400292 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
293 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700294 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
295 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
Greg Daniel79cdf282017-05-22 15:56:22 -0400296 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700297 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
298 break;
299 default:
300 ERRORF(reporter, "Invalid xfermode.");
301 break;
302 }
303 }
304}
cdalton6fd158e2015-05-27 15:08:33 -0700305static void test_color_unknown_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomona811b122017-03-30 08:21:32 -0400306 GrProcessorAnalysisColor inputColor = GrProcessorAnalysisColor::Opaque::kNo;
307 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kSingleChannel;
cdalton6fd158e2015-05-27 15:08:33 -0700308
Mike Reed7d954ad2016-10-28 15:42:34 -0400309 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
310 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon31853842017-03-28 16:32:05 -0400311 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
cdalton6fd158e2015-05-27 15:08:33 -0700312 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400313 case SkBlendMode::kClear:
Brian Salomon31853842017-03-28 16:32:05 -0400314 TEST_ASSERT(xpi.fIgnoresInputColor);
315 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700316 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700317 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
318 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
319 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
320 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
321 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
322 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
323 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400324 case SkBlendMode::kSrc:
Brian Salomon31853842017-03-28 16:32:05 -0400325 TEST_ASSERT(!xpi.fIgnoresInputColor);
326 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700327 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700328 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
329 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
330 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
331 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
332 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
333 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
334 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400335 case SkBlendMode::kDst:
Brian Salomon31853842017-03-28 16:32:05 -0400336 TEST_ASSERT(xpi.fIgnoresInputColor);
337 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700338 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700339 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
340 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
341 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
342 TEST_ASSERT(kZero_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::kSrcOver:
Brian Salomon31853842017-03-28 16:32:05 -0400347 TEST_ASSERT(!xpi.fIgnoresInputColor);
348 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700349 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700350 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
351 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
352 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
353 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
354 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
355 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
356 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400357 case SkBlendMode::kDstOver:
Brian Salomon31853842017-03-28 16:32:05 -0400358 TEST_ASSERT(!xpi.fIgnoresInputColor);
359 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700360 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700361 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
362 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
363 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
364 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
365 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
366 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
367 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400368 case SkBlendMode::kSrcIn:
Brian Salomon31853842017-03-28 16:32:05 -0400369 TEST_ASSERT(!xpi.fIgnoresInputColor);
370 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700371 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700372 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
373 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
374 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
375 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
376 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
377 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
378 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400379 case SkBlendMode::kDstIn:
Brian Salomon31853842017-03-28 16:32:05 -0400380 TEST_ASSERT(!xpi.fIgnoresInputColor);
381 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700382 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700383 TEST_ASSERT(kISAModulate_OutputType == xpi.fPrimaryOutputType);
384 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
385 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
386 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
387 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
388 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
389 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400390 case SkBlendMode::kSrcOut:
Brian Salomon31853842017-03-28 16:32:05 -0400391 TEST_ASSERT(!xpi.fIgnoresInputColor);
392 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700393 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700394 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
395 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
396 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
397 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
398 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
399 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
400 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400401 case SkBlendMode::kDstOut:
Brian Salomon31853842017-03-28 16:32:05 -0400402 TEST_ASSERT(!xpi.fIgnoresInputColor);
403 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700404 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700405 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
406 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
407 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
408 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
409 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
410 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
411 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400412 case SkBlendMode::kSrcATop:
Brian Salomon31853842017-03-28 16:32:05 -0400413 TEST_ASSERT(!xpi.fIgnoresInputColor);
414 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700415 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700416 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
417 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
418 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
419 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
420 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
421 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
422 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400423 case SkBlendMode::kDstATop:
Brian Salomon31853842017-03-28 16:32:05 -0400424 TEST_ASSERT(!xpi.fIgnoresInputColor);
425 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700426 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700427 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
428 TEST_ASSERT(kISAModulate_OutputType == xpi.fSecondaryOutputType);
429 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
430 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
431 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
432 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
433 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400434 case SkBlendMode::kXor:
Brian Salomon31853842017-03-28 16:32:05 -0400435 TEST_ASSERT(!xpi.fIgnoresInputColor);
436 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700437 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
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(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
442 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
443 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
444 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400445 case SkBlendMode::kPlus:
Brian Salomon31853842017-03-28 16:32:05 -0400446 TEST_ASSERT(!xpi.fIgnoresInputColor);
447 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700448 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700449 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
450 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
451 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
452 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
453 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
454 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
455 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400456 case SkBlendMode::kModulate:
Brian Salomon31853842017-03-28 16:32:05 -0400457 TEST_ASSERT(!xpi.fIgnoresInputColor);
458 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700459 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700460 TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType);
461 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
462 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
463 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
464 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
465 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
466 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400467 case SkBlendMode::kScreen:
Brian Salomon31853842017-03-28 16:32:05 -0400468 TEST_ASSERT(!xpi.fIgnoresInputColor);
469 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700470 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700471 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
472 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
473 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
474 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
475 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
476 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
477 break;
478 default:
479 ERRORF(reporter, "Invalid xfermode.");
480 break;
481 }
482 }
483}
484
Brian Salomon31853842017-03-28 16:32:05 -0400485static void test_color_not_opaque_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Osmancf860852018-10-31 14:04:39 -0400486 GrProcessorAnalysisColor inputColor(
487 SkPMColor4f::FromBytes_RGBA(GrColorPackRGBA(229, 0, 154, 240)));
Brian Salomona811b122017-03-30 08:21:32 -0400488 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kNone;
cdalton6fd158e2015-05-27 15:08:33 -0700489
Mike Reed7d954ad2016-10-28 15:42:34 -0400490 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
491 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon31853842017-03-28 16:32:05 -0400492 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
cdalton6fd158e2015-05-27 15:08:33 -0700493 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400494 case SkBlendMode::kClear:
Brian Salomon31853842017-03-28 16:32:05 -0400495 TEST_ASSERT(xpi.fIgnoresInputColor);
Greg Danielc5296812020-02-28 13:06:02 -0500496 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700497 TEST_ASSERT(xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700498 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
499 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
500 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
501 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
502 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
503 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
504 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400505 case SkBlendMode::kSrc:
Brian Salomon31853842017-03-28 16:32:05 -0400506 TEST_ASSERT(!xpi.fIgnoresInputColor);
Greg Danielc5296812020-02-28 13:06:02 -0500507 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700508 TEST_ASSERT(xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700509 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
510 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
511 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
512 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
513 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
514 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
515 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400516 case SkBlendMode::kDst:
Brian Salomon31853842017-03-28 16:32:05 -0400517 TEST_ASSERT(xpi.fIgnoresInputColor);
518 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700519 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700520 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
521 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
522 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
523 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
524 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
525 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
526 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400527 case SkBlendMode::kSrcOver:
Brian Salomon31853842017-03-28 16:32:05 -0400528 TEST_ASSERT(!xpi.fIgnoresInputColor);
529 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700530 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700531 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
532 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
533 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
534 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
535 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
536 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
537 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400538 case SkBlendMode::kDstOver:
Brian Salomon31853842017-03-28 16:32:05 -0400539 TEST_ASSERT(!xpi.fIgnoresInputColor);
540 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700541 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700542 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
543 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
544 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
545 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
546 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
547 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
548 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400549 case SkBlendMode::kSrcIn:
Brian Salomon31853842017-03-28 16:32:05 -0400550 TEST_ASSERT(!xpi.fIgnoresInputColor);
Greg Danielc5296812020-02-28 13:06:02 -0500551 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700552 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700553 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
554 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
555 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
556 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
557 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
558 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
559 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400560 case SkBlendMode::kDstIn:
Brian Salomon31853842017-03-28 16:32:05 -0400561 TEST_ASSERT(!xpi.fIgnoresInputColor);
Greg Danielc5296812020-02-28 13:06:02 -0500562 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700563 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
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(kZero_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::kSrcOut:
Brian Salomon31853842017-03-28 16:32:05 -0400572 TEST_ASSERT(!xpi.fIgnoresInputColor);
Greg Danielc5296812020-02-28 13:06:02 -0500573 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700574 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
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(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
580 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
581 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400582 case SkBlendMode::kDstOut:
Brian Salomon31853842017-03-28 16:32:05 -0400583 TEST_ASSERT(!xpi.fIgnoresInputColor);
584 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700585 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700586 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
587 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
588 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
589 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
590 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
591 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
592 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400593 case SkBlendMode::kSrcATop:
Brian Salomon31853842017-03-28 16:32:05 -0400594 TEST_ASSERT(!xpi.fIgnoresInputColor);
595 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700596 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700597 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
598 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
599 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
600 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
601 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
602 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
603 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400604 case SkBlendMode::kDstATop:
Brian Salomon31853842017-03-28 16:32:05 -0400605 TEST_ASSERT(!xpi.fIgnoresInputColor);
Greg Danielc5296812020-02-28 13:06:02 -0500606 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700607 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700608 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
609 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
610 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
611 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
612 TEST_ASSERT(kSA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
613 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
614 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400615 case SkBlendMode::kXor:
Brian Salomon31853842017-03-28 16:32:05 -0400616 TEST_ASSERT(!xpi.fIgnoresInputColor);
617 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700618 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700619 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
620 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
621 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
622 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
623 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
624 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
625 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400626 case SkBlendMode::kPlus:
Brian Salomon31853842017-03-28 16:32:05 -0400627 TEST_ASSERT(!xpi.fIgnoresInputColor);
628 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700629 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700630 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
631 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
632 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
633 TEST_ASSERT(kOne_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::kModulate:
Brian Salomon31853842017-03-28 16:32:05 -0400638 TEST_ASSERT(!xpi.fIgnoresInputColor);
Greg Danielc5296812020-02-28 13:06:02 -0500639 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700640 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700641 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
642 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
643 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
644 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
645 TEST_ASSERT(kSC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
646 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
647 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400648 case SkBlendMode::kScreen:
Brian Salomon31853842017-03-28 16:32:05 -0400649 TEST_ASSERT(!xpi.fIgnoresInputColor);
650 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700651 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700652 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
653 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
654 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
655 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
656 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
657 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
658 break;
659 default:
660 ERRORF(reporter, "Invalid xfermode.");
661 break;
662 }
663 }
664}
665
666static void test_color_opaque_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomona811b122017-03-30 08:21:32 -0400667 GrProcessorAnalysisColor inputColor = GrProcessorAnalysisColor::Opaque::kYes;
668 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kSingleChannel;
cdalton6fd158e2015-05-27 15:08:33 -0700669
Mike Reed7d954ad2016-10-28 15:42:34 -0400670 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
671 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon31853842017-03-28 16:32:05 -0400672 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
cdalton6fd158e2015-05-27 15:08:33 -0700673 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400674 case SkBlendMode::kClear:
Brian Salomon31853842017-03-28 16:32:05 -0400675 TEST_ASSERT(xpi.fIgnoresInputColor);
676 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700677 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700678 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
679 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
680 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
681 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
682 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
683 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
684 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400685 case SkBlendMode::kSrc:
Brian Salomon31853842017-03-28 16:32:05 -0400686 TEST_ASSERT(!xpi.fIgnoresInputColor);
687 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700688 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700689 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
690 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
691 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
692 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
693 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
694 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
695 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400696 case SkBlendMode::kDst:
Brian Salomon31853842017-03-28 16:32:05 -0400697 TEST_ASSERT(xpi.fIgnoresInputColor);
698 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700699 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700700 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
701 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
702 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
703 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
704 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
705 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
706 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400707 case SkBlendMode::kSrcOver:
Brian Salomon31853842017-03-28 16:32:05 -0400708 TEST_ASSERT(!xpi.fIgnoresInputColor);
709 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700710 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700711 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
712 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
713 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
714 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
715 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
716 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
717 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400718 case SkBlendMode::kDstOver:
Brian Salomon31853842017-03-28 16:32:05 -0400719 TEST_ASSERT(!xpi.fIgnoresInputColor);
720 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700721 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700722 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
723 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
724 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
725 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
726 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
727 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
728 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400729 case SkBlendMode::kSrcIn:
Brian Salomon31853842017-03-28 16:32:05 -0400730 TEST_ASSERT(!xpi.fIgnoresInputColor);
731 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700732 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700733 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
734 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
735 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
736 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
737 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
738 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
739 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400740 case SkBlendMode::kDstIn:
Brian Salomon31853842017-03-28 16:32:05 -0400741 TEST_ASSERT(xpi.fIgnoresInputColor);
742 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700743 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700744 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
745 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
746 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
747 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
748 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
749 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
750 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400751 case SkBlendMode::kSrcOut:
Brian Salomon31853842017-03-28 16:32:05 -0400752 TEST_ASSERT(!xpi.fIgnoresInputColor);
753 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700754 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700755 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
756 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
757 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
758 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
759 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
760 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
761 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400762 case SkBlendMode::kDstOut:
Brian Salomon31853842017-03-28 16:32:05 -0400763 TEST_ASSERT(xpi.fIgnoresInputColor);
764 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700765 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700766 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
767 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
768 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
769 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
770 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
771 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
772 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400773 case SkBlendMode::kSrcATop:
Brian Salomon31853842017-03-28 16:32:05 -0400774 TEST_ASSERT(!xpi.fIgnoresInputColor);
775 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700776 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700777 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
778 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
779 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
780 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
781 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
782 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
783 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400784 case SkBlendMode::kDstATop:
Brian Salomon31853842017-03-28 16:32:05 -0400785 TEST_ASSERT(!xpi.fIgnoresInputColor);
786 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700787 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700788 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
789 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
790 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
791 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
792 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
793 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
794 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400795 case SkBlendMode::kXor:
Brian Salomon31853842017-03-28 16:32:05 -0400796 TEST_ASSERT(!xpi.fIgnoresInputColor);
797 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700798 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700799 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
800 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
801 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
802 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
803 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
804 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
805 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400806 case SkBlendMode::kPlus:
Brian Salomon31853842017-03-28 16:32:05 -0400807 TEST_ASSERT(!xpi.fIgnoresInputColor);
808 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700809 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700810 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
811 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
812 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
813 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
814 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
815 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
816 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400817 case SkBlendMode::kModulate:
Brian Salomon31853842017-03-28 16:32:05 -0400818 TEST_ASSERT(!xpi.fIgnoresInputColor);
cdalton6fd158e2015-05-27 15:08:33 -0700819 TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType);
820 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
821 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
822 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
823 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
824 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
825 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400826 case SkBlendMode::kScreen:
Brian Salomon31853842017-03-28 16:32:05 -0400827 TEST_ASSERT(!xpi.fIgnoresInputColor);
828 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700829 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700830 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
831 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
832 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
833 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
834 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
835 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
836 break;
837 default:
838 ERRORF(reporter, "Invalid xfermode.");
839 break;
840 }
841 }
842}
843
844static void test_color_opaque_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomona811b122017-03-30 08:21:32 -0400845 GrProcessorAnalysisColor inputColor = GrProcessorAnalysisColor::Opaque::kYes;
846 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kNone;
cdalton6fd158e2015-05-27 15:08:33 -0700847
Mike Reed7d954ad2016-10-28 15:42:34 -0400848 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
849 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon31853842017-03-28 16:32:05 -0400850 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
cdalton6fd158e2015-05-27 15:08:33 -0700851
852 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400853 case SkBlendMode::kClear:
Brian Salomon31853842017-03-28 16:32:05 -0400854 TEST_ASSERT(xpi.fIgnoresInputColor);
Greg Danielc5296812020-02-28 13:06:02 -0500855 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700856 TEST_ASSERT(xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700857 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
858 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
859 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
860 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
861 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
862 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
863 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400864 case SkBlendMode::kSrc:
Brian Salomon31853842017-03-28 16:32:05 -0400865 TEST_ASSERT(!xpi.fIgnoresInputColor);
Greg Danielc5296812020-02-28 13:06:02 -0500866 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700867 TEST_ASSERT(xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700868 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
869 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
870 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
871 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
872 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
873 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
874 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400875 case SkBlendMode::kDst:
Brian Salomon31853842017-03-28 16:32:05 -0400876 TEST_ASSERT(xpi.fIgnoresInputColor);
877 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700878 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700879 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
880 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
881 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
882 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
883 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
884 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
885 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400886 case SkBlendMode::kSrcOver:
Brian Salomon28207df2017-06-05 12:25:13 -0400887 // We don't specialize opaque src-over. See note in GrPorterDuffXferProcessor.cpp
Brian Salomon31853842017-03-28 16:32:05 -0400888 TEST_ASSERT(!xpi.fIgnoresInputColor);
Brian Salomon28207df2017-06-05 12:25:13 -0400889 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700890 TEST_ASSERT(xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700891 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
892 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
893 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
894 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
Greg Danielf6d60d32020-01-08 13:39:16 -0500895 if (caps.shouldCollapseSrcOverToSrcWhenAble()) {
896 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
897 } else {
898 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
899 }
cdalton6fd158e2015-05-27 15:08:33 -0700900 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
901 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400902 case SkBlendMode::kDstOver:
Brian Salomon31853842017-03-28 16:32:05 -0400903 TEST_ASSERT(!xpi.fIgnoresInputColor);
904 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700905 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700906 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
907 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
908 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
909 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
910 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
911 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
912 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400913 case SkBlendMode::kSrcIn:
Brian Salomon31853842017-03-28 16:32:05 -0400914 TEST_ASSERT(!xpi.fIgnoresInputColor);
Greg Danielc5296812020-02-28 13:06:02 -0500915 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700916 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700917 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
918 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
919 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
920 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
921 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
922 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
923 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400924 case SkBlendMode::kDstIn:
Brian Salomon31853842017-03-28 16:32:05 -0400925 TEST_ASSERT(xpi.fIgnoresInputColor);
926 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700927 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700928 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
929 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
930 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
931 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
932 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
933 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
934 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400935 case SkBlendMode::kSrcOut:
Brian Salomon31853842017-03-28 16:32:05 -0400936 TEST_ASSERT(!xpi.fIgnoresInputColor);
Greg Danielc5296812020-02-28 13:06:02 -0500937 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700938 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700939 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
940 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
941 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
942 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
943 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
944 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
945 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400946 case SkBlendMode::kDstOut:
Brian Salomon31853842017-03-28 16:32:05 -0400947 TEST_ASSERT(xpi.fIgnoresInputColor);
Greg Danielc5296812020-02-28 13:06:02 -0500948 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700949 TEST_ASSERT(xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700950 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
951 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
952 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
953 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
954 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
955 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
956 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400957 case SkBlendMode::kSrcATop:
Brian Salomon31853842017-03-28 16:32:05 -0400958 TEST_ASSERT(!xpi.fIgnoresInputColor);
Greg Danielc5296812020-02-28 13:06:02 -0500959 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700960 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700961 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
962 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
963 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
964 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
965 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
966 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
967 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400968 case SkBlendMode::kDstATop:
Brian Salomon31853842017-03-28 16:32:05 -0400969 TEST_ASSERT(!xpi.fIgnoresInputColor);
970 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700971 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700972 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
973 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
974 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
975 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
976 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
977 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
978 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400979 case SkBlendMode::kXor:
Brian Salomon31853842017-03-28 16:32:05 -0400980 TEST_ASSERT(!xpi.fIgnoresInputColor);
Greg Danielc5296812020-02-28 13:06:02 -0500981 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700982 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700983 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
984 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
985 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
986 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
987 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
988 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
989 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400990 case SkBlendMode::kPlus:
Brian Salomon31853842017-03-28 16:32:05 -0400991 TEST_ASSERT(!xpi.fIgnoresInputColor);
992 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700993 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700994 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
995 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
996 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
997 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
998 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
999 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
1000 break;
Mike Reed7d954ad2016-10-28 15:42:34 -04001001 case SkBlendMode::kModulate:
Brian Salomon31853842017-03-28 16:32:05 -04001002 TEST_ASSERT(!xpi.fIgnoresInputColor);
Greg Danielc5296812020-02-28 13:06:02 -05001003 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -07001004 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -07001005 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
1006 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
1007 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
1008 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
1009 TEST_ASSERT(kSC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
1010 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
1011 break;
Mike Reed7d954ad2016-10-28 15:42:34 -04001012 case SkBlendMode::kScreen:
Brian Salomon31853842017-03-28 16:32:05 -04001013 TEST_ASSERT(!xpi.fIgnoresInputColor);
1014 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -07001015 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -07001016 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
1017 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
1018 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
1019 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
1020 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
1021 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
1022 break;
1023 default:
1024 ERRORF(reporter, "Invalid xfermode.");
1025 break;
1026 }
1027 }
1028}
1029
egdaniel723b0502015-09-15 09:31:40 -07001030static void test_lcd_coverage_fallback_case(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Osman5ced0bf2019-03-15 10:15:29 -04001031 constexpr GrClampType autoClamp = GrClampType::kAuto;
Brian Salomon31853842017-03-28 16:32:05 -04001032 const GrXPFactory* xpf = GrPorterDuffXPFactory::Get(SkBlendMode::kSrcOver);
Brian Osmancf860852018-10-31 14:04:39 -04001033 GrProcessorAnalysisColor color = SkPMColor4f::FromBytes_RGBA(GrColorPackRGBA(123, 45, 67, 255));
Brian Salomona811b122017-03-30 08:21:32 -04001034 GrProcessorAnalysisCoverage coverage = GrProcessorAnalysisCoverage::kLCD;
Chris Dalton2833ec62020-12-03 01:43:08 -07001035 TEST_ASSERT(!(GrXPFactory::GetAnalysisProperties(xpf, color, coverage, false, caps, autoClamp) &
Greg Daniel6ebe4b92017-05-19 10:56:46 -04001036 GrXPFactory::AnalysisProperties::kRequiresDstTexture));
1037 sk_sp<const GrXferProcessor> xp_opaque(
Brian Osman5ced0bf2019-03-15 10:15:29 -04001038 GrXPFactory::MakeXferProcessor(xpf, color, coverage, false, caps, autoClamp));
Greg Daniel6ebe4b92017-05-19 10:56:46 -04001039 if (!xp_opaque) {
1040 ERRORF(reporter, "Failed to create an XP with LCD coverage.");
1041 return;
1042 }
1043
Chris Daltonbbb3f642019-07-24 12:25:08 -04001044 GrXferProcessor::BlendInfo blendInfo = xp_opaque->getBlendInfo();
Greg Daniel6ebe4b92017-05-19 10:56:46 -04001045 TEST_ASSERT(blendInfo.fWriteColor);
1046
1047 // Test with non-opaque alpha
Brian Osmancf860852018-10-31 14:04:39 -04001048 color = SkPMColor4f::FromBytes_RGBA(GrColorPackRGBA(123, 45, 67, 221));
Greg Daniel6ebe4b92017-05-19 10:56:46 -04001049 coverage = GrProcessorAnalysisCoverage::kLCD;
Chris Dalton2833ec62020-12-03 01:43:08 -07001050 TEST_ASSERT(!(GrXPFactory::GetAnalysisProperties(xpf, color, coverage, false, caps, autoClamp) &
Greg Danield7b11592017-06-14 13:37:12 -04001051 GrXPFactory::AnalysisProperties::kRequiresDstTexture));
Brian Salomond61c9d92017-04-10 10:54:25 -04001052 sk_sp<const GrXferProcessor> xp(
Brian Osman5ced0bf2019-03-15 10:15:29 -04001053 GrXPFactory::MakeXferProcessor(xpf, color, coverage, false, caps, autoClamp));
cdalton6fd158e2015-05-27 15:08:33 -07001054 if (!xp) {
1055 ERRORF(reporter, "Failed to create an XP with LCD coverage.");
1056 return;
1057 }
1058
Chris Daltonbbb3f642019-07-24 12:25:08 -04001059 blendInfo = xp->getBlendInfo();
cdalton6fd158e2015-05-27 15:08:33 -07001060 TEST_ASSERT(blendInfo.fWriteColor);
1061}
1062
Brian Salomondcfca432017-11-15 15:48:03 -05001063DEF_GPUTEST(PorterDuffNoDualSourceBlending, reporter, options) {
1064 GrContextOptions opts = options;
cdalton6fd158e2015-05-27 15:08:33 -07001065 opts.fSuppressDualSourceBlending = true;
bsalomon3724e572016-03-30 18:56:19 -07001066 sk_gpu_test::GrContextFactory mockFactory(opts);
Robert Phillips6d344c32020-07-06 10:56:46 -04001067 auto ctx = mockFactory.get(sk_gpu_test::GrContextFactory::kMock_ContextType);
cdalton6fd158e2015-05-27 15:08:33 -07001068 if (!ctx) {
Brian Osman7c597742019-03-26 11:10:11 -04001069 SK_ABORT("Failed to create mock context without ARB_blend_func_extended.");
cdalton6fd158e2015-05-27 15:08:33 -07001070 }
1071
Robert Phillips9da87e02019-02-04 13:26:26 -05001072 GrProxyProvider* proxyProvider = ctx->priv().proxyProvider();
1073 const GrCaps& caps = *ctx->priv().caps();
cdalton6fd158e2015-05-27 15:08:33 -07001074 if (caps.shaderCaps()->dualSourceBlendingSupport()) {
Brian Osman7c597742019-03-26 11:10:11 -04001075 SK_ABORT("Mock context failed to honor request for no ARB_blend_func_extended.");
cdalton6fd158e2015-05-27 15:08:33 -07001076 }
1077
Brian Salomon72050802020-10-12 20:45:06 -04001078 auto mbet = sk_gpu_test::ManagedBackendTexture::MakeWithoutData(
1079 ctx, 100, 100, kRGBA_8888_SkColorType, GrMipmapped::kNo, GrRenderable::kNo);
Brian Salomon88d7e622020-11-05 11:11:20 -05001080 if (!mbet) {
1081 ERRORF(reporter, "Could not make texture.");
1082 return;
1083 }
Greg Daniel524e28b2019-11-01 11:48:53 -04001084 GrXferProcessor::DstProxyView fakeDstProxyView;
Robert Phillipsbb581ce2017-05-29 15:05:15 -04001085 {
Brian Salomonc67c31c2018-12-06 10:00:03 -05001086 sk_sp<GrTextureProxy> proxy = proxyProvider->wrapBackendTexture(
Brian Salomon72050802020-10-12 20:45:06 -04001087 mbet->texture(), kBorrow_GrWrapOwnership, GrWrapCacheable::kNo, kRead_GrIOType,
1088 mbet->refCountedCallback());
1089 GrSwizzle swizzle =
1090 caps.getReadSwizzle(mbet->texture().getBackendFormat(), GrColorType::kRGBA_8888);
Greg Daniel524e28b2019-11-01 11:48:53 -04001091 fakeDstProxyView.setProxyView({std::move(proxy), kTopLeft_GrSurfaceOrigin, swizzle});
Robert Phillipsbb581ce2017-05-29 15:05:15 -04001092 }
cdalton6fd158e2015-05-27 15:08:33 -07001093
Brian Salomona811b122017-03-30 08:21:32 -04001094 static const GrProcessorAnalysisColor colorInputs[] = {
1095 GrProcessorAnalysisColor::Opaque::kNo, GrProcessorAnalysisColor::Opaque::kYes,
Brian Osmancf860852018-10-31 14:04:39 -04001096 GrProcessorAnalysisColor(SkPMColor4f::FromBytes_RGBA(GrColorPackRGBA(0, 82, 17, 100))),
1097 GrProcessorAnalysisColor(SkPMColor4f::FromBytes_RGBA(GrColorPackRGBA(0, 82, 17, 255)))};
cdalton6fd158e2015-05-27 15:08:33 -07001098
Brian Salomonc6b71462017-02-14 11:33:01 -05001099 for (const auto& colorInput : colorInputs) {
Brian Salomona811b122017-03-30 08:21:32 -04001100 for (GrProcessorAnalysisCoverage coverageType :
1101 {GrProcessorAnalysisCoverage::kSingleChannel, GrProcessorAnalysisCoverage::kNone}) {
Mike Reed7d954ad2016-10-28 15:42:34 -04001102 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
1103 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomona1633922017-01-09 11:46:10 -05001104 const GrXPFactory* xpf = GrPorterDuffXPFactory::Get(xfermode);
Brian Salomond61c9d92017-04-10 10:54:25 -04001105 sk_sp<const GrXferProcessor> xp(
Brian Osman5ced0bf2019-03-15 10:15:29 -04001106 GrXPFactory::MakeXferProcessor(xpf, colorInput, coverageType, false, caps,
1107 GrClampType::kAuto));
cdalton6fd158e2015-05-27 15:08:33 -07001108 if (!xp) {
1109 ERRORF(reporter, "Failed to create an XP without dual source blending.");
1110 return;
1111 }
1112 TEST_ASSERT(!xp->hasSecondaryOutput());
cdalton6fd158e2015-05-27 15:08:33 -07001113 }
1114 }
1115 }
cdalton6fd158e2015-05-27 15:08:33 -07001116}