blob: f108c111baae9efe1cc802c5024690d2b4d66bbe [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,
69 caps, &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 Osman532b3f92018-07-11 10:02:07 -040086 GrXPFactory::MakeXferProcessor(xpf, inputColor, inputCoverage, false, caps));
Greg Daniel79cdf282017-05-22 15:56:22 -040087 TEST_ASSERT(!analysis.requiresDstTexture() ||
88 (isLCD &&
89 !caps.shaderCaps()->dstReadInShaderSupport() &&
90 (SkBlendMode::kSrcOver != xfermode ||
91 !inputColor.isOpaque())));
Chris Dalton945ee652019-01-23 09:10:36 -070092 // Porter Duff modes currently only use fixed-function or shader blending, and Ganesh
93 // doesn't yet make use of framebuffer fetches that require a barrier
94 // (e.g., QCOM_shader_framebuffer_fetch_noncoherent). So dst textures and xfer barriers
95 // should always go hand in hand for Porter Duff modes.
96 TEST_ASSERT(analysis.requiresDstTexture() == analysis.requiresNonOverlappingDraws());
Hal Canary342b7ac2016-11-04 11:49:42 -040097 GetXPOutputTypes(xp.get(), &fPrimaryOutputType, &fSecondaryOutputType);
cdalton6fd158e2015-05-27 15:08:33 -070098 xp->getBlendInfo(&fBlendInfo);
Greg Daniel79cdf282017-05-22 15:56:22 -040099 TEST_ASSERT(!xp->willReadDstColor() ||
100 (isLCD && (SkBlendMode::kSrcOver != xfermode ||
101 !inputColor.isOpaque())));
cdalton6fd158e2015-05-27 15:08:33 -0700102 TEST_ASSERT(xp->hasSecondaryOutput() == GrBlendCoeffRefsSrc2(fBlendInfo.fDstBlend));
103 }
104
Brian Salomon31853842017-03-28 16:32:05 -0400105 bool fCompatibleWithCoverageAsAlpha;
106 bool fIgnoresInputColor;
cdalton6fd158e2015-05-27 15:08:33 -0700107 int fPrimaryOutputType;
108 int fSecondaryOutputType;
109 GrXferProcessor::BlendInfo fBlendInfo;
110 };
111
112 static void GetXPOutputTypes(const GrXferProcessor* xp, int* outPrimary, int* outSecondary) {
egdanielf2342722015-11-20 15:12:59 -0800113 GrPorterDuffXPFactory::TestGetXPOutputTypes(xp, outPrimary, outSecondary);
cdalton6fd158e2015-05-27 15:08:33 -0700114 }
115};
116
egdaniel723b0502015-09-15 09:31:40 -0700117static void test_lcd_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Greg Daniel6ebe4b92017-05-19 10:56:46 -0400118 GrProcessorAnalysisColor inputColor = GrProcessorAnalysisColor::Opaque::kYes;
Brian Salomona811b122017-03-30 08:21:32 -0400119 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kLCD;
egdaniel723b0502015-09-15 09:31:40 -0700120
Mike Reed7d954ad2016-10-28 15:42:34 -0400121 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
122 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon31853842017-03-28 16:32:05 -0400123 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
egdaniel723b0502015-09-15 09:31:40 -0700124 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400125 case SkBlendMode::kClear:
Brian Salomon31853842017-03-28 16:32:05 -0400126 TEST_ASSERT(xpi.fIgnoresInputColor);
127 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400128 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
129 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
130 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
131 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
132 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700133 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
134 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400135 case SkBlendMode::kSrc:
Brian Salomon31853842017-03-28 16:32:05 -0400136 TEST_ASSERT(!xpi.fIgnoresInputColor);
137 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400138 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
139 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700140 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
141 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
Greg Daniel79cdf282017-05-22 15:56:22 -0400142 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700143 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
144 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400145 case SkBlendMode::kDst:
Brian Salomon31853842017-03-28 16:32:05 -0400146 TEST_ASSERT(xpi.fIgnoresInputColor);
147 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400148 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
149 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700150 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400151 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
152 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
153 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
egdaniel723b0502015-09-15 09:31:40 -0700154 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400155 case SkBlendMode::kSrcOver:
Brian Salomon31853842017-03-28 16:32:05 -0400156 TEST_ASSERT(!xpi.fIgnoresInputColor);
157 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
egdaniel723b0502015-09-15 09:31:40 -0700158 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
159 TEST_ASSERT(kSAModulate_OutputType == xpi.fSecondaryOutputType);
160 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
161 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
162 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
163 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
164 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400165 case SkBlendMode::kDstOver:
Brian Salomon31853842017-03-28 16:32:05 -0400166 TEST_ASSERT(!xpi.fIgnoresInputColor);
167 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400168 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
169 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700170 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400171 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
172 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700173 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
174 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400175 case SkBlendMode::kSrcIn:
Brian Salomon31853842017-03-28 16:32:05 -0400176 TEST_ASSERT(!xpi.fIgnoresInputColor);
177 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400178 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
179 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700180 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400181 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
182 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700183 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
184 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400185 case SkBlendMode::kDstIn:
Brian Salomon31853842017-03-28 16:32:05 -0400186 TEST_ASSERT(!xpi.fIgnoresInputColor);
187 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400188 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
189 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
190 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
191 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
192 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700193 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
194 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400195 case SkBlendMode::kSrcOut:
Brian Salomon31853842017-03-28 16:32:05 -0400196 TEST_ASSERT(!xpi.fIgnoresInputColor);
197 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400198 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
199 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700200 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400201 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
202 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700203 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
204 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400205 case SkBlendMode::kDstOut:
Brian Salomon31853842017-03-28 16:32:05 -0400206 TEST_ASSERT(!xpi.fIgnoresInputColor);
207 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400208 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
209 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700210 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400211 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
212 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700213 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
214 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400215 case SkBlendMode::kSrcATop:
Brian Salomon31853842017-03-28 16:32:05 -0400216 TEST_ASSERT(!xpi.fIgnoresInputColor);
217 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400218 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
219 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700220 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400221 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
222 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700223 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
224 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400225 case SkBlendMode::kDstATop:
Brian Salomon31853842017-03-28 16:32:05 -0400226 TEST_ASSERT(!xpi.fIgnoresInputColor);
227 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400228 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
229 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700230 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400231 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
232 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700233 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
234 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400235 case SkBlendMode::kXor:
Brian Salomon31853842017-03-28 16:32:05 -0400236 TEST_ASSERT(!xpi.fIgnoresInputColor);
237 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400238 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
239 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700240 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400241 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
242 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700243 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
244 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400245 case SkBlendMode::kPlus:
Brian Salomon31853842017-03-28 16:32:05 -0400246 TEST_ASSERT(!xpi.fIgnoresInputColor);
247 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400248 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
249 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700250 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
251 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
Greg Daniel79cdf282017-05-22 15:56:22 -0400252 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700253 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
254 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400255 case SkBlendMode::kModulate:
Brian Salomon31853842017-03-28 16:32:05 -0400256 TEST_ASSERT(!xpi.fIgnoresInputColor);
257 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400258 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
259 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
260 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
261 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
262 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700263 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
264 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400265 case SkBlendMode::kScreen:
Brian Salomon31853842017-03-28 16:32:05 -0400266 TEST_ASSERT(!xpi.fIgnoresInputColor);
267 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
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;
275 default:
276 ERRORF(reporter, "Invalid xfermode.");
277 break;
278 }
279 }
280}
cdalton6fd158e2015-05-27 15:08:33 -0700281static void test_color_unknown_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomona811b122017-03-30 08:21:32 -0400282 GrProcessorAnalysisColor inputColor = GrProcessorAnalysisColor::Opaque::kNo;
283 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kSingleChannel;
cdalton6fd158e2015-05-27 15:08:33 -0700284
Mike Reed7d954ad2016-10-28 15:42:34 -0400285 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
286 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon31853842017-03-28 16:32:05 -0400287 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
cdalton6fd158e2015-05-27 15:08:33 -0700288 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400289 case SkBlendMode::kClear:
Brian Salomon31853842017-03-28 16:32:05 -0400290 TEST_ASSERT(xpi.fIgnoresInputColor);
291 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700292 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
293 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
294 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
295 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
296 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
297 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
298 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400299 case SkBlendMode::kSrc:
Brian Salomon31853842017-03-28 16:32:05 -0400300 TEST_ASSERT(!xpi.fIgnoresInputColor);
301 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700302 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
303 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
304 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
305 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
306 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
307 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
308 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400309 case SkBlendMode::kDst:
Brian Salomon31853842017-03-28 16:32:05 -0400310 TEST_ASSERT(xpi.fIgnoresInputColor);
311 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700312 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
313 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
314 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
315 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
316 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
317 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
318 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400319 case SkBlendMode::kSrcOver:
Brian Salomon31853842017-03-28 16:32:05 -0400320 TEST_ASSERT(!xpi.fIgnoresInputColor);
321 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700322 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
323 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
324 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
325 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
326 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
327 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
328 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400329 case SkBlendMode::kDstOver:
Brian Salomon31853842017-03-28 16:32:05 -0400330 TEST_ASSERT(!xpi.fIgnoresInputColor);
331 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700332 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
333 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
334 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
335 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
336 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
337 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
338 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400339 case SkBlendMode::kSrcIn:
Brian Salomon31853842017-03-28 16:32:05 -0400340 TEST_ASSERT(!xpi.fIgnoresInputColor);
341 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700342 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
343 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
344 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
345 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
346 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
347 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
348 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400349 case SkBlendMode::kDstIn:
Brian Salomon31853842017-03-28 16:32:05 -0400350 TEST_ASSERT(!xpi.fIgnoresInputColor);
351 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700352 TEST_ASSERT(kISAModulate_OutputType == xpi.fPrimaryOutputType);
353 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
354 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
355 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
356 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
357 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
358 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400359 case SkBlendMode::kSrcOut:
Brian Salomon31853842017-03-28 16:32:05 -0400360 TEST_ASSERT(!xpi.fIgnoresInputColor);
361 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700362 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
363 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
364 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
365 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
366 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
367 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
368 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400369 case SkBlendMode::kDstOut:
Brian Salomon31853842017-03-28 16:32:05 -0400370 TEST_ASSERT(!xpi.fIgnoresInputColor);
371 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700372 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
373 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
374 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
375 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
376 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
377 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
378 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400379 case SkBlendMode::kSrcATop:
Brian Salomon31853842017-03-28 16:32:05 -0400380 TEST_ASSERT(!xpi.fIgnoresInputColor);
381 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700382 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
383 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
384 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
385 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
386 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
387 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
388 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400389 case SkBlendMode::kDstATop:
Brian Salomon31853842017-03-28 16:32:05 -0400390 TEST_ASSERT(!xpi.fIgnoresInputColor);
391 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700392 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
393 TEST_ASSERT(kISAModulate_OutputType == xpi.fSecondaryOutputType);
394 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
395 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
396 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
397 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
398 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400399 case SkBlendMode::kXor:
Brian Salomon31853842017-03-28 16:32:05 -0400400 TEST_ASSERT(!xpi.fIgnoresInputColor);
401 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700402 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
403 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
404 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
405 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
406 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
407 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
408 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400409 case SkBlendMode::kPlus:
Brian Salomon31853842017-03-28 16:32:05 -0400410 TEST_ASSERT(!xpi.fIgnoresInputColor);
411 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700412 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
413 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
414 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
415 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
416 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
417 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
418 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400419 case SkBlendMode::kModulate:
Brian Salomon31853842017-03-28 16:32:05 -0400420 TEST_ASSERT(!xpi.fIgnoresInputColor);
421 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700422 TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType);
423 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
424 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
425 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
426 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
427 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
428 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400429 case SkBlendMode::kScreen:
Brian Salomon31853842017-03-28 16:32:05 -0400430 TEST_ASSERT(!xpi.fIgnoresInputColor);
431 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700432 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
433 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
434 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
435 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
436 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
437 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
438 break;
439 default:
440 ERRORF(reporter, "Invalid xfermode.");
441 break;
442 }
443 }
444}
445
Brian Salomon31853842017-03-28 16:32:05 -0400446static void test_color_not_opaque_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Osmancf860852018-10-31 14:04:39 -0400447 GrProcessorAnalysisColor inputColor(
448 SkPMColor4f::FromBytes_RGBA(GrColorPackRGBA(229, 0, 154, 240)));
Brian Salomona811b122017-03-30 08:21:32 -0400449 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kNone;
cdalton6fd158e2015-05-27 15:08:33 -0700450
Mike Reed7d954ad2016-10-28 15:42:34 -0400451 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
452 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon31853842017-03-28 16:32:05 -0400453 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
cdalton6fd158e2015-05-27 15:08:33 -0700454 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400455 case SkBlendMode::kClear:
Brian Salomon31853842017-03-28 16:32:05 -0400456 TEST_ASSERT(xpi.fIgnoresInputColor);
457 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700458 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
459 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
460 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
461 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
462 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
463 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
464 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400465 case SkBlendMode::kSrc:
Brian Salomon31853842017-03-28 16:32:05 -0400466 TEST_ASSERT(!xpi.fIgnoresInputColor);
467 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700468 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
469 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
470 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
471 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
472 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
473 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
474 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400475 case SkBlendMode::kDst:
Brian Salomon31853842017-03-28 16:32:05 -0400476 TEST_ASSERT(xpi.fIgnoresInputColor);
477 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700478 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
479 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
480 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
481 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
482 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
483 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
484 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400485 case SkBlendMode::kSrcOver:
Brian Salomon31853842017-03-28 16:32:05 -0400486 TEST_ASSERT(!xpi.fIgnoresInputColor);
487 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700488 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
489 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
490 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
491 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
492 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
493 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
494 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400495 case SkBlendMode::kDstOver:
Brian Salomon31853842017-03-28 16:32:05 -0400496 TEST_ASSERT(!xpi.fIgnoresInputColor);
497 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700498 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
499 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
500 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
501 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
502 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
503 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
504 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400505 case SkBlendMode::kSrcIn:
Brian Salomon31853842017-03-28 16:32:05 -0400506 TEST_ASSERT(!xpi.fIgnoresInputColor);
507 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700508 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
509 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
510 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
511 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
512 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
513 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
514 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400515 case SkBlendMode::kDstIn:
Brian Salomon31853842017-03-28 16:32:05 -0400516 TEST_ASSERT(!xpi.fIgnoresInputColor);
517 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700518 TEST_ASSERT(kModulate_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(kSA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
523 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
524 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400525 case SkBlendMode::kSrcOut:
Brian Salomon31853842017-03-28 16:32:05 -0400526 TEST_ASSERT(!xpi.fIgnoresInputColor);
527 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700528 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
529 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
530 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
531 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
532 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
533 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
534 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400535 case SkBlendMode::kDstOut:
Brian Salomon31853842017-03-28 16:32:05 -0400536 TEST_ASSERT(!xpi.fIgnoresInputColor);
537 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700538 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
539 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
540 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
541 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
542 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
543 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
544 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400545 case SkBlendMode::kSrcATop:
Brian Salomon31853842017-03-28 16:32:05 -0400546 TEST_ASSERT(!xpi.fIgnoresInputColor);
547 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700548 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
549 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
550 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
551 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
552 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
553 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
554 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400555 case SkBlendMode::kDstATop:
Brian Salomon31853842017-03-28 16:32:05 -0400556 TEST_ASSERT(!xpi.fIgnoresInputColor);
557 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700558 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
559 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
560 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
561 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
562 TEST_ASSERT(kSA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
563 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
564 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400565 case SkBlendMode::kXor:
Brian Salomon31853842017-03-28 16:32:05 -0400566 TEST_ASSERT(!xpi.fIgnoresInputColor);
567 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700568 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
569 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
570 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
571 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
572 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
573 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
574 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400575 case SkBlendMode::kPlus:
Brian Salomon31853842017-03-28 16:32:05 -0400576 TEST_ASSERT(!xpi.fIgnoresInputColor);
577 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700578 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
579 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
580 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
581 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
582 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
583 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
584 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400585 case SkBlendMode::kModulate:
Brian Salomon31853842017-03-28 16:32:05 -0400586 TEST_ASSERT(!xpi.fIgnoresInputColor);
587 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700588 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
589 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
590 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
591 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
592 TEST_ASSERT(kSC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
593 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
594 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400595 case SkBlendMode::kScreen:
Brian Salomon31853842017-03-28 16:32:05 -0400596 TEST_ASSERT(!xpi.fIgnoresInputColor);
597 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700598 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
599 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
600 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
601 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
602 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
603 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
604 break;
605 default:
606 ERRORF(reporter, "Invalid xfermode.");
607 break;
608 }
609 }
610}
611
612static void test_color_opaque_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomona811b122017-03-30 08:21:32 -0400613 GrProcessorAnalysisColor inputColor = GrProcessorAnalysisColor::Opaque::kYes;
614 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kSingleChannel;
cdalton6fd158e2015-05-27 15:08:33 -0700615
Mike Reed7d954ad2016-10-28 15:42:34 -0400616 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
617 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon31853842017-03-28 16:32:05 -0400618 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
cdalton6fd158e2015-05-27 15:08:33 -0700619 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400620 case SkBlendMode::kClear:
Brian Salomon31853842017-03-28 16:32:05 -0400621 TEST_ASSERT(xpi.fIgnoresInputColor);
622 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700623 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
624 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
625 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
626 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
627 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
628 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
629 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400630 case SkBlendMode::kSrc:
Brian Salomon31853842017-03-28 16:32:05 -0400631 TEST_ASSERT(!xpi.fIgnoresInputColor);
632 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700633 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
634 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
635 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
636 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
637 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
638 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
639 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400640 case SkBlendMode::kDst:
Brian Salomon31853842017-03-28 16:32:05 -0400641 TEST_ASSERT(xpi.fIgnoresInputColor);
642 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700643 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
644 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
645 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
646 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
647 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
648 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
649 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400650 case SkBlendMode::kSrcOver:
Brian Salomon31853842017-03-28 16:32:05 -0400651 TEST_ASSERT(!xpi.fIgnoresInputColor);
652 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700653 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
654 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
655 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
656 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
657 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
658 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
659 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400660 case SkBlendMode::kDstOver:
Brian Salomon31853842017-03-28 16:32:05 -0400661 TEST_ASSERT(!xpi.fIgnoresInputColor);
662 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700663 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
664 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
665 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
666 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
667 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
668 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
669 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400670 case SkBlendMode::kSrcIn:
Brian Salomon31853842017-03-28 16:32:05 -0400671 TEST_ASSERT(!xpi.fIgnoresInputColor);
672 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700673 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
674 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
675 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
676 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
677 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
678 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
679 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400680 case SkBlendMode::kDstIn:
Brian Salomon31853842017-03-28 16:32:05 -0400681 TEST_ASSERT(xpi.fIgnoresInputColor);
682 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700683 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
684 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
685 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
686 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
687 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
688 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
689 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400690 case SkBlendMode::kSrcOut:
Brian Salomon31853842017-03-28 16:32:05 -0400691 TEST_ASSERT(!xpi.fIgnoresInputColor);
692 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700693 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
694 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
695 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
696 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
697 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
698 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
699 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400700 case SkBlendMode::kDstOut:
Brian Salomon31853842017-03-28 16:32:05 -0400701 TEST_ASSERT(xpi.fIgnoresInputColor);
702 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700703 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
704 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
705 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
706 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
707 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
708 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
709 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400710 case SkBlendMode::kSrcATop:
Brian Salomon31853842017-03-28 16:32:05 -0400711 TEST_ASSERT(!xpi.fIgnoresInputColor);
712 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700713 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
714 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
715 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
716 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
717 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
718 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
719 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400720 case SkBlendMode::kDstATop:
Brian Salomon31853842017-03-28 16:32:05 -0400721 TEST_ASSERT(!xpi.fIgnoresInputColor);
722 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700723 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
724 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
725 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
726 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
727 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
728 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
729 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400730 case SkBlendMode::kXor:
Brian Salomon31853842017-03-28 16:32:05 -0400731 TEST_ASSERT(!xpi.fIgnoresInputColor);
732 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700733 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
734 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
735 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
736 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
737 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
738 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
739 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400740 case SkBlendMode::kPlus:
Brian Salomon31853842017-03-28 16:32:05 -0400741 TEST_ASSERT(!xpi.fIgnoresInputColor);
742 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700743 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
744 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
745 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
746 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
747 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
748 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
749 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400750 case SkBlendMode::kModulate:
Brian Salomon31853842017-03-28 16:32:05 -0400751 TEST_ASSERT(!xpi.fIgnoresInputColor);
cdalton6fd158e2015-05-27 15:08:33 -0700752 TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType);
753 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
754 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
755 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
756 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
757 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
758 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400759 case SkBlendMode::kScreen:
Brian Salomon31853842017-03-28 16:32:05 -0400760 TEST_ASSERT(!xpi.fIgnoresInputColor);
761 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700762 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
763 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
764 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
765 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
766 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
767 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
768 break;
769 default:
770 ERRORF(reporter, "Invalid xfermode.");
771 break;
772 }
773 }
774}
775
776static void test_color_opaque_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomona811b122017-03-30 08:21:32 -0400777 GrProcessorAnalysisColor inputColor = GrProcessorAnalysisColor::Opaque::kYes;
778 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kNone;
cdalton6fd158e2015-05-27 15:08:33 -0700779
Mike Reed7d954ad2016-10-28 15:42:34 -0400780 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
781 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon31853842017-03-28 16:32:05 -0400782 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
cdalton6fd158e2015-05-27 15:08:33 -0700783
784 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400785 case SkBlendMode::kClear:
Brian Salomon31853842017-03-28 16:32:05 -0400786 TEST_ASSERT(xpi.fIgnoresInputColor);
787 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700788 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
789 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
790 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
791 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
792 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
793 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
794 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400795 case SkBlendMode::kSrc:
Brian Salomon31853842017-03-28 16:32:05 -0400796 TEST_ASSERT(!xpi.fIgnoresInputColor);
797 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700798 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
799 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
800 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
801 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
802 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
803 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
804 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400805 case SkBlendMode::kDst:
Brian Salomon31853842017-03-28 16:32:05 -0400806 TEST_ASSERT(xpi.fIgnoresInputColor);
807 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700808 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
809 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
810 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
811 TEST_ASSERT(kZero_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::kSrcOver:
Brian Salomon28207df2017-06-05 12:25:13 -0400816 // We don't specialize opaque src-over. See note in GrPorterDuffXferProcessor.cpp
Brian Salomon31853842017-03-28 16:32:05 -0400817 TEST_ASSERT(!xpi.fIgnoresInputColor);
Brian Salomon28207df2017-06-05 12:25:13 -0400818 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700819 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
820 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
821 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
822 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
Brian Salomon28207df2017-06-05 12:25:13 -0400823 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
cdalton6fd158e2015-05-27 15:08:33 -0700824 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
825 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400826 case SkBlendMode::kDstOver:
Brian Salomon31853842017-03-28 16:32:05 -0400827 TEST_ASSERT(!xpi.fIgnoresInputColor);
828 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700829 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
830 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
831 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
832 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
833 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
834 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
835 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400836 case SkBlendMode::kSrcIn:
Brian Salomon31853842017-03-28 16:32:05 -0400837 TEST_ASSERT(!xpi.fIgnoresInputColor);
838 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700839 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
840 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
841 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
842 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
843 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
844 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
845 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400846 case SkBlendMode::kDstIn:
Brian Salomon31853842017-03-28 16:32:05 -0400847 TEST_ASSERT(xpi.fIgnoresInputColor);
848 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700849 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
850 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
851 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
852 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
853 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
854 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
855 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400856 case SkBlendMode::kSrcOut:
Brian Salomon31853842017-03-28 16:32:05 -0400857 TEST_ASSERT(!xpi.fIgnoresInputColor);
858 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700859 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
860 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
861 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
862 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
863 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
864 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
865 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400866 case SkBlendMode::kDstOut:
Brian Salomon31853842017-03-28 16:32:05 -0400867 TEST_ASSERT(xpi.fIgnoresInputColor);
868 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700869 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
870 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
871 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
872 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
873 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
874 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
875 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400876 case SkBlendMode::kSrcATop:
Brian Salomon31853842017-03-28 16:32:05 -0400877 TEST_ASSERT(!xpi.fIgnoresInputColor);
878 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700879 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
880 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
881 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
882 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
883 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
884 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
885 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400886 case SkBlendMode::kDstATop:
Brian Salomon31853842017-03-28 16:32:05 -0400887 TEST_ASSERT(!xpi.fIgnoresInputColor);
888 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
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(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
893 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
894 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
895 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400896 case SkBlendMode::kXor:
Brian Salomon31853842017-03-28 16:32:05 -0400897 TEST_ASSERT(!xpi.fIgnoresInputColor);
898 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700899 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
900 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
901 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
902 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
903 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
904 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
905 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400906 case SkBlendMode::kPlus:
Brian Salomon31853842017-03-28 16:32:05 -0400907 TEST_ASSERT(!xpi.fIgnoresInputColor);
908 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700909 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
910 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
911 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
912 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
913 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
914 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
915 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400916 case SkBlendMode::kModulate:
Brian Salomon31853842017-03-28 16:32:05 -0400917 TEST_ASSERT(!xpi.fIgnoresInputColor);
918 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700919 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
920 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
921 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
922 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
923 TEST_ASSERT(kSC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
924 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
925 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400926 case SkBlendMode::kScreen:
Brian Salomon31853842017-03-28 16:32:05 -0400927 TEST_ASSERT(!xpi.fIgnoresInputColor);
928 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700929 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
930 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
931 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
932 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
933 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
934 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
935 break;
936 default:
937 ERRORF(reporter, "Invalid xfermode.");
938 break;
939 }
940 }
941}
942
egdaniel723b0502015-09-15 09:31:40 -0700943static void test_lcd_coverage_fallback_case(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomon31853842017-03-28 16:32:05 -0400944 const GrXPFactory* xpf = GrPorterDuffXPFactory::Get(SkBlendMode::kSrcOver);
Brian Osmancf860852018-10-31 14:04:39 -0400945 GrProcessorAnalysisColor color = SkPMColor4f::FromBytes_RGBA(GrColorPackRGBA(123, 45, 67, 255));
Brian Salomona811b122017-03-30 08:21:32 -0400946 GrProcessorAnalysisCoverage coverage = GrProcessorAnalysisCoverage::kLCD;
Brian Osman532b3f92018-07-11 10:02:07 -0400947 TEST_ASSERT(!(GrXPFactory::GetAnalysisProperties(xpf, color, coverage, caps) &
Greg Daniel6ebe4b92017-05-19 10:56:46 -0400948 GrXPFactory::AnalysisProperties::kRequiresDstTexture));
949 sk_sp<const GrXferProcessor> xp_opaque(
Brian Osman532b3f92018-07-11 10:02:07 -0400950 GrXPFactory::MakeXferProcessor(xpf, color, coverage, false, caps));
Greg Daniel6ebe4b92017-05-19 10:56:46 -0400951 if (!xp_opaque) {
952 ERRORF(reporter, "Failed to create an XP with LCD coverage.");
953 return;
954 }
955
956 GrXferProcessor::BlendInfo blendInfo;
957 xp_opaque->getBlendInfo(&blendInfo);
958 TEST_ASSERT(blendInfo.fWriteColor);
959
960 // Test with non-opaque alpha
Brian Osmancf860852018-10-31 14:04:39 -0400961 color = SkPMColor4f::FromBytes_RGBA(GrColorPackRGBA(123, 45, 67, 221));
Greg Daniel6ebe4b92017-05-19 10:56:46 -0400962 coverage = GrProcessorAnalysisCoverage::kLCD;
Brian Osman532b3f92018-07-11 10:02:07 -0400963 TEST_ASSERT(!(GrXPFactory::GetAnalysisProperties(xpf, color, coverage, caps) &
Greg Danield7b11592017-06-14 13:37:12 -0400964 GrXPFactory::AnalysisProperties::kRequiresDstTexture));
Brian Salomond61c9d92017-04-10 10:54:25 -0400965 sk_sp<const GrXferProcessor> xp(
Brian Osman532b3f92018-07-11 10:02:07 -0400966 GrXPFactory::MakeXferProcessor(xpf, color, coverage, false, caps));
cdalton6fd158e2015-05-27 15:08:33 -0700967 if (!xp) {
968 ERRORF(reporter, "Failed to create an XP with LCD coverage.");
969 return;
970 }
971
cdalton6fd158e2015-05-27 15:08:33 -0700972 xp->getBlendInfo(&blendInfo);
973 TEST_ASSERT(blendInfo.fWriteColor);
974}
975
Brian Salomondcfca432017-11-15 15:48:03 -0500976DEF_GPUTEST(PorterDuffNoDualSourceBlending, reporter, options) {
977 GrContextOptions opts = options;
cdalton6fd158e2015-05-27 15:08:33 -0700978 opts.fSuppressDualSourceBlending = true;
bsalomon3724e572016-03-30 18:56:19 -0700979 sk_gpu_test::GrContextFactory mockFactory(opts);
bsalomon85b4b532016-04-05 11:06:27 -0700980 GrContext* ctx = mockFactory.get(sk_gpu_test::GrContextFactory::kNullGL_ContextType);
cdalton6fd158e2015-05-27 15:08:33 -0700981 if (!ctx) {
Ben Wagnerb4aab9a2017-08-16 10:53:04 -0400982 SK_ABORT("Failed to create null context without ARB_blend_func_extended.");
cdalton6fd158e2015-05-27 15:08:33 -0700983 return;
984 }
985
Robert Phillips9da87e02019-02-04 13:26:26 -0500986 GrGpu* gpu = ctx->priv().getGpu();
987 GrProxyProvider* proxyProvider = ctx->priv().proxyProvider();
988 const GrCaps& caps = *ctx->priv().caps();
cdalton6fd158e2015-05-27 15:08:33 -0700989 if (caps.shaderCaps()->dualSourceBlendingSupport()) {
Ben Wagnerb4aab9a2017-08-16 10:53:04 -0400990 SK_ABORT("Null context failed to honor request for no ARB_blend_func_extended.");
cdalton6fd158e2015-05-27 15:08:33 -0700991 return;
992 }
993
Robert Phillipsd21b2a52017-12-12 13:01:25 -0500994 GrBackendTexture backendTex =
Robert Phillips646f6372018-09-25 09:31:10 -0400995 gpu->createTestingOnlyBackendTexture(nullptr, 100, 100, GrColorType::kRGBA_8888,
Robert Phillipsf35fd8d2018-01-22 10:48:15 -0500996 false, GrMipMapped::kNo);
Greg Daniel7ef28f32017-04-20 16:41:55 +0000997
Robert Phillipsbb581ce2017-05-29 15:05:15 -0400998 GrXferProcessor::DstProxy fakeDstProxy;
999 {
Brian Salomonc67c31c2018-12-06 10:00:03 -05001000 sk_sp<GrTextureProxy> proxy = proxyProvider->wrapBackendTexture(
Brian Salomonaa6ca0a2019-01-24 16:03:07 -05001001 backendTex, kTopLeft_GrSurfaceOrigin, kBorrow_GrWrapOwnership, GrWrapCacheable::kNo,
1002 kRead_GrIOType);
Robert Phillipsbb581ce2017-05-29 15:05:15 -04001003 fakeDstProxy.setProxy(std::move(proxy));
1004 }
cdalton6fd158e2015-05-27 15:08:33 -07001005
Brian Salomona811b122017-03-30 08:21:32 -04001006 static const GrProcessorAnalysisColor colorInputs[] = {
1007 GrProcessorAnalysisColor::Opaque::kNo, GrProcessorAnalysisColor::Opaque::kYes,
Brian Osmancf860852018-10-31 14:04:39 -04001008 GrProcessorAnalysisColor(SkPMColor4f::FromBytes_RGBA(GrColorPackRGBA(0, 82, 17, 100))),
1009 GrProcessorAnalysisColor(SkPMColor4f::FromBytes_RGBA(GrColorPackRGBA(0, 82, 17, 255)))};
cdalton6fd158e2015-05-27 15:08:33 -07001010
Brian Salomonc6b71462017-02-14 11:33:01 -05001011 for (const auto& colorInput : colorInputs) {
Brian Salomona811b122017-03-30 08:21:32 -04001012 for (GrProcessorAnalysisCoverage coverageType :
1013 {GrProcessorAnalysisCoverage::kSingleChannel, GrProcessorAnalysisCoverage::kNone}) {
Mike Reed7d954ad2016-10-28 15:42:34 -04001014 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
1015 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomona1633922017-01-09 11:46:10 -05001016 const GrXPFactory* xpf = GrPorterDuffXPFactory::Get(xfermode);
Brian Salomond61c9d92017-04-10 10:54:25 -04001017 sk_sp<const GrXferProcessor> xp(
Brian Osman532b3f92018-07-11 10:02:07 -04001018 GrXPFactory::MakeXferProcessor(xpf, colorInput, coverageType, false, caps));
cdalton6fd158e2015-05-27 15:08:33 -07001019 if (!xp) {
1020 ERRORF(reporter, "Failed to create an XP without dual source blending.");
1021 return;
1022 }
1023 TEST_ASSERT(!xp->hasSecondaryOutput());
cdalton6fd158e2015-05-27 15:08:33 -07001024 }
1025 }
1026 }
Brian Salomon26102cb2018-03-09 09:33:19 -05001027 gpu->deleteTestingOnlyBackendTexture(backendTex);
cdalton6fd158e2015-05-27 15:08:33 -07001028}