blob: 435459b2c10747e7e9b6c97941c4da192157a97b [file] [log] [blame]
cdalton6fd158e2015-05-27 15:08:33 -07001/*
2 * Copyright 2015 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
cdalton6fd158e2015-05-27 15:08:33 -07008#include "Test.h"
9
Herb Derbyd3895d82018-09-04 13:27:00 -040010#include "GrBackendSurface.h"
cdalton6fd158e2015-05-27 15:08:33 -070011#include "GrContextFactory.h"
12#include "GrContextOptions.h"
Greg Daniel7ef28f32017-04-20 16:41:55 +000013#include "GrContextPriv.h"
cdalton6fd158e2015-05-27 15:08:33 -070014#include "GrGpu.h"
Robert Phillips0bd24dc2018-01-16 08:06:32 -050015#include "GrProxyProvider.h"
cdalton6fd158e2015-05-27 15:08:33 -070016#include "GrXferProcessor.h"
17#include "effects/GrPorterDuffXferProcessor.h"
18#include "gl/GrGLCaps.h"
Brian Salomon89527432016-12-16 09:52:16 -050019#include "ops/GrMeshDrawOp.h"
cdalton6fd158e2015-05-27 15:08:33 -070020
21////////////////////////////////////////////////////////////////////////////////
22
23static void test_color_unknown_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps);
Brian Salomon31853842017-03-28 16:32:05 -040024static void test_color_not_opaque_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps);
cdalton6fd158e2015-05-27 15:08:33 -070025static void test_color_opaque_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps);
26static void test_color_opaque_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps);
27static void test_lcd_coverage(skiatest::Reporter* reporter, const GrCaps& caps);
egdaniel723b0502015-09-15 09:31:40 -070028static void test_lcd_coverage_fallback_case(skiatest::Reporter* reporter, const GrCaps& caps);
cdalton6fd158e2015-05-27 15:08:33 -070029
bsalomon758586c2016-04-06 14:02:39 -070030DEF_GPUTEST_FOR_NULLGL_CONTEXT(GrPorterDuff, reporter, ctxInfo) {
Robert Phillips9da87e02019-02-04 13:26:26 -050031 const GrCaps& caps = *ctxInfo.grContext()->priv().getGpu()->caps();
cdalton6fd158e2015-05-27 15:08:33 -070032 if (!caps.shaderCaps()->dualSourceBlendingSupport()) {
Ben Wagnerb4aab9a2017-08-16 10:53:04 -040033 SK_ABORT("Null context does not support dual source blending.");
cdalton6fd158e2015-05-27 15:08:33 -070034 return;
35 }
36
37 test_color_unknown_with_coverage(reporter, caps);
Brian Salomon31853842017-03-28 16:32:05 -040038 test_color_not_opaque_no_coverage(reporter, caps);
cdalton6fd158e2015-05-27 15:08:33 -070039 test_color_opaque_with_coverage(reporter, caps);
40 test_color_opaque_no_coverage(reporter, caps);
41 test_lcd_coverage(reporter, caps);
egdaniel723b0502015-09-15 09:31:40 -070042 test_lcd_coverage_fallback_case(reporter, caps);
cdalton6fd158e2015-05-27 15:08:33 -070043}
44
45////////////////////////////////////////////////////////////////////////////////
46
47#define TEST_ASSERT(...) REPORTER_ASSERT(reporter, __VA_ARGS__)
48
49enum {
50 kNone_OutputType,
51 kCoverage_OutputType,
52 kModulate_OutputType,
egdaniel723b0502015-09-15 09:31:40 -070053 kSAModulate_OutputType,
cdalton6fd158e2015-05-27 15:08:33 -070054 kISAModulate_OutputType,
55 kISCModulate_OutputType
56};
Greg Daniel79cdf282017-05-22 15:56:22 -040057static const int kInvalid_OutputType = -1;
cdalton6fd158e2015-05-27 15:08:33 -070058
Brian Salomon48d1b4c2017-04-08 07:38:53 -040059static GrProcessorSet::Analysis do_analysis(const GrXPFactory* xpf,
60 const GrProcessorAnalysisColor& colorInput,
61 GrProcessorAnalysisCoverage coverageInput,
62 const GrCaps& caps) {
63 GrPaint paint;
64 paint.setXPFactory(xpf);
65 GrProcessorSet procs(std::move(paint));
Brian Osmancf860852018-10-31 14:04:39 -040066 SkPMColor4f overrideColor;
Chris Daltonb8fff0d2019-03-05 10:11:58 -070067 GrProcessorSet::Analysis analysis = procs.finalize(
68 colorInput, coverageInput, nullptr, &GrUserStencilSettings::kUnused, GrFSAAType::kNone,
Brian Osman5ced0bf2019-03-15 10:15:29 -040069 caps, GrClampType::kAuto, &overrideColor);
Brian Salomon48d1b4c2017-04-08 07:38:53 -040070 return analysis;
71}
72
cdalton6fd158e2015-05-27 15:08:33 -070073class GrPorterDuffTest {
74public:
75 struct XPInfo {
Mike Reed7d954ad2016-10-28 15:42:34 -040076 XPInfo(skiatest::Reporter* reporter, SkBlendMode xfermode, const GrCaps& caps,
Brian Salomona811b122017-03-30 08:21:32 -040077 GrProcessorAnalysisColor inputColor, GrProcessorAnalysisCoverage inputCoverage) {
Brian Salomona1633922017-01-09 11:46:10 -050078 const GrXPFactory* xpf = GrPorterDuffXPFactory::Get(xfermode);
Brian Salomon48d1b4c2017-04-08 07:38:53 -040079
Greg Daniel79cdf282017-05-22 15:56:22 -040080 bool isLCD = GrProcessorAnalysisCoverage::kLCD == inputCoverage;
81
Brian Salomon48d1b4c2017-04-08 07:38:53 -040082 GrProcessorSet::Analysis analysis = do_analysis(xpf, inputColor, inputCoverage, caps);
Brian Salomon31853842017-03-28 16:32:05 -040083 fCompatibleWithCoverageAsAlpha = analysis.isCompatibleWithCoverageAsAlpha();
Brian Salomon48d1b4c2017-04-08 07:38:53 -040084 fIgnoresInputColor = analysis.inputColorIsIgnored();
Brian Salomond61c9d92017-04-10 10:54:25 -040085 sk_sp<const GrXferProcessor> xp(
Brian Osman5ced0bf2019-03-15 10:15:29 -040086 GrXPFactory::MakeXferProcessor(xpf, inputColor, inputCoverage, false, caps,
87 GrClampType::kAuto));
Greg Daniel79cdf282017-05-22 15:56:22 -040088 TEST_ASSERT(!analysis.requiresDstTexture() ||
89 (isLCD &&
90 !caps.shaderCaps()->dstReadInShaderSupport() &&
91 (SkBlendMode::kSrcOver != xfermode ||
92 !inputColor.isOpaque())));
Chris Dalton945ee652019-01-23 09:10:36 -070093 // Porter Duff modes currently only use fixed-function or shader blending, and Ganesh
94 // doesn't yet make use of framebuffer fetches that require a barrier
95 // (e.g., QCOM_shader_framebuffer_fetch_noncoherent). So dst textures and xfer barriers
96 // should always go hand in hand for Porter Duff modes.
97 TEST_ASSERT(analysis.requiresDstTexture() == analysis.requiresNonOverlappingDraws());
Hal Canary342b7ac2016-11-04 11:49:42 -040098 GetXPOutputTypes(xp.get(), &fPrimaryOutputType, &fSecondaryOutputType);
cdalton6fd158e2015-05-27 15:08:33 -070099 xp->getBlendInfo(&fBlendInfo);
Greg Daniel79cdf282017-05-22 15:56:22 -0400100 TEST_ASSERT(!xp->willReadDstColor() ||
101 (isLCD && (SkBlendMode::kSrcOver != xfermode ||
102 !inputColor.isOpaque())));
cdalton6fd158e2015-05-27 15:08:33 -0700103 TEST_ASSERT(xp->hasSecondaryOutput() == GrBlendCoeffRefsSrc2(fBlendInfo.fDstBlend));
104 }
105
Brian Salomon31853842017-03-28 16:32:05 -0400106 bool fCompatibleWithCoverageAsAlpha;
107 bool fIgnoresInputColor;
cdalton6fd158e2015-05-27 15:08:33 -0700108 int fPrimaryOutputType;
109 int fSecondaryOutputType;
110 GrXferProcessor::BlendInfo fBlendInfo;
111 };
112
113 static void GetXPOutputTypes(const GrXferProcessor* xp, int* outPrimary, int* outSecondary) {
egdanielf2342722015-11-20 15:12:59 -0800114 GrPorterDuffXPFactory::TestGetXPOutputTypes(xp, outPrimary, outSecondary);
cdalton6fd158e2015-05-27 15:08:33 -0700115 }
116};
117
egdaniel723b0502015-09-15 09:31:40 -0700118static void test_lcd_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Greg Daniel6ebe4b92017-05-19 10:56:46 -0400119 GrProcessorAnalysisColor inputColor = GrProcessorAnalysisColor::Opaque::kYes;
Brian Salomona811b122017-03-30 08:21:32 -0400120 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kLCD;
egdaniel723b0502015-09-15 09:31:40 -0700121
Mike Reed7d954ad2016-10-28 15:42:34 -0400122 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
123 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon31853842017-03-28 16:32:05 -0400124 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
egdaniel723b0502015-09-15 09:31:40 -0700125 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400126 case SkBlendMode::kClear:
Brian Salomon31853842017-03-28 16:32:05 -0400127 TEST_ASSERT(xpi.fIgnoresInputColor);
128 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400129 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
130 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
131 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
132 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
133 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700134 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
135 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400136 case SkBlendMode::kSrc:
Brian Salomon31853842017-03-28 16:32:05 -0400137 TEST_ASSERT(!xpi.fIgnoresInputColor);
138 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400139 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
140 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700141 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
142 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
Greg Daniel79cdf282017-05-22 15:56:22 -0400143 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700144 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
145 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400146 case SkBlendMode::kDst:
Brian Salomon31853842017-03-28 16:32:05 -0400147 TEST_ASSERT(xpi.fIgnoresInputColor);
148 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
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);
Greg Daniel79cdf282017-05-22 15:56:22 -0400152 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
153 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
154 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
egdaniel723b0502015-09-15 09:31:40 -0700155 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400156 case SkBlendMode::kSrcOver:
Brian Salomon31853842017-03-28 16:32:05 -0400157 TEST_ASSERT(!xpi.fIgnoresInputColor);
158 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
egdaniel723b0502015-09-15 09:31:40 -0700159 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
160 TEST_ASSERT(kSAModulate_OutputType == xpi.fSecondaryOutputType);
161 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
162 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
163 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
164 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
165 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400166 case SkBlendMode::kDstOver:
Brian Salomon31853842017-03-28 16:32:05 -0400167 TEST_ASSERT(!xpi.fIgnoresInputColor);
168 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400169 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
170 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700171 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400172 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
173 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700174 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
175 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400176 case SkBlendMode::kSrcIn:
Brian Salomon31853842017-03-28 16:32:05 -0400177 TEST_ASSERT(!xpi.fIgnoresInputColor);
178 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400179 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
180 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700181 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400182 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
183 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700184 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
185 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400186 case SkBlendMode::kDstIn:
Brian Salomon31853842017-03-28 16:32:05 -0400187 TEST_ASSERT(!xpi.fIgnoresInputColor);
188 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400189 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
190 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
191 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
192 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
193 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700194 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
195 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400196 case SkBlendMode::kSrcOut:
Brian Salomon31853842017-03-28 16:32:05 -0400197 TEST_ASSERT(!xpi.fIgnoresInputColor);
198 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400199 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
200 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700201 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400202 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
203 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700204 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
205 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400206 case SkBlendMode::kDstOut:
Brian Salomon31853842017-03-28 16:32:05 -0400207 TEST_ASSERT(!xpi.fIgnoresInputColor);
208 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400209 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
210 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700211 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400212 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
213 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700214 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
215 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400216 case SkBlendMode::kSrcATop:
Brian Salomon31853842017-03-28 16:32:05 -0400217 TEST_ASSERT(!xpi.fIgnoresInputColor);
218 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400219 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
220 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700221 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400222 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
223 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700224 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
225 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400226 case SkBlendMode::kDstATop:
Brian Salomon31853842017-03-28 16:32:05 -0400227 TEST_ASSERT(!xpi.fIgnoresInputColor);
228 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400229 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
230 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700231 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400232 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
233 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700234 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
235 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400236 case SkBlendMode::kXor:
Brian Salomon31853842017-03-28 16:32:05 -0400237 TEST_ASSERT(!xpi.fIgnoresInputColor);
238 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400239 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
240 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700241 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400242 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
243 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700244 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
245 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400246 case SkBlendMode::kPlus:
Brian Salomon31853842017-03-28 16:32:05 -0400247 TEST_ASSERT(!xpi.fIgnoresInputColor);
248 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400249 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
250 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700251 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
252 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
Greg Daniel79cdf282017-05-22 15:56:22 -0400253 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700254 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
255 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400256 case SkBlendMode::kModulate:
Brian Salomon31853842017-03-28 16:32:05 -0400257 TEST_ASSERT(!xpi.fIgnoresInputColor);
258 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400259 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
260 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
261 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
262 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::kScreen:
Brian Salomon31853842017-03-28 16:32:05 -0400267 TEST_ASSERT(!xpi.fIgnoresInputColor);
268 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400269 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
270 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700271 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
272 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
Greg Daniel79cdf282017-05-22 15:56:22 -0400273 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700274 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
275 break;
276 default:
277 ERRORF(reporter, "Invalid xfermode.");
278 break;
279 }
280 }
281}
cdalton6fd158e2015-05-27 15:08:33 -0700282static void test_color_unknown_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomona811b122017-03-30 08:21:32 -0400283 GrProcessorAnalysisColor inputColor = GrProcessorAnalysisColor::Opaque::kNo;
284 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kSingleChannel;
cdalton6fd158e2015-05-27 15:08:33 -0700285
Mike Reed7d954ad2016-10-28 15:42:34 -0400286 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
287 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon31853842017-03-28 16:32:05 -0400288 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
cdalton6fd158e2015-05-27 15:08:33 -0700289 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400290 case SkBlendMode::kClear:
Brian Salomon31853842017-03-28 16:32:05 -0400291 TEST_ASSERT(xpi.fIgnoresInputColor);
292 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700293 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
294 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
295 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
296 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
297 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
298 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
299 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400300 case SkBlendMode::kSrc:
Brian Salomon31853842017-03-28 16:32:05 -0400301 TEST_ASSERT(!xpi.fIgnoresInputColor);
302 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700303 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
304 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
305 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
306 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
307 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
308 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
309 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400310 case SkBlendMode::kDst:
Brian Salomon31853842017-03-28 16:32:05 -0400311 TEST_ASSERT(xpi.fIgnoresInputColor);
312 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700313 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
314 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
315 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
316 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
317 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
318 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
319 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400320 case SkBlendMode::kSrcOver:
Brian Salomon31853842017-03-28 16:32:05 -0400321 TEST_ASSERT(!xpi.fIgnoresInputColor);
322 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700323 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
324 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
325 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
326 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
327 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
328 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
329 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400330 case SkBlendMode::kDstOver:
Brian Salomon31853842017-03-28 16:32:05 -0400331 TEST_ASSERT(!xpi.fIgnoresInputColor);
332 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700333 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
334 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
335 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
336 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
337 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
338 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
339 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400340 case SkBlendMode::kSrcIn:
Brian Salomon31853842017-03-28 16:32:05 -0400341 TEST_ASSERT(!xpi.fIgnoresInputColor);
342 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700343 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
344 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
345 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
346 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
347 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
348 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
349 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400350 case SkBlendMode::kDstIn:
Brian Salomon31853842017-03-28 16:32:05 -0400351 TEST_ASSERT(!xpi.fIgnoresInputColor);
352 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700353 TEST_ASSERT(kISAModulate_OutputType == xpi.fPrimaryOutputType);
354 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
355 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
356 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
357 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
358 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
359 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400360 case SkBlendMode::kSrcOut:
Brian Salomon31853842017-03-28 16:32:05 -0400361 TEST_ASSERT(!xpi.fIgnoresInputColor);
362 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700363 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
364 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
365 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
366 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
367 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
368 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
369 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400370 case SkBlendMode::kDstOut:
Brian Salomon31853842017-03-28 16:32:05 -0400371 TEST_ASSERT(!xpi.fIgnoresInputColor);
372 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700373 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
374 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
375 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
376 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
377 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
378 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
379 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400380 case SkBlendMode::kSrcATop:
Brian Salomon31853842017-03-28 16:32:05 -0400381 TEST_ASSERT(!xpi.fIgnoresInputColor);
382 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700383 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
384 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
385 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
386 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
387 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
388 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
389 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400390 case SkBlendMode::kDstATop:
Brian Salomon31853842017-03-28 16:32:05 -0400391 TEST_ASSERT(!xpi.fIgnoresInputColor);
392 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700393 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
394 TEST_ASSERT(kISAModulate_OutputType == xpi.fSecondaryOutputType);
395 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
396 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
397 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
398 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
399 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400400 case SkBlendMode::kXor:
Brian Salomon31853842017-03-28 16:32:05 -0400401 TEST_ASSERT(!xpi.fIgnoresInputColor);
402 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
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(kIDA_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::kPlus:
Brian Salomon31853842017-03-28 16:32:05 -0400411 TEST_ASSERT(!xpi.fIgnoresInputColor);
412 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700413 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
414 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
415 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
416 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
417 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
418 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
419 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400420 case SkBlendMode::kModulate:
Brian Salomon31853842017-03-28 16:32:05 -0400421 TEST_ASSERT(!xpi.fIgnoresInputColor);
422 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700423 TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType);
424 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
425 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
426 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
427 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
428 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
429 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400430 case SkBlendMode::kScreen:
Brian Salomon31853842017-03-28 16:32:05 -0400431 TEST_ASSERT(!xpi.fIgnoresInputColor);
432 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700433 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
434 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
435 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
436 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
437 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
438 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
439 break;
440 default:
441 ERRORF(reporter, "Invalid xfermode.");
442 break;
443 }
444 }
445}
446
Brian Salomon31853842017-03-28 16:32:05 -0400447static void test_color_not_opaque_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Osmancf860852018-10-31 14:04:39 -0400448 GrProcessorAnalysisColor inputColor(
449 SkPMColor4f::FromBytes_RGBA(GrColorPackRGBA(229, 0, 154, 240)));
Brian Salomona811b122017-03-30 08:21:32 -0400450 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kNone;
cdalton6fd158e2015-05-27 15:08:33 -0700451
Mike Reed7d954ad2016-10-28 15:42:34 -0400452 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
453 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon31853842017-03-28 16:32:05 -0400454 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
cdalton6fd158e2015-05-27 15:08:33 -0700455 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400456 case SkBlendMode::kClear:
Brian Salomon31853842017-03-28 16:32:05 -0400457 TEST_ASSERT(xpi.fIgnoresInputColor);
458 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700459 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
460 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
461 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
462 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
463 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
464 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
465 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400466 case SkBlendMode::kSrc:
Brian Salomon31853842017-03-28 16:32:05 -0400467 TEST_ASSERT(!xpi.fIgnoresInputColor);
468 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
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(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
474 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
475 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400476 case SkBlendMode::kDst:
Brian Salomon31853842017-03-28 16:32:05 -0400477 TEST_ASSERT(xpi.fIgnoresInputColor);
478 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700479 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
480 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
481 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
482 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
483 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
484 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
485 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400486 case SkBlendMode::kSrcOver:
Brian Salomon31853842017-03-28 16:32:05 -0400487 TEST_ASSERT(!xpi.fIgnoresInputColor);
488 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700489 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
490 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
491 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
492 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
493 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
494 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
495 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400496 case SkBlendMode::kDstOver:
Brian Salomon31853842017-03-28 16:32:05 -0400497 TEST_ASSERT(!xpi.fIgnoresInputColor);
498 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700499 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
500 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
501 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
502 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
503 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
504 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
505 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400506 case SkBlendMode::kSrcIn:
Brian Salomon31853842017-03-28 16:32:05 -0400507 TEST_ASSERT(!xpi.fIgnoresInputColor);
508 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
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(kDA_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::kDstIn:
Brian Salomon31853842017-03-28 16:32:05 -0400517 TEST_ASSERT(!xpi.fIgnoresInputColor);
518 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700519 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
520 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
521 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
522 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
523 TEST_ASSERT(kSA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
524 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
525 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400526 case SkBlendMode::kSrcOut:
Brian Salomon31853842017-03-28 16:32:05 -0400527 TEST_ASSERT(!xpi.fIgnoresInputColor);
528 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
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(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
533 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
534 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
535 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400536 case SkBlendMode::kDstOut:
Brian Salomon31853842017-03-28 16:32:05 -0400537 TEST_ASSERT(!xpi.fIgnoresInputColor);
538 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700539 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
540 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
541 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
542 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
543 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
544 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
545 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400546 case SkBlendMode::kSrcATop:
Brian Salomon31853842017-03-28 16:32:05 -0400547 TEST_ASSERT(!xpi.fIgnoresInputColor);
548 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700549 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
550 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
551 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
552 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
553 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
554 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
555 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400556 case SkBlendMode::kDstATop:
Brian Salomon31853842017-03-28 16:32:05 -0400557 TEST_ASSERT(!xpi.fIgnoresInputColor);
558 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700559 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
560 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
561 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
562 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
563 TEST_ASSERT(kSA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
564 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
565 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400566 case SkBlendMode::kXor:
Brian Salomon31853842017-03-28 16:32:05 -0400567 TEST_ASSERT(!xpi.fIgnoresInputColor);
568 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700569 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
570 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
571 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
572 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
573 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
574 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
575 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400576 case SkBlendMode::kPlus:
Brian Salomon31853842017-03-28 16:32:05 -0400577 TEST_ASSERT(!xpi.fIgnoresInputColor);
578 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700579 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
580 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
581 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
582 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
583 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
584 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
585 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400586 case SkBlendMode::kModulate:
Brian Salomon31853842017-03-28 16:32:05 -0400587 TEST_ASSERT(!xpi.fIgnoresInputColor);
588 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700589 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
590 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
591 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
592 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
593 TEST_ASSERT(kSC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
594 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
595 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400596 case SkBlendMode::kScreen:
Brian Salomon31853842017-03-28 16:32:05 -0400597 TEST_ASSERT(!xpi.fIgnoresInputColor);
598 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700599 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
600 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
601 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
602 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
603 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
604 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
605 break;
606 default:
607 ERRORF(reporter, "Invalid xfermode.");
608 break;
609 }
610 }
611}
612
613static void test_color_opaque_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomona811b122017-03-30 08:21:32 -0400614 GrProcessorAnalysisColor inputColor = GrProcessorAnalysisColor::Opaque::kYes;
615 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kSingleChannel;
cdalton6fd158e2015-05-27 15:08:33 -0700616
Mike Reed7d954ad2016-10-28 15:42:34 -0400617 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
618 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon31853842017-03-28 16:32:05 -0400619 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
cdalton6fd158e2015-05-27 15:08:33 -0700620 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400621 case SkBlendMode::kClear:
Brian Salomon31853842017-03-28 16:32:05 -0400622 TEST_ASSERT(xpi.fIgnoresInputColor);
623 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700624 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
625 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
626 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
627 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
628 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
629 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
630 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400631 case SkBlendMode::kSrc:
Brian Salomon31853842017-03-28 16:32:05 -0400632 TEST_ASSERT(!xpi.fIgnoresInputColor);
633 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700634 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
635 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
636 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
637 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
638 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
639 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
640 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400641 case SkBlendMode::kDst:
Brian Salomon31853842017-03-28 16:32:05 -0400642 TEST_ASSERT(xpi.fIgnoresInputColor);
643 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700644 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
645 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
646 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
647 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
648 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
649 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
650 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400651 case SkBlendMode::kSrcOver:
Brian Salomon31853842017-03-28 16:32:05 -0400652 TEST_ASSERT(!xpi.fIgnoresInputColor);
653 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700654 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
655 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
656 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
657 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
658 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
659 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
660 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400661 case SkBlendMode::kDstOver:
Brian Salomon31853842017-03-28 16:32:05 -0400662 TEST_ASSERT(!xpi.fIgnoresInputColor);
663 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700664 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
665 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
666 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
667 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
668 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
669 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
670 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400671 case SkBlendMode::kSrcIn:
Brian Salomon31853842017-03-28 16:32:05 -0400672 TEST_ASSERT(!xpi.fIgnoresInputColor);
673 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700674 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
675 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
676 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
677 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
678 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
679 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
680 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400681 case SkBlendMode::kDstIn:
Brian Salomon31853842017-03-28 16:32:05 -0400682 TEST_ASSERT(xpi.fIgnoresInputColor);
683 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700684 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
685 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
686 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
687 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
688 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
689 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
690 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400691 case SkBlendMode::kSrcOut:
Brian Salomon31853842017-03-28 16:32:05 -0400692 TEST_ASSERT(!xpi.fIgnoresInputColor);
693 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700694 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
695 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
696 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
697 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
698 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
699 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
700 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400701 case SkBlendMode::kDstOut:
Brian Salomon31853842017-03-28 16:32:05 -0400702 TEST_ASSERT(xpi.fIgnoresInputColor);
703 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700704 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
705 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
706 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
707 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
708 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
709 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
710 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400711 case SkBlendMode::kSrcATop:
Brian Salomon31853842017-03-28 16:32:05 -0400712 TEST_ASSERT(!xpi.fIgnoresInputColor);
713 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700714 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
715 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
716 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
717 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
718 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
719 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
720 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400721 case SkBlendMode::kDstATop:
Brian Salomon31853842017-03-28 16:32:05 -0400722 TEST_ASSERT(!xpi.fIgnoresInputColor);
723 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700724 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
725 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
726 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
727 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
728 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
729 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
730 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400731 case SkBlendMode::kXor:
Brian Salomon31853842017-03-28 16:32:05 -0400732 TEST_ASSERT(!xpi.fIgnoresInputColor);
733 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700734 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
735 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
736 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
737 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
738 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
739 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
740 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400741 case SkBlendMode::kPlus:
Brian Salomon31853842017-03-28 16:32:05 -0400742 TEST_ASSERT(!xpi.fIgnoresInputColor);
743 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700744 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
745 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
746 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
747 TEST_ASSERT(kOne_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::kModulate:
Brian Salomon31853842017-03-28 16:32:05 -0400752 TEST_ASSERT(!xpi.fIgnoresInputColor);
cdalton6fd158e2015-05-27 15:08:33 -0700753 TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType);
754 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
755 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
756 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
757 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
758 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
759 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400760 case SkBlendMode::kScreen:
Brian Salomon31853842017-03-28 16:32:05 -0400761 TEST_ASSERT(!xpi.fIgnoresInputColor);
762 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700763 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
764 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
765 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
766 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
767 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
768 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
769 break;
770 default:
771 ERRORF(reporter, "Invalid xfermode.");
772 break;
773 }
774 }
775}
776
777static void test_color_opaque_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomona811b122017-03-30 08:21:32 -0400778 GrProcessorAnalysisColor inputColor = GrProcessorAnalysisColor::Opaque::kYes;
779 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kNone;
cdalton6fd158e2015-05-27 15:08:33 -0700780
Mike Reed7d954ad2016-10-28 15:42:34 -0400781 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
782 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon31853842017-03-28 16:32:05 -0400783 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
cdalton6fd158e2015-05-27 15:08:33 -0700784
785 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400786 case SkBlendMode::kClear:
Brian Salomon31853842017-03-28 16:32:05 -0400787 TEST_ASSERT(xpi.fIgnoresInputColor);
788 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700789 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
790 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
791 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
792 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
793 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
794 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
795 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400796 case SkBlendMode::kSrc:
Brian Salomon31853842017-03-28 16:32:05 -0400797 TEST_ASSERT(!xpi.fIgnoresInputColor);
798 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
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(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
803 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
804 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
805 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400806 case SkBlendMode::kDst:
Brian Salomon31853842017-03-28 16:32:05 -0400807 TEST_ASSERT(xpi.fIgnoresInputColor);
808 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700809 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
810 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
811 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
812 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
813 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
814 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
815 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400816 case SkBlendMode::kSrcOver:
Brian Salomon28207df2017-06-05 12:25:13 -0400817 // We don't specialize opaque src-over. See note in GrPorterDuffXferProcessor.cpp
Brian Salomon31853842017-03-28 16:32:05 -0400818 TEST_ASSERT(!xpi.fIgnoresInputColor);
Brian Salomon28207df2017-06-05 12:25:13 -0400819 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700820 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
821 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
822 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
823 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
Brian Salomon28207df2017-06-05 12:25:13 -0400824 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
cdalton6fd158e2015-05-27 15:08:33 -0700825 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
826 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400827 case SkBlendMode::kDstOver:
Brian Salomon31853842017-03-28 16:32:05 -0400828 TEST_ASSERT(!xpi.fIgnoresInputColor);
829 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
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(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
834 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
835 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
836 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400837 case SkBlendMode::kSrcIn:
Brian Salomon31853842017-03-28 16:32:05 -0400838 TEST_ASSERT(!xpi.fIgnoresInputColor);
839 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700840 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
841 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
842 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
843 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
844 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
845 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
846 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400847 case SkBlendMode::kDstIn:
Brian Salomon31853842017-03-28 16:32:05 -0400848 TEST_ASSERT(xpi.fIgnoresInputColor);
849 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700850 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
851 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
852 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
853 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
854 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
855 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
856 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400857 case SkBlendMode::kSrcOut:
Brian Salomon31853842017-03-28 16:32:05 -0400858 TEST_ASSERT(!xpi.fIgnoresInputColor);
859 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700860 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
861 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
862 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
863 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
864 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
865 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
866 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400867 case SkBlendMode::kDstOut:
Brian Salomon31853842017-03-28 16:32:05 -0400868 TEST_ASSERT(xpi.fIgnoresInputColor);
869 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700870 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
871 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
872 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
873 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
874 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
875 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
876 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400877 case SkBlendMode::kSrcATop:
Brian Salomon31853842017-03-28 16:32:05 -0400878 TEST_ASSERT(!xpi.fIgnoresInputColor);
879 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700880 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
881 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
882 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
883 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
884 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
885 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
886 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400887 case SkBlendMode::kDstATop:
Brian Salomon31853842017-03-28 16:32:05 -0400888 TEST_ASSERT(!xpi.fIgnoresInputColor);
889 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700890 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
891 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
892 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
893 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
894 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
895 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
896 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400897 case SkBlendMode::kXor:
Brian Salomon31853842017-03-28 16:32:05 -0400898 TEST_ASSERT(!xpi.fIgnoresInputColor);
899 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700900 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
901 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
902 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
903 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
904 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
905 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
906 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400907 case SkBlendMode::kPlus:
Brian Salomon31853842017-03-28 16:32:05 -0400908 TEST_ASSERT(!xpi.fIgnoresInputColor);
909 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700910 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
911 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
912 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
913 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
914 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
915 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
916 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400917 case SkBlendMode::kModulate:
Brian Salomon31853842017-03-28 16:32:05 -0400918 TEST_ASSERT(!xpi.fIgnoresInputColor);
919 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700920 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
921 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
922 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
923 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
924 TEST_ASSERT(kSC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
925 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
926 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400927 case SkBlendMode::kScreen:
Brian Salomon31853842017-03-28 16:32:05 -0400928 TEST_ASSERT(!xpi.fIgnoresInputColor);
929 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700930 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
931 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
932 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
933 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
934 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
935 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
936 break;
937 default:
938 ERRORF(reporter, "Invalid xfermode.");
939 break;
940 }
941 }
942}
943
egdaniel723b0502015-09-15 09:31:40 -0700944static void test_lcd_coverage_fallback_case(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Osman5ced0bf2019-03-15 10:15:29 -0400945 constexpr GrClampType autoClamp = GrClampType::kAuto;
Brian Salomon31853842017-03-28 16:32:05 -0400946 const GrXPFactory* xpf = GrPorterDuffXPFactory::Get(SkBlendMode::kSrcOver);
Brian Osmancf860852018-10-31 14:04:39 -0400947 GrProcessorAnalysisColor color = SkPMColor4f::FromBytes_RGBA(GrColorPackRGBA(123, 45, 67, 255));
Brian Salomona811b122017-03-30 08:21:32 -0400948 GrProcessorAnalysisCoverage coverage = GrProcessorAnalysisCoverage::kLCD;
Brian Osman5ced0bf2019-03-15 10:15:29 -0400949 TEST_ASSERT(!(GrXPFactory::GetAnalysisProperties(xpf, color, coverage, caps, autoClamp) &
Greg Daniel6ebe4b92017-05-19 10:56:46 -0400950 GrXPFactory::AnalysisProperties::kRequiresDstTexture));
951 sk_sp<const GrXferProcessor> xp_opaque(
Brian Osman5ced0bf2019-03-15 10:15:29 -0400952 GrXPFactory::MakeXferProcessor(xpf, color, coverage, false, caps, autoClamp));
Greg Daniel6ebe4b92017-05-19 10:56:46 -0400953 if (!xp_opaque) {
954 ERRORF(reporter, "Failed to create an XP with LCD coverage.");
955 return;
956 }
957
958 GrXferProcessor::BlendInfo blendInfo;
959 xp_opaque->getBlendInfo(&blendInfo);
960 TEST_ASSERT(blendInfo.fWriteColor);
961
962 // Test with non-opaque alpha
Brian Osmancf860852018-10-31 14:04:39 -0400963 color = SkPMColor4f::FromBytes_RGBA(GrColorPackRGBA(123, 45, 67, 221));
Greg Daniel6ebe4b92017-05-19 10:56:46 -0400964 coverage = GrProcessorAnalysisCoverage::kLCD;
Brian Osman5ced0bf2019-03-15 10:15:29 -0400965 TEST_ASSERT(!(GrXPFactory::GetAnalysisProperties(xpf, color, coverage, caps, autoClamp) &
Greg Danield7b11592017-06-14 13:37:12 -0400966 GrXPFactory::AnalysisProperties::kRequiresDstTexture));
Brian Salomond61c9d92017-04-10 10:54:25 -0400967 sk_sp<const GrXferProcessor> xp(
Brian Osman5ced0bf2019-03-15 10:15:29 -0400968 GrXPFactory::MakeXferProcessor(xpf, color, coverage, false, caps, autoClamp));
cdalton6fd158e2015-05-27 15:08:33 -0700969 if (!xp) {
970 ERRORF(reporter, "Failed to create an XP with LCD coverage.");
971 return;
972 }
973
cdalton6fd158e2015-05-27 15:08:33 -0700974 xp->getBlendInfo(&blendInfo);
975 TEST_ASSERT(blendInfo.fWriteColor);
976}
977
Brian Salomondcfca432017-11-15 15:48:03 -0500978DEF_GPUTEST(PorterDuffNoDualSourceBlending, reporter, options) {
979 GrContextOptions opts = options;
cdalton6fd158e2015-05-27 15:08:33 -0700980 opts.fSuppressDualSourceBlending = true;
bsalomon3724e572016-03-30 18:56:19 -0700981 sk_gpu_test::GrContextFactory mockFactory(opts);
Brian Osman7c597742019-03-26 11:10:11 -0400982 GrContext* ctx = mockFactory.get(sk_gpu_test::GrContextFactory::kMock_ContextType);
cdalton6fd158e2015-05-27 15:08:33 -0700983 if (!ctx) {
Brian Osman7c597742019-03-26 11:10:11 -0400984 SK_ABORT("Failed to create mock context without ARB_blend_func_extended.");
cdalton6fd158e2015-05-27 15:08:33 -0700985 return;
986 }
987
Robert Phillips9da87e02019-02-04 13:26:26 -0500988 GrGpu* gpu = ctx->priv().getGpu();
989 GrProxyProvider* proxyProvider = ctx->priv().proxyProvider();
990 const GrCaps& caps = *ctx->priv().caps();
cdalton6fd158e2015-05-27 15:08:33 -0700991 if (caps.shaderCaps()->dualSourceBlendingSupport()) {
Brian Osman7c597742019-03-26 11:10:11 -0400992 SK_ABORT("Mock context failed to honor request for no ARB_blend_func_extended.");
cdalton6fd158e2015-05-27 15:08:33 -0700993 return;
994 }
995
Robert Phillipsd21b2a52017-12-12 13:01:25 -0500996 GrBackendTexture backendTex =
Robert Phillips646f6372018-09-25 09:31:10 -0400997 gpu->createTestingOnlyBackendTexture(nullptr, 100, 100, GrColorType::kRGBA_8888,
Robert Phillipsf35fd8d2018-01-22 10:48:15 -0500998 false, GrMipMapped::kNo);
Greg Daniel7ef28f32017-04-20 16:41:55 +0000999
Robert Phillipsbb581ce2017-05-29 15:05:15 -04001000 GrXferProcessor::DstProxy fakeDstProxy;
1001 {
Brian Salomonc67c31c2018-12-06 10:00:03 -05001002 sk_sp<GrTextureProxy> proxy = proxyProvider->wrapBackendTexture(
Brian Salomonaa6ca0a2019-01-24 16:03:07 -05001003 backendTex, kTopLeft_GrSurfaceOrigin, kBorrow_GrWrapOwnership, GrWrapCacheable::kNo,
1004 kRead_GrIOType);
Robert Phillipsbb581ce2017-05-29 15:05:15 -04001005 fakeDstProxy.setProxy(std::move(proxy));
1006 }
cdalton6fd158e2015-05-27 15:08:33 -07001007
Brian Salomona811b122017-03-30 08:21:32 -04001008 static const GrProcessorAnalysisColor colorInputs[] = {
1009 GrProcessorAnalysisColor::Opaque::kNo, GrProcessorAnalysisColor::Opaque::kYes,
Brian Osmancf860852018-10-31 14:04:39 -04001010 GrProcessorAnalysisColor(SkPMColor4f::FromBytes_RGBA(GrColorPackRGBA(0, 82, 17, 100))),
1011 GrProcessorAnalysisColor(SkPMColor4f::FromBytes_RGBA(GrColorPackRGBA(0, 82, 17, 255)))};
cdalton6fd158e2015-05-27 15:08:33 -07001012
Brian Salomonc6b71462017-02-14 11:33:01 -05001013 for (const auto& colorInput : colorInputs) {
Brian Salomona811b122017-03-30 08:21:32 -04001014 for (GrProcessorAnalysisCoverage coverageType :
1015 {GrProcessorAnalysisCoverage::kSingleChannel, GrProcessorAnalysisCoverage::kNone}) {
Mike Reed7d954ad2016-10-28 15:42:34 -04001016 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
1017 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomona1633922017-01-09 11:46:10 -05001018 const GrXPFactory* xpf = GrPorterDuffXPFactory::Get(xfermode);
Brian Salomond61c9d92017-04-10 10:54:25 -04001019 sk_sp<const GrXferProcessor> xp(
Brian Osman5ced0bf2019-03-15 10:15:29 -04001020 GrXPFactory::MakeXferProcessor(xpf, colorInput, coverageType, false, caps,
1021 GrClampType::kAuto));
cdalton6fd158e2015-05-27 15:08:33 -07001022 if (!xp) {
1023 ERRORF(reporter, "Failed to create an XP without dual source blending.");
1024 return;
1025 }
1026 TEST_ASSERT(!xp->hasSecondaryOutput());
cdalton6fd158e2015-05-27 15:08:33 -07001027 }
1028 }
1029 }
Brian Salomon26102cb2018-03-09 09:33:19 -05001030 gpu->deleteTestingOnlyBackendTexture(backendTex);
cdalton6fd158e2015-05-27 15:08:33 -07001031}