blob: 780b4e2b708979c1d2baa3290070c7214a98b528 [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"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050019#include "tools/gpu/GrContextFactory.h"
Brian Salomon72050802020-10-12 20:45:06 -040020#include "tools/gpu/ManagedBackendTexture.h"
cdalton6fd158e2015-05-27 15:08:33 -070021
22////////////////////////////////////////////////////////////////////////////////
23
24static void test_color_unknown_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps);
Brian Salomon31853842017-03-28 16:32:05 -040025static void test_color_not_opaque_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps);
cdalton6fd158e2015-05-27 15:08:33 -070026static void test_color_opaque_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps);
27static void test_color_opaque_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps);
28static void test_lcd_coverage(skiatest::Reporter* reporter, const GrCaps& caps);
egdaniel723b0502015-09-15 09:31:40 -070029static void test_lcd_coverage_fallback_case(skiatest::Reporter* reporter, const GrCaps& caps);
cdalton6fd158e2015-05-27 15:08:33 -070030
Brian Osmand2ca3122019-03-26 11:31:16 -040031DEF_GPUTEST(GrPorterDuff, reporter, /*ctxInfo*/) {
32 GrMockOptions mockOptions;
33 mockOptions.fDualSourceBlendingSupport = true;
Robert Phillipsf4f80112020-07-13 16:13:31 -040034 sk_sp<GrDirectContext> context = GrDirectContext::MakeMock(&mockOptions, GrContextOptions());
Brian Osmand2ca3122019-03-26 11:31:16 -040035 const GrCaps& caps = *context->priv().getGpu()->caps();
36
cdalton6fd158e2015-05-27 15:08:33 -070037 if (!caps.shaderCaps()->dualSourceBlendingSupport()) {
Ben Wagnerb4aab9a2017-08-16 10:53:04 -040038 SK_ABORT("Null context does not support dual source blending.");
cdalton6fd158e2015-05-27 15:08:33 -070039 }
40
41 test_color_unknown_with_coverage(reporter, caps);
Brian Salomon31853842017-03-28 16:32:05 -040042 test_color_not_opaque_no_coverage(reporter, caps);
cdalton6fd158e2015-05-27 15:08:33 -070043 test_color_opaque_with_coverage(reporter, caps);
44 test_color_opaque_no_coverage(reporter, caps);
45 test_lcd_coverage(reporter, caps);
egdaniel723b0502015-09-15 09:31:40 -070046 test_lcd_coverage_fallback_case(reporter, caps);
cdalton6fd158e2015-05-27 15:08:33 -070047}
48
49////////////////////////////////////////////////////////////////////////////////
50
51#define TEST_ASSERT(...) REPORTER_ASSERT(reporter, __VA_ARGS__)
52
53enum {
54 kNone_OutputType,
55 kCoverage_OutputType,
56 kModulate_OutputType,
egdaniel723b0502015-09-15 09:31:40 -070057 kSAModulate_OutputType,
cdalton6fd158e2015-05-27 15:08:33 -070058 kISAModulate_OutputType,
59 kISCModulate_OutputType
60};
Greg Daniel79cdf282017-05-22 15:56:22 -040061static const int kInvalid_OutputType = -1;
cdalton6fd158e2015-05-27 15:08:33 -070062
Brian Salomon48d1b4c2017-04-08 07:38:53 -040063static GrProcessorSet::Analysis do_analysis(const GrXPFactory* xpf,
64 const GrProcessorAnalysisColor& colorInput,
65 GrProcessorAnalysisCoverage coverageInput,
66 const GrCaps& caps) {
67 GrPaint paint;
68 paint.setXPFactory(xpf);
69 GrProcessorSet procs(std::move(paint));
Brian Osmancf860852018-10-31 14:04:39 -040070 SkPMColor4f overrideColor;
Chris Daltonb8fff0d2019-03-05 10:11:58 -070071 GrProcessorSet::Analysis analysis = procs.finalize(
Chris Dalton57ab06c2021-04-22 12:57:28 -060072 colorInput, coverageInput, nullptr, &GrUserStencilSettings::kUnused, caps,
73 GrClampType::kAuto, &overrideColor);
Brian Salomon48d1b4c2017-04-08 07:38:53 -040074 return analysis;
75}
76
cdalton6fd158e2015-05-27 15:08:33 -070077class GrPorterDuffTest {
78public:
79 struct XPInfo {
Mike Reed7d954ad2016-10-28 15:42:34 -040080 XPInfo(skiatest::Reporter* reporter, SkBlendMode xfermode, const GrCaps& caps,
Brian Salomona811b122017-03-30 08:21:32 -040081 GrProcessorAnalysisColor inputColor, GrProcessorAnalysisCoverage inputCoverage) {
Brian Salomona1633922017-01-09 11:46:10 -050082 const GrXPFactory* xpf = GrPorterDuffXPFactory::Get(xfermode);
Brian Salomon48d1b4c2017-04-08 07:38:53 -040083
Greg Daniel79cdf282017-05-22 15:56:22 -040084 bool isLCD = GrProcessorAnalysisCoverage::kLCD == inputCoverage;
85
Brian Salomon48d1b4c2017-04-08 07:38:53 -040086 GrProcessorSet::Analysis analysis = do_analysis(xpf, inputColor, inputCoverage, caps);
Brian Salomon31853842017-03-28 16:32:05 -040087 fCompatibleWithCoverageAsAlpha = analysis.isCompatibleWithCoverageAsAlpha();
Chris Daltonf2fb80f2020-12-03 12:37:59 -070088 fUnaffectedByDstValue = analysis.unaffectedByDstValue();
Brian Salomon48d1b4c2017-04-08 07:38:53 -040089 fIgnoresInputColor = analysis.inputColorIsIgnored();
Brian Salomond61c9d92017-04-10 10:54:25 -040090 sk_sp<const GrXferProcessor> xp(
Chris Dalton57ab06c2021-04-22 12:57:28 -060091 GrXPFactory::MakeXferProcessor(xpf, inputColor, inputCoverage, caps,
Brian Osman5ced0bf2019-03-15 10:15:29 -040092 GrClampType::kAuto));
Greg Daniel79cdf282017-05-22 15:56:22 -040093 TEST_ASSERT(!analysis.requiresDstTexture() ||
94 (isLCD &&
95 !caps.shaderCaps()->dstReadInShaderSupport() &&
96 (SkBlendMode::kSrcOver != xfermode ||
97 !inputColor.isOpaque())));
Chris Dalton945ee652019-01-23 09:10:36 -070098 // Porter Duff modes currently only use fixed-function or shader blending, and Ganesh
99 // doesn't yet make use of framebuffer fetches that require a barrier
100 // (e.g., QCOM_shader_framebuffer_fetch_noncoherent). So dst textures and xfer barriers
101 // should always go hand in hand for Porter Duff modes.
102 TEST_ASSERT(analysis.requiresDstTexture() == analysis.requiresNonOverlappingDraws());
Hal Canary342b7ac2016-11-04 11:49:42 -0400103 GetXPOutputTypes(xp.get(), &fPrimaryOutputType, &fSecondaryOutputType);
Chris Daltonbbb3f642019-07-24 12:25:08 -0400104 fBlendInfo = xp->getBlendInfo();
Greg Daniel79cdf282017-05-22 15:56:22 -0400105 TEST_ASSERT(!xp->willReadDstColor() ||
106 (isLCD && (SkBlendMode::kSrcOver != xfermode ||
107 !inputColor.isOpaque())));
cdalton6fd158e2015-05-27 15:08:33 -0700108 TEST_ASSERT(xp->hasSecondaryOutput() == GrBlendCoeffRefsSrc2(fBlendInfo.fDstBlend));
109 }
110
Brian Salomon31853842017-03-28 16:32:05 -0400111 bool fCompatibleWithCoverageAsAlpha;
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700112 bool fUnaffectedByDstValue;
Brian Salomon31853842017-03-28 16:32:05 -0400113 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);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700135 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
Greg Daniel79cdf282017-05-22 15:56:22 -0400136 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
137 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
138 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
139 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
140 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700141 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
142 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400143 case SkBlendMode::kSrc:
Brian Salomon31853842017-03-28 16:32:05 -0400144 TEST_ASSERT(!xpi.fIgnoresInputColor);
145 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700146 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
Greg Daniel79cdf282017-05-22 15:56:22 -0400147 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
148 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700149 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
150 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
Greg Daniel79cdf282017-05-22 15:56:22 -0400151 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700152 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
153 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400154 case SkBlendMode::kDst:
Brian Salomon31853842017-03-28 16:32:05 -0400155 TEST_ASSERT(xpi.fIgnoresInputColor);
156 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700157 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
Greg Daniel79cdf282017-05-22 15:56:22 -0400158 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
159 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700160 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400161 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
162 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
163 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
egdaniel723b0502015-09-15 09:31:40 -0700164 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400165 case SkBlendMode::kSrcOver:
Brian Salomon31853842017-03-28 16:32:05 -0400166 TEST_ASSERT(!xpi.fIgnoresInputColor);
167 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700168 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
egdaniel723b0502015-09-15 09:31:40 -0700169 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
170 TEST_ASSERT(kSAModulate_OutputType == xpi.fSecondaryOutputType);
171 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
172 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
173 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
174 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
175 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400176 case SkBlendMode::kDstOver:
Brian Salomon31853842017-03-28 16:32:05 -0400177 TEST_ASSERT(!xpi.fIgnoresInputColor);
178 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700179 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
Greg Daniel79cdf282017-05-22 15:56:22 -0400180 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
181 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700182 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400183 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
184 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700185 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
186 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400187 case SkBlendMode::kSrcIn:
Brian Salomon31853842017-03-28 16:32:05 -0400188 TEST_ASSERT(!xpi.fIgnoresInputColor);
189 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700190 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
Greg Daniel79cdf282017-05-22 15:56:22 -0400191 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
192 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700193 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400194 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
195 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700196 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
197 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400198 case SkBlendMode::kDstIn:
Brian Salomon31853842017-03-28 16:32:05 -0400199 TEST_ASSERT(!xpi.fIgnoresInputColor);
200 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700201 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
Greg Daniel79cdf282017-05-22 15:56:22 -0400202 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
203 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
204 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
205 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
206 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700207 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
208 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400209 case SkBlendMode::kSrcOut:
Brian Salomon31853842017-03-28 16:32:05 -0400210 TEST_ASSERT(!xpi.fIgnoresInputColor);
211 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700212 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
Greg Daniel79cdf282017-05-22 15:56:22 -0400213 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
214 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700215 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400216 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
217 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700218 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
219 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400220 case SkBlendMode::kDstOut:
Brian Salomon31853842017-03-28 16:32:05 -0400221 TEST_ASSERT(!xpi.fIgnoresInputColor);
222 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700223 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
Greg Daniel79cdf282017-05-22 15:56:22 -0400224 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
225 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700226 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400227 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
228 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700229 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
230 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400231 case SkBlendMode::kSrcATop:
Brian Salomon31853842017-03-28 16:32:05 -0400232 TEST_ASSERT(!xpi.fIgnoresInputColor);
233 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700234 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
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::kDstATop:
Brian Salomon31853842017-03-28 16:32:05 -0400243 TEST_ASSERT(!xpi.fIgnoresInputColor);
244 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700245 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
Greg Daniel79cdf282017-05-22 15:56:22 -0400246 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
247 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700248 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400249 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
250 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700251 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
252 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400253 case SkBlendMode::kXor:
Brian Salomon31853842017-03-28 16:32:05 -0400254 TEST_ASSERT(!xpi.fIgnoresInputColor);
255 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700256 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
Greg Daniel79cdf282017-05-22 15:56:22 -0400257 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
258 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700259 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400260 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
261 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700262 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
263 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400264 case SkBlendMode::kPlus:
Brian Salomon31853842017-03-28 16:32:05 -0400265 TEST_ASSERT(!xpi.fIgnoresInputColor);
266 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700267 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
Greg Daniel79cdf282017-05-22 15:56:22 -0400268 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
269 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700270 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
271 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
Greg Daniel79cdf282017-05-22 15:56:22 -0400272 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700273 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
274 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400275 case SkBlendMode::kModulate:
Brian Salomon31853842017-03-28 16:32:05 -0400276 TEST_ASSERT(!xpi.fIgnoresInputColor);
277 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700278 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
Greg Daniel79cdf282017-05-22 15:56:22 -0400279 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
280 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
281 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
282 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
283 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700284 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
285 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400286 case SkBlendMode::kScreen:
Brian Salomon31853842017-03-28 16:32:05 -0400287 TEST_ASSERT(!xpi.fIgnoresInputColor);
288 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700289 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
Greg Daniel79cdf282017-05-22 15:56:22 -0400290 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
291 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700292 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
293 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
Greg Daniel79cdf282017-05-22 15:56:22 -0400294 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700295 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
296 break;
297 default:
298 ERRORF(reporter, "Invalid xfermode.");
299 break;
300 }
301 }
302}
cdalton6fd158e2015-05-27 15:08:33 -0700303static void test_color_unknown_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomona811b122017-03-30 08:21:32 -0400304 GrProcessorAnalysisColor inputColor = GrProcessorAnalysisColor::Opaque::kNo;
305 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kSingleChannel;
cdalton6fd158e2015-05-27 15:08:33 -0700306
Mike Reed7d954ad2016-10-28 15:42:34 -0400307 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
308 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon31853842017-03-28 16:32:05 -0400309 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
cdalton6fd158e2015-05-27 15:08:33 -0700310 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400311 case SkBlendMode::kClear:
Brian Salomon31853842017-03-28 16:32:05 -0400312 TEST_ASSERT(xpi.fIgnoresInputColor);
313 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700314 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700315 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
316 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
317 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
318 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
319 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
320 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
321 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400322 case SkBlendMode::kSrc:
Brian Salomon31853842017-03-28 16:32:05 -0400323 TEST_ASSERT(!xpi.fIgnoresInputColor);
324 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700325 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700326 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
327 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
328 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
329 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
330 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
331 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
332 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400333 case SkBlendMode::kDst:
Brian Salomon31853842017-03-28 16:32:05 -0400334 TEST_ASSERT(xpi.fIgnoresInputColor);
335 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700336 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700337 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
338 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
339 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
340 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
341 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
342 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
343 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400344 case SkBlendMode::kSrcOver:
Brian Salomon31853842017-03-28 16:32:05 -0400345 TEST_ASSERT(!xpi.fIgnoresInputColor);
346 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700347 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700348 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
349 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
350 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
351 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
352 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
353 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
354 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400355 case SkBlendMode::kDstOver:
Brian Salomon31853842017-03-28 16:32:05 -0400356 TEST_ASSERT(!xpi.fIgnoresInputColor);
357 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700358 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700359 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
360 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
361 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
362 TEST_ASSERT(kIDA_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::kSrcIn:
Brian Salomon31853842017-03-28 16:32:05 -0400367 TEST_ASSERT(!xpi.fIgnoresInputColor);
368 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700369 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700370 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
371 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
372 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
373 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
374 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
375 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
376 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400377 case SkBlendMode::kDstIn:
Brian Salomon31853842017-03-28 16:32:05 -0400378 TEST_ASSERT(!xpi.fIgnoresInputColor);
379 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700380 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700381 TEST_ASSERT(kISAModulate_OutputType == xpi.fPrimaryOutputType);
382 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
383 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
384 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
385 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
386 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
387 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400388 case SkBlendMode::kSrcOut:
Brian Salomon31853842017-03-28 16:32:05 -0400389 TEST_ASSERT(!xpi.fIgnoresInputColor);
390 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700391 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700392 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
393 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
394 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
395 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
396 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
397 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
398 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400399 case SkBlendMode::kDstOut:
Brian Salomon31853842017-03-28 16:32:05 -0400400 TEST_ASSERT(!xpi.fIgnoresInputColor);
401 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700402 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700403 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
404 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
405 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
406 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
407 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
408 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
409 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400410 case SkBlendMode::kSrcATop:
Brian Salomon31853842017-03-28 16:32:05 -0400411 TEST_ASSERT(!xpi.fIgnoresInputColor);
412 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700413 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700414 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
415 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
416 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
417 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
418 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
419 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
420 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400421 case SkBlendMode::kDstATop:
Brian Salomon31853842017-03-28 16:32:05 -0400422 TEST_ASSERT(!xpi.fIgnoresInputColor);
423 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700424 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700425 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
426 TEST_ASSERT(kISAModulate_OutputType == xpi.fSecondaryOutputType);
427 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
428 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
429 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
430 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
431 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400432 case SkBlendMode::kXor:
Brian Salomon31853842017-03-28 16:32:05 -0400433 TEST_ASSERT(!xpi.fIgnoresInputColor);
434 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700435 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700436 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
437 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
438 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
439 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
440 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
441 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
442 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400443 case SkBlendMode::kPlus:
Brian Salomon31853842017-03-28 16:32:05 -0400444 TEST_ASSERT(!xpi.fIgnoresInputColor);
445 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700446 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700447 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
448 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
449 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
450 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
451 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
452 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
453 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400454 case SkBlendMode::kModulate:
Brian Salomon31853842017-03-28 16:32:05 -0400455 TEST_ASSERT(!xpi.fIgnoresInputColor);
456 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700457 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700458 TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType);
459 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
460 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
461 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
462 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
463 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
464 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400465 case SkBlendMode::kScreen:
Brian Salomon31853842017-03-28 16:32:05 -0400466 TEST_ASSERT(!xpi.fIgnoresInputColor);
467 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700468 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700469 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
470 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
471 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
472 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
473 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
474 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
475 break;
476 default:
477 ERRORF(reporter, "Invalid xfermode.");
478 break;
479 }
480 }
481}
482
Brian Salomon31853842017-03-28 16:32:05 -0400483static void test_color_not_opaque_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Osmancf860852018-10-31 14:04:39 -0400484 GrProcessorAnalysisColor inputColor(
485 SkPMColor4f::FromBytes_RGBA(GrColorPackRGBA(229, 0, 154, 240)));
Brian Salomona811b122017-03-30 08:21:32 -0400486 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kNone;
cdalton6fd158e2015-05-27 15:08:33 -0700487
Mike Reed7d954ad2016-10-28 15:42:34 -0400488 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
489 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon31853842017-03-28 16:32:05 -0400490 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
cdalton6fd158e2015-05-27 15:08:33 -0700491 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400492 case SkBlendMode::kClear:
Brian Salomon31853842017-03-28 16:32:05 -0400493 TEST_ASSERT(xpi.fIgnoresInputColor);
Greg Danielc5296812020-02-28 13:06:02 -0500494 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700495 TEST_ASSERT(xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700496 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
497 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
498 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
499 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
500 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
501 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
502 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400503 case SkBlendMode::kSrc:
Brian Salomon31853842017-03-28 16:32:05 -0400504 TEST_ASSERT(!xpi.fIgnoresInputColor);
Greg Danielc5296812020-02-28 13:06:02 -0500505 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700506 TEST_ASSERT(xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700507 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
508 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
509 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
510 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
511 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
512 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
513 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400514 case SkBlendMode::kDst:
Brian Salomon31853842017-03-28 16:32:05 -0400515 TEST_ASSERT(xpi.fIgnoresInputColor);
516 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700517 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700518 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
519 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
520 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
521 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
522 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
523 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
524 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400525 case SkBlendMode::kSrcOver:
Brian Salomon31853842017-03-28 16:32:05 -0400526 TEST_ASSERT(!xpi.fIgnoresInputColor);
527 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700528 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700529 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
530 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
531 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
532 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
533 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
534 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
535 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400536 case SkBlendMode::kDstOver:
Brian Salomon31853842017-03-28 16:32:05 -0400537 TEST_ASSERT(!xpi.fIgnoresInputColor);
538 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700539 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700540 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
541 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
542 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
543 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
544 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
545 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
546 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400547 case SkBlendMode::kSrcIn:
Brian Salomon31853842017-03-28 16:32:05 -0400548 TEST_ASSERT(!xpi.fIgnoresInputColor);
Greg Danielc5296812020-02-28 13:06:02 -0500549 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700550 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700551 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
552 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
553 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
554 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
555 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
556 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
557 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400558 case SkBlendMode::kDstIn:
Brian Salomon31853842017-03-28 16:32:05 -0400559 TEST_ASSERT(!xpi.fIgnoresInputColor);
Greg Danielc5296812020-02-28 13:06:02 -0500560 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700561 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700562 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
563 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
564 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
565 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
566 TEST_ASSERT(kSA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
567 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
568 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400569 case SkBlendMode::kSrcOut:
Brian Salomon31853842017-03-28 16:32:05 -0400570 TEST_ASSERT(!xpi.fIgnoresInputColor);
Greg Danielc5296812020-02-28 13:06:02 -0500571 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700572 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700573 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
574 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
575 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
576 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
577 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
578 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
579 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400580 case SkBlendMode::kDstOut:
Brian Salomon31853842017-03-28 16:32:05 -0400581 TEST_ASSERT(!xpi.fIgnoresInputColor);
582 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700583 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700584 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
585 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
586 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
587 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
588 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
589 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
590 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400591 case SkBlendMode::kSrcATop:
Brian Salomon31853842017-03-28 16:32:05 -0400592 TEST_ASSERT(!xpi.fIgnoresInputColor);
593 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700594 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
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(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
599 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
600 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
601 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400602 case SkBlendMode::kDstATop:
Brian Salomon31853842017-03-28 16:32:05 -0400603 TEST_ASSERT(!xpi.fIgnoresInputColor);
Greg Danielc5296812020-02-28 13:06:02 -0500604 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700605 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700606 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
607 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
608 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
609 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
610 TEST_ASSERT(kSA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
611 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
612 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400613 case SkBlendMode::kXor:
Brian Salomon31853842017-03-28 16:32:05 -0400614 TEST_ASSERT(!xpi.fIgnoresInputColor);
615 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700616 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700617 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
618 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
619 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
620 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
621 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
622 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
623 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400624 case SkBlendMode::kPlus:
Brian Salomon31853842017-03-28 16:32:05 -0400625 TEST_ASSERT(!xpi.fIgnoresInputColor);
626 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700627 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700628 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
629 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
630 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
631 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
632 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
633 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
634 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400635 case SkBlendMode::kModulate:
Brian Salomon31853842017-03-28 16:32:05 -0400636 TEST_ASSERT(!xpi.fIgnoresInputColor);
Greg Danielc5296812020-02-28 13:06:02 -0500637 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700638 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700639 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
640 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
641 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
642 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
643 TEST_ASSERT(kSC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
644 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
645 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400646 case SkBlendMode::kScreen:
Brian Salomon31853842017-03-28 16:32:05 -0400647 TEST_ASSERT(!xpi.fIgnoresInputColor);
648 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700649 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700650 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
651 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
652 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
653 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
654 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
655 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
656 break;
657 default:
658 ERRORF(reporter, "Invalid xfermode.");
659 break;
660 }
661 }
662}
663
664static void test_color_opaque_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomona811b122017-03-30 08:21:32 -0400665 GrProcessorAnalysisColor inputColor = GrProcessorAnalysisColor::Opaque::kYes;
666 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kSingleChannel;
cdalton6fd158e2015-05-27 15:08:33 -0700667
Mike Reed7d954ad2016-10-28 15:42:34 -0400668 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
669 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon31853842017-03-28 16:32:05 -0400670 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
cdalton6fd158e2015-05-27 15:08:33 -0700671 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400672 case SkBlendMode::kClear:
Brian Salomon31853842017-03-28 16:32:05 -0400673 TEST_ASSERT(xpi.fIgnoresInputColor);
674 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700675 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700676 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
677 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
678 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
679 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
680 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
681 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
682 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400683 case SkBlendMode::kSrc:
Brian Salomon31853842017-03-28 16:32:05 -0400684 TEST_ASSERT(!xpi.fIgnoresInputColor);
685 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700686 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700687 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
688 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
689 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
690 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
691 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
692 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
693 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400694 case SkBlendMode::kDst:
Brian Salomon31853842017-03-28 16:32:05 -0400695 TEST_ASSERT(xpi.fIgnoresInputColor);
696 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700697 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700698 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
699 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
700 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
701 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
702 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
703 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
704 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400705 case SkBlendMode::kSrcOver:
Brian Salomon31853842017-03-28 16:32:05 -0400706 TEST_ASSERT(!xpi.fIgnoresInputColor);
707 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700708 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700709 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
710 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
711 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
712 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
713 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
714 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
715 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400716 case SkBlendMode::kDstOver:
Brian Salomon31853842017-03-28 16:32:05 -0400717 TEST_ASSERT(!xpi.fIgnoresInputColor);
718 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700719 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
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(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
724 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
725 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
726 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400727 case SkBlendMode::kSrcIn:
Brian Salomon31853842017-03-28 16:32:05 -0400728 TEST_ASSERT(!xpi.fIgnoresInputColor);
729 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700730 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700731 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
732 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
733 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
734 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
735 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
736 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
737 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400738 case SkBlendMode::kDstIn:
Brian Salomon31853842017-03-28 16:32:05 -0400739 TEST_ASSERT(xpi.fIgnoresInputColor);
740 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700741 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700742 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
743 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
744 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
745 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
746 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
747 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
748 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400749 case SkBlendMode::kSrcOut:
Brian Salomon31853842017-03-28 16:32:05 -0400750 TEST_ASSERT(!xpi.fIgnoresInputColor);
751 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700752 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700753 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
754 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
755 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
756 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
757 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
758 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
759 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400760 case SkBlendMode::kDstOut:
Brian Salomon31853842017-03-28 16:32:05 -0400761 TEST_ASSERT(xpi.fIgnoresInputColor);
762 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700763 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700764 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
765 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
766 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
767 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
768 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
769 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
770 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400771 case SkBlendMode::kSrcATop:
Brian Salomon31853842017-03-28 16:32:05 -0400772 TEST_ASSERT(!xpi.fIgnoresInputColor);
773 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700774 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700775 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
776 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
777 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
778 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
779 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
780 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
781 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400782 case SkBlendMode::kDstATop:
Brian Salomon31853842017-03-28 16:32:05 -0400783 TEST_ASSERT(!xpi.fIgnoresInputColor);
784 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700785 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700786 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
787 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
788 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
789 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
790 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
791 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
792 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400793 case SkBlendMode::kXor:
Brian Salomon31853842017-03-28 16:32:05 -0400794 TEST_ASSERT(!xpi.fIgnoresInputColor);
795 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700796 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700797 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
798 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
799 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
800 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
801 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
802 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
803 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400804 case SkBlendMode::kPlus:
Brian Salomon31853842017-03-28 16:32:05 -0400805 TEST_ASSERT(!xpi.fIgnoresInputColor);
806 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700807 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700808 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
809 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
810 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
811 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
812 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
813 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
814 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400815 case SkBlendMode::kModulate:
Brian Salomon31853842017-03-28 16:32:05 -0400816 TEST_ASSERT(!xpi.fIgnoresInputColor);
cdalton6fd158e2015-05-27 15:08:33 -0700817 TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType);
818 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
819 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
820 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
821 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
822 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
823 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400824 case SkBlendMode::kScreen:
Brian Salomon31853842017-03-28 16:32:05 -0400825 TEST_ASSERT(!xpi.fIgnoresInputColor);
826 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700827 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700828 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
829 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
830 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
831 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
832 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
833 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
834 break;
835 default:
836 ERRORF(reporter, "Invalid xfermode.");
837 break;
838 }
839 }
840}
841
842static void test_color_opaque_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomona811b122017-03-30 08:21:32 -0400843 GrProcessorAnalysisColor inputColor = GrProcessorAnalysisColor::Opaque::kYes;
844 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kNone;
cdalton6fd158e2015-05-27 15:08:33 -0700845
Mike Reed7d954ad2016-10-28 15:42:34 -0400846 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
847 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon31853842017-03-28 16:32:05 -0400848 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
cdalton6fd158e2015-05-27 15:08:33 -0700849
850 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400851 case SkBlendMode::kClear:
Brian Salomon31853842017-03-28 16:32:05 -0400852 TEST_ASSERT(xpi.fIgnoresInputColor);
Greg Danielc5296812020-02-28 13:06:02 -0500853 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700854 TEST_ASSERT(xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700855 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
856 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
857 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
858 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
859 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
860 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
861 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400862 case SkBlendMode::kSrc:
Brian Salomon31853842017-03-28 16:32:05 -0400863 TEST_ASSERT(!xpi.fIgnoresInputColor);
Greg Danielc5296812020-02-28 13:06:02 -0500864 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700865 TEST_ASSERT(xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700866 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
867 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
868 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
869 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
870 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
871 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
872 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400873 case SkBlendMode::kDst:
Brian Salomon31853842017-03-28 16:32:05 -0400874 TEST_ASSERT(xpi.fIgnoresInputColor);
875 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700876 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700877 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
878 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
879 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
880 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
881 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
882 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
883 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400884 case SkBlendMode::kSrcOver:
Brian Salomon28207df2017-06-05 12:25:13 -0400885 // We don't specialize opaque src-over. See note in GrPorterDuffXferProcessor.cpp
Brian Salomon31853842017-03-28 16:32:05 -0400886 TEST_ASSERT(!xpi.fIgnoresInputColor);
Brian Salomon28207df2017-06-05 12:25:13 -0400887 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700888 TEST_ASSERT(xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700889 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
890 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
891 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
892 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
Greg Danielf6d60d32020-01-08 13:39:16 -0500893 if (caps.shouldCollapseSrcOverToSrcWhenAble()) {
894 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
895 } else {
896 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
897 }
cdalton6fd158e2015-05-27 15:08:33 -0700898 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
899 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400900 case SkBlendMode::kDstOver:
Brian Salomon31853842017-03-28 16:32:05 -0400901 TEST_ASSERT(!xpi.fIgnoresInputColor);
902 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700903 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700904 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
905 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
906 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
907 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
908 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
909 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
910 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400911 case SkBlendMode::kSrcIn:
Brian Salomon31853842017-03-28 16:32:05 -0400912 TEST_ASSERT(!xpi.fIgnoresInputColor);
Greg Danielc5296812020-02-28 13:06:02 -0500913 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700914 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700915 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
916 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
917 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
918 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
919 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
920 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
921 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400922 case SkBlendMode::kDstIn:
Brian Salomon31853842017-03-28 16:32:05 -0400923 TEST_ASSERT(xpi.fIgnoresInputColor);
924 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700925 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700926 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
927 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
928 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
929 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
930 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
931 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
932 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400933 case SkBlendMode::kSrcOut:
Brian Salomon31853842017-03-28 16:32:05 -0400934 TEST_ASSERT(!xpi.fIgnoresInputColor);
Greg Danielc5296812020-02-28 13:06:02 -0500935 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700936 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700937 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
938 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
939 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
940 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
941 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
942 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
943 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400944 case SkBlendMode::kDstOut:
Brian Salomon31853842017-03-28 16:32:05 -0400945 TEST_ASSERT(xpi.fIgnoresInputColor);
Greg Danielc5296812020-02-28 13:06:02 -0500946 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700947 TEST_ASSERT(xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700948 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
949 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
950 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
951 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
952 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
953 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
954 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400955 case SkBlendMode::kSrcATop:
Brian Salomon31853842017-03-28 16:32:05 -0400956 TEST_ASSERT(!xpi.fIgnoresInputColor);
Greg Danielc5296812020-02-28 13:06:02 -0500957 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700958 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700959 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
960 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
961 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
962 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
963 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
964 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
965 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400966 case SkBlendMode::kDstATop:
Brian Salomon31853842017-03-28 16:32:05 -0400967 TEST_ASSERT(!xpi.fIgnoresInputColor);
968 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700969 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700970 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
971 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
972 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
973 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
974 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
975 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
976 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400977 case SkBlendMode::kXor:
Brian Salomon31853842017-03-28 16:32:05 -0400978 TEST_ASSERT(!xpi.fIgnoresInputColor);
Greg Danielc5296812020-02-28 13:06:02 -0500979 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700980 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700981 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
982 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
983 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
984 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
985 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
986 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
987 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400988 case SkBlendMode::kPlus:
Brian Salomon31853842017-03-28 16:32:05 -0400989 TEST_ASSERT(!xpi.fIgnoresInputColor);
990 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -0700991 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -0700992 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
993 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
994 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
995 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
996 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
997 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
998 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400999 case SkBlendMode::kModulate:
Brian Salomon31853842017-03-28 16:32:05 -04001000 TEST_ASSERT(!xpi.fIgnoresInputColor);
Greg Danielc5296812020-02-28 13:06:02 -05001001 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -07001002 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -07001003 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
1004 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
1005 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
1006 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
1007 TEST_ASSERT(kSC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
1008 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
1009 break;
Mike Reed7d954ad2016-10-28 15:42:34 -04001010 case SkBlendMode::kScreen:
Brian Salomon31853842017-03-28 16:32:05 -04001011 TEST_ASSERT(!xpi.fIgnoresInputColor);
1012 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
Chris Daltonf2fb80f2020-12-03 12:37:59 -07001013 TEST_ASSERT(!xpi.fUnaffectedByDstValue);
cdalton6fd158e2015-05-27 15:08:33 -07001014 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
1015 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
1016 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
1017 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
1018 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
1019 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
1020 break;
1021 default:
1022 ERRORF(reporter, "Invalid xfermode.");
1023 break;
1024 }
1025 }
1026}
1027
egdaniel723b0502015-09-15 09:31:40 -07001028static void test_lcd_coverage_fallback_case(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Osman5ced0bf2019-03-15 10:15:29 -04001029 constexpr GrClampType autoClamp = GrClampType::kAuto;
Brian Salomon31853842017-03-28 16:32:05 -04001030 const GrXPFactory* xpf = GrPorterDuffXPFactory::Get(SkBlendMode::kSrcOver);
Brian Osmancf860852018-10-31 14:04:39 -04001031 GrProcessorAnalysisColor color = SkPMColor4f::FromBytes_RGBA(GrColorPackRGBA(123, 45, 67, 255));
Brian Salomona811b122017-03-30 08:21:32 -04001032 GrProcessorAnalysisCoverage coverage = GrProcessorAnalysisCoverage::kLCD;
Chris Dalton57ab06c2021-04-22 12:57:28 -06001033 TEST_ASSERT(!(GrXPFactory::GetAnalysisProperties(xpf, color, coverage, caps, autoClamp) &
Greg Daniel6ebe4b92017-05-19 10:56:46 -04001034 GrXPFactory::AnalysisProperties::kRequiresDstTexture));
1035 sk_sp<const GrXferProcessor> xp_opaque(
Chris Dalton57ab06c2021-04-22 12:57:28 -06001036 GrXPFactory::MakeXferProcessor(xpf, color, coverage, caps, autoClamp));
Greg Daniel6ebe4b92017-05-19 10:56:46 -04001037 if (!xp_opaque) {
1038 ERRORF(reporter, "Failed to create an XP with LCD coverage.");
1039 return;
1040 }
1041
Chris Daltonbbb3f642019-07-24 12:25:08 -04001042 GrXferProcessor::BlendInfo blendInfo = xp_opaque->getBlendInfo();
Greg Daniel6ebe4b92017-05-19 10:56:46 -04001043 TEST_ASSERT(blendInfo.fWriteColor);
1044
1045 // Test with non-opaque alpha
Brian Osmancf860852018-10-31 14:04:39 -04001046 color = SkPMColor4f::FromBytes_RGBA(GrColorPackRGBA(123, 45, 67, 221));
Greg Daniel6ebe4b92017-05-19 10:56:46 -04001047 coverage = GrProcessorAnalysisCoverage::kLCD;
Chris Dalton57ab06c2021-04-22 12:57:28 -06001048 TEST_ASSERT(!(GrXPFactory::GetAnalysisProperties(xpf, color, coverage, caps, autoClamp) &
Greg Danield7b11592017-06-14 13:37:12 -04001049 GrXPFactory::AnalysisProperties::kRequiresDstTexture));
Brian Salomond61c9d92017-04-10 10:54:25 -04001050 sk_sp<const GrXferProcessor> xp(
Chris Dalton57ab06c2021-04-22 12:57:28 -06001051 GrXPFactory::MakeXferProcessor(xpf, color, coverage, caps, autoClamp));
cdalton6fd158e2015-05-27 15:08:33 -07001052 if (!xp) {
1053 ERRORF(reporter, "Failed to create an XP with LCD coverage.");
1054 return;
1055 }
1056
Chris Daltonbbb3f642019-07-24 12:25:08 -04001057 blendInfo = xp->getBlendInfo();
cdalton6fd158e2015-05-27 15:08:33 -07001058 TEST_ASSERT(blendInfo.fWriteColor);
1059}
1060
Brian Salomondcfca432017-11-15 15:48:03 -05001061DEF_GPUTEST(PorterDuffNoDualSourceBlending, reporter, options) {
1062 GrContextOptions opts = options;
cdalton6fd158e2015-05-27 15:08:33 -07001063 opts.fSuppressDualSourceBlending = true;
bsalomon3724e572016-03-30 18:56:19 -07001064 sk_gpu_test::GrContextFactory mockFactory(opts);
Robert Phillips6d344c32020-07-06 10:56:46 -04001065 auto ctx = mockFactory.get(sk_gpu_test::GrContextFactory::kMock_ContextType);
cdalton6fd158e2015-05-27 15:08:33 -07001066 if (!ctx) {
Brian Osman7c597742019-03-26 11:10:11 -04001067 SK_ABORT("Failed to create mock context without ARB_blend_func_extended.");
cdalton6fd158e2015-05-27 15:08:33 -07001068 }
1069
Robert Phillips9da87e02019-02-04 13:26:26 -05001070 GrProxyProvider* proxyProvider = ctx->priv().proxyProvider();
1071 const GrCaps& caps = *ctx->priv().caps();
cdalton6fd158e2015-05-27 15:08:33 -07001072 if (caps.shaderCaps()->dualSourceBlendingSupport()) {
Brian Osman7c597742019-03-26 11:10:11 -04001073 SK_ABORT("Mock context failed to honor request for no ARB_blend_func_extended.");
cdalton6fd158e2015-05-27 15:08:33 -07001074 }
1075
Brian Salomon72050802020-10-12 20:45:06 -04001076 auto mbet = sk_gpu_test::ManagedBackendTexture::MakeWithoutData(
1077 ctx, 100, 100, kRGBA_8888_SkColorType, GrMipmapped::kNo, GrRenderable::kNo);
Brian Salomon88d7e622020-11-05 11:11:20 -05001078 if (!mbet) {
1079 ERRORF(reporter, "Could not make texture.");
1080 return;
1081 }
John Stiles52cb1d02021-06-02 11:58:05 -04001082 GrDstProxyView fakeDstProxyView;
Robert Phillipsbb581ce2017-05-29 15:05:15 -04001083 {
Brian Salomonc67c31c2018-12-06 10:00:03 -05001084 sk_sp<GrTextureProxy> proxy = proxyProvider->wrapBackendTexture(
Brian Salomon72050802020-10-12 20:45:06 -04001085 mbet->texture(), kBorrow_GrWrapOwnership, GrWrapCacheable::kNo, kRead_GrIOType,
1086 mbet->refCountedCallback());
1087 GrSwizzle swizzle =
1088 caps.getReadSwizzle(mbet->texture().getBackendFormat(), GrColorType::kRGBA_8888);
Greg Daniel524e28b2019-11-01 11:48:53 -04001089 fakeDstProxyView.setProxyView({std::move(proxy), kTopLeft_GrSurfaceOrigin, swizzle});
Robert Phillipsbb581ce2017-05-29 15:05:15 -04001090 }
cdalton6fd158e2015-05-27 15:08:33 -07001091
Brian Salomona811b122017-03-30 08:21:32 -04001092 static const GrProcessorAnalysisColor colorInputs[] = {
1093 GrProcessorAnalysisColor::Opaque::kNo, GrProcessorAnalysisColor::Opaque::kYes,
Brian Osmancf860852018-10-31 14:04:39 -04001094 GrProcessorAnalysisColor(SkPMColor4f::FromBytes_RGBA(GrColorPackRGBA(0, 82, 17, 100))),
1095 GrProcessorAnalysisColor(SkPMColor4f::FromBytes_RGBA(GrColorPackRGBA(0, 82, 17, 255)))};
cdalton6fd158e2015-05-27 15:08:33 -07001096
Brian Salomonc6b71462017-02-14 11:33:01 -05001097 for (const auto& colorInput : colorInputs) {
Brian Salomona811b122017-03-30 08:21:32 -04001098 for (GrProcessorAnalysisCoverage coverageType :
1099 {GrProcessorAnalysisCoverage::kSingleChannel, GrProcessorAnalysisCoverage::kNone}) {
Mike Reed7d954ad2016-10-28 15:42:34 -04001100 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
1101 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomona1633922017-01-09 11:46:10 -05001102 const GrXPFactory* xpf = GrPorterDuffXPFactory::Get(xfermode);
Brian Salomond61c9d92017-04-10 10:54:25 -04001103 sk_sp<const GrXferProcessor> xp(
Chris Dalton57ab06c2021-04-22 12:57:28 -06001104 GrXPFactory::MakeXferProcessor(xpf, colorInput, coverageType, caps,
Brian Osman5ced0bf2019-03-15 10:15:29 -04001105 GrClampType::kAuto));
cdalton6fd158e2015-05-27 15:08:33 -07001106 if (!xp) {
1107 ERRORF(reporter, "Failed to create an XP without dual source blending.");
1108 return;
1109 }
1110 TEST_ASSERT(!xp->hasSecondaryOutput());
cdalton6fd158e2015-05-27 15:08:33 -07001111 }
1112 }
1113 }
cdalton6fd158e2015-05-27 15:08:33 -07001114}