blob: 7066a02fc14fb92ec6a3a6fa4124d189f6118888 [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 Phillipsf35fd8d2018-01-22 10:48:15 -050031 const GrCaps& caps = *ctxInfo.grContext()->contextPriv().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;
Brian Salomon48d1b4c2017-04-08 07:38:53 -040067 GrProcessorSet::Analysis analysis =
Brian Osman532b3f92018-07-11 10:02:07 -040068 procs.finalize(colorInput, coverageInput, nullptr, false, caps, &overrideColor);
Brian Salomon48d1b4c2017-04-08 07:38:53 -040069 return analysis;
70}
71
cdalton6fd158e2015-05-27 15:08:33 -070072class GrPorterDuffTest {
73public:
74 struct XPInfo {
Mike Reed7d954ad2016-10-28 15:42:34 -040075 XPInfo(skiatest::Reporter* reporter, SkBlendMode xfermode, const GrCaps& caps,
Brian Salomona811b122017-03-30 08:21:32 -040076 GrProcessorAnalysisColor inputColor, GrProcessorAnalysisCoverage inputCoverage) {
Brian Salomona1633922017-01-09 11:46:10 -050077 const GrXPFactory* xpf = GrPorterDuffXPFactory::Get(xfermode);
Brian Salomon48d1b4c2017-04-08 07:38:53 -040078
Greg Daniel79cdf282017-05-22 15:56:22 -040079 bool isLCD = GrProcessorAnalysisCoverage::kLCD == inputCoverage;
80
Brian Salomon48d1b4c2017-04-08 07:38:53 -040081 GrProcessorSet::Analysis analysis = do_analysis(xpf, inputColor, inputCoverage, caps);
Brian Salomon31853842017-03-28 16:32:05 -040082 fCompatibleWithCoverageAsAlpha = analysis.isCompatibleWithCoverageAsAlpha();
Brian Salomon48d1b4c2017-04-08 07:38:53 -040083 fIgnoresInputColor = analysis.inputColorIsIgnored();
Brian Salomond61c9d92017-04-10 10:54:25 -040084 sk_sp<const GrXferProcessor> xp(
Brian Osman532b3f92018-07-11 10:02:07 -040085 GrXPFactory::MakeXferProcessor(xpf, inputColor, inputCoverage, false, caps));
Greg Daniel79cdf282017-05-22 15:56:22 -040086 TEST_ASSERT(!analysis.requiresDstTexture() ||
87 (isLCD &&
88 !caps.shaderCaps()->dstReadInShaderSupport() &&
89 (SkBlendMode::kSrcOver != xfermode ||
90 !inputColor.isOpaque())));
Hal Canary342b7ac2016-11-04 11:49:42 -040091 GetXPOutputTypes(xp.get(), &fPrimaryOutputType, &fSecondaryOutputType);
cdalton6fd158e2015-05-27 15:08:33 -070092 xp->getBlendInfo(&fBlendInfo);
Greg Daniel79cdf282017-05-22 15:56:22 -040093 TEST_ASSERT(!xp->willReadDstColor() ||
94 (isLCD && (SkBlendMode::kSrcOver != xfermode ||
95 !inputColor.isOpaque())));
cdalton6fd158e2015-05-27 15:08:33 -070096 TEST_ASSERT(xp->hasSecondaryOutput() == GrBlendCoeffRefsSrc2(fBlendInfo.fDstBlend));
97 }
98
Brian Salomon31853842017-03-28 16:32:05 -040099 bool fCompatibleWithCoverageAsAlpha;
100 bool fIgnoresInputColor;
cdalton6fd158e2015-05-27 15:08:33 -0700101 int fPrimaryOutputType;
102 int fSecondaryOutputType;
103 GrXferProcessor::BlendInfo fBlendInfo;
104 };
105
106 static void GetXPOutputTypes(const GrXferProcessor* xp, int* outPrimary, int* outSecondary) {
egdanielf2342722015-11-20 15:12:59 -0800107 GrPorterDuffXPFactory::TestGetXPOutputTypes(xp, outPrimary, outSecondary);
cdalton6fd158e2015-05-27 15:08:33 -0700108 }
109};
110
egdaniel723b0502015-09-15 09:31:40 -0700111static void test_lcd_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Greg Daniel6ebe4b92017-05-19 10:56:46 -0400112 GrProcessorAnalysisColor inputColor = GrProcessorAnalysisColor::Opaque::kYes;
Brian Salomona811b122017-03-30 08:21:32 -0400113 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kLCD;
egdaniel723b0502015-09-15 09:31:40 -0700114
Mike Reed7d954ad2016-10-28 15:42:34 -0400115 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
116 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon31853842017-03-28 16:32:05 -0400117 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
egdaniel723b0502015-09-15 09:31:40 -0700118 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400119 case SkBlendMode::kClear:
Brian Salomon31853842017-03-28 16:32:05 -0400120 TEST_ASSERT(xpi.fIgnoresInputColor);
121 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400122 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
123 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
124 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
125 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
126 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700127 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
128 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400129 case SkBlendMode::kSrc:
Brian Salomon31853842017-03-28 16:32:05 -0400130 TEST_ASSERT(!xpi.fIgnoresInputColor);
131 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400132 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
133 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700134 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
135 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
Greg Daniel79cdf282017-05-22 15:56:22 -0400136 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700137 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
138 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400139 case SkBlendMode::kDst:
Brian Salomon31853842017-03-28 16:32:05 -0400140 TEST_ASSERT(xpi.fIgnoresInputColor);
141 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400142 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
143 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700144 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400145 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
146 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
147 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
egdaniel723b0502015-09-15 09:31:40 -0700148 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400149 case SkBlendMode::kSrcOver:
Brian Salomon31853842017-03-28 16:32:05 -0400150 TEST_ASSERT(!xpi.fIgnoresInputColor);
151 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
egdaniel723b0502015-09-15 09:31:40 -0700152 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
153 TEST_ASSERT(kSAModulate_OutputType == xpi.fSecondaryOutputType);
154 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
155 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
156 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
157 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
158 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400159 case SkBlendMode::kDstOver:
Brian Salomon31853842017-03-28 16:32:05 -0400160 TEST_ASSERT(!xpi.fIgnoresInputColor);
161 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400162 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
163 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700164 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400165 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
166 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700167 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
168 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400169 case SkBlendMode::kSrcIn:
Brian Salomon31853842017-03-28 16:32:05 -0400170 TEST_ASSERT(!xpi.fIgnoresInputColor);
171 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400172 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
173 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700174 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400175 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
176 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700177 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
178 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400179 case SkBlendMode::kDstIn:
Brian Salomon31853842017-03-28 16:32:05 -0400180 TEST_ASSERT(!xpi.fIgnoresInputColor);
181 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400182 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
183 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
184 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
185 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
186 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700187 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
188 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400189 case SkBlendMode::kSrcOut:
Brian Salomon31853842017-03-28 16:32:05 -0400190 TEST_ASSERT(!xpi.fIgnoresInputColor);
191 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400192 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
193 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700194 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400195 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
196 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700197 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
198 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400199 case SkBlendMode::kDstOut:
Brian Salomon31853842017-03-28 16:32:05 -0400200 TEST_ASSERT(!xpi.fIgnoresInputColor);
201 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400202 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
203 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700204 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400205 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
206 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700207 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
208 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400209 case SkBlendMode::kSrcATop:
Brian Salomon31853842017-03-28 16:32:05 -0400210 TEST_ASSERT(!xpi.fIgnoresInputColor);
211 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400212 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
213 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700214 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400215 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
216 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700217 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
218 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400219 case SkBlendMode::kDstATop:
Brian Salomon31853842017-03-28 16:32:05 -0400220 TEST_ASSERT(!xpi.fIgnoresInputColor);
221 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400222 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
223 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700224 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400225 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
226 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700227 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
228 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400229 case SkBlendMode::kXor:
Brian Salomon31853842017-03-28 16:32:05 -0400230 TEST_ASSERT(!xpi.fIgnoresInputColor);
231 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400232 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
233 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700234 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400235 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
236 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700237 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
238 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400239 case SkBlendMode::kPlus:
Brian Salomon31853842017-03-28 16:32:05 -0400240 TEST_ASSERT(!xpi.fIgnoresInputColor);
241 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400242 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
243 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700244 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
245 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
Greg Daniel79cdf282017-05-22 15:56:22 -0400246 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700247 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
248 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400249 case SkBlendMode::kModulate:
Brian Salomon31853842017-03-28 16:32:05 -0400250 TEST_ASSERT(!xpi.fIgnoresInputColor);
251 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400252 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
253 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
254 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
255 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
256 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700257 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
258 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400259 case SkBlendMode::kScreen:
Brian Salomon31853842017-03-28 16:32:05 -0400260 TEST_ASSERT(!xpi.fIgnoresInputColor);
261 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400262 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
263 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700264 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
265 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
Greg Daniel79cdf282017-05-22 15:56:22 -0400266 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700267 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
268 break;
269 default:
270 ERRORF(reporter, "Invalid xfermode.");
271 break;
272 }
273 }
274}
cdalton6fd158e2015-05-27 15:08:33 -0700275static void test_color_unknown_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomona811b122017-03-30 08:21:32 -0400276 GrProcessorAnalysisColor inputColor = GrProcessorAnalysisColor::Opaque::kNo;
277 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kSingleChannel;
cdalton6fd158e2015-05-27 15:08:33 -0700278
Mike Reed7d954ad2016-10-28 15:42:34 -0400279 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
280 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon31853842017-03-28 16:32:05 -0400281 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
cdalton6fd158e2015-05-27 15:08:33 -0700282 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400283 case SkBlendMode::kClear:
Brian Salomon31853842017-03-28 16:32:05 -0400284 TEST_ASSERT(xpi.fIgnoresInputColor);
285 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700286 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
287 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
288 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
289 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
290 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
291 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
292 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400293 case SkBlendMode::kSrc:
Brian Salomon31853842017-03-28 16:32:05 -0400294 TEST_ASSERT(!xpi.fIgnoresInputColor);
295 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700296 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
297 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
298 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
299 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
300 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
301 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
302 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400303 case SkBlendMode::kDst:
Brian Salomon31853842017-03-28 16:32:05 -0400304 TEST_ASSERT(xpi.fIgnoresInputColor);
305 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700306 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
307 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
308 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
309 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
310 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
311 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
312 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400313 case SkBlendMode::kSrcOver:
Brian Salomon31853842017-03-28 16:32:05 -0400314 TEST_ASSERT(!xpi.fIgnoresInputColor);
315 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700316 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
317 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
318 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
319 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
320 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
321 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
322 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400323 case SkBlendMode::kDstOver:
Brian Salomon31853842017-03-28 16:32:05 -0400324 TEST_ASSERT(!xpi.fIgnoresInputColor);
325 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700326 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
327 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
328 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
329 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
330 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
331 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
332 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400333 case SkBlendMode::kSrcIn:
Brian Salomon31853842017-03-28 16:32:05 -0400334 TEST_ASSERT(!xpi.fIgnoresInputColor);
335 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700336 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
337 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
338 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
339 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
340 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
341 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
342 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400343 case SkBlendMode::kDstIn:
Brian Salomon31853842017-03-28 16:32:05 -0400344 TEST_ASSERT(!xpi.fIgnoresInputColor);
345 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700346 TEST_ASSERT(kISAModulate_OutputType == xpi.fPrimaryOutputType);
347 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
348 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
349 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
350 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
351 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
352 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400353 case SkBlendMode::kSrcOut:
Brian Salomon31853842017-03-28 16:32:05 -0400354 TEST_ASSERT(!xpi.fIgnoresInputColor);
355 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700356 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
357 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
358 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
359 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
360 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
361 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
362 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400363 case SkBlendMode::kDstOut:
Brian Salomon31853842017-03-28 16:32:05 -0400364 TEST_ASSERT(!xpi.fIgnoresInputColor);
365 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700366 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
367 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
368 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
369 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
370 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
371 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
372 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400373 case SkBlendMode::kSrcATop:
Brian Salomon31853842017-03-28 16:32:05 -0400374 TEST_ASSERT(!xpi.fIgnoresInputColor);
375 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700376 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
377 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
378 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
379 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
380 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
381 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
382 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400383 case SkBlendMode::kDstATop:
Brian Salomon31853842017-03-28 16:32:05 -0400384 TEST_ASSERT(!xpi.fIgnoresInputColor);
385 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700386 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
387 TEST_ASSERT(kISAModulate_OutputType == xpi.fSecondaryOutputType);
388 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
389 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
390 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
391 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
392 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400393 case SkBlendMode::kXor:
Brian Salomon31853842017-03-28 16:32:05 -0400394 TEST_ASSERT(!xpi.fIgnoresInputColor);
395 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700396 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
397 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
398 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
399 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
400 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
401 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
402 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400403 case SkBlendMode::kPlus:
Brian Salomon31853842017-03-28 16:32:05 -0400404 TEST_ASSERT(!xpi.fIgnoresInputColor);
405 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700406 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
407 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
408 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
409 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
410 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
411 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
412 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400413 case SkBlendMode::kModulate:
Brian Salomon31853842017-03-28 16:32:05 -0400414 TEST_ASSERT(!xpi.fIgnoresInputColor);
415 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700416 TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType);
417 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
418 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
419 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
420 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
421 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
422 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400423 case SkBlendMode::kScreen:
Brian Salomon31853842017-03-28 16:32:05 -0400424 TEST_ASSERT(!xpi.fIgnoresInputColor);
425 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700426 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
427 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
428 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
429 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
430 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
431 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
432 break;
433 default:
434 ERRORF(reporter, "Invalid xfermode.");
435 break;
436 }
437 }
438}
439
Brian Salomon31853842017-03-28 16:32:05 -0400440static void test_color_not_opaque_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Osmancf860852018-10-31 14:04:39 -0400441 GrProcessorAnalysisColor inputColor(
442 SkPMColor4f::FromBytes_RGBA(GrColorPackRGBA(229, 0, 154, 240)));
Brian Salomona811b122017-03-30 08:21:32 -0400443 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kNone;
cdalton6fd158e2015-05-27 15:08:33 -0700444
Mike Reed7d954ad2016-10-28 15:42:34 -0400445 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
446 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon31853842017-03-28 16:32:05 -0400447 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
cdalton6fd158e2015-05-27 15:08:33 -0700448 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400449 case SkBlendMode::kClear:
Brian Salomon31853842017-03-28 16:32:05 -0400450 TEST_ASSERT(xpi.fIgnoresInputColor);
451 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700452 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
453 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
454 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
455 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
456 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
457 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
458 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400459 case SkBlendMode::kSrc:
Brian Salomon31853842017-03-28 16:32:05 -0400460 TEST_ASSERT(!xpi.fIgnoresInputColor);
461 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700462 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
463 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
464 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
465 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
466 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
467 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
468 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400469 case SkBlendMode::kDst:
Brian Salomon31853842017-03-28 16:32:05 -0400470 TEST_ASSERT(xpi.fIgnoresInputColor);
471 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700472 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
473 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
474 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
475 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
476 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
477 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
478 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400479 case SkBlendMode::kSrcOver:
Brian Salomon31853842017-03-28 16:32:05 -0400480 TEST_ASSERT(!xpi.fIgnoresInputColor);
481 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700482 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
483 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
484 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
485 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
486 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
487 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
488 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400489 case SkBlendMode::kDstOver:
Brian Salomon31853842017-03-28 16:32:05 -0400490 TEST_ASSERT(!xpi.fIgnoresInputColor);
491 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700492 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
493 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
494 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
495 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
496 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
497 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
498 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400499 case SkBlendMode::kSrcIn:
Brian Salomon31853842017-03-28 16:32:05 -0400500 TEST_ASSERT(!xpi.fIgnoresInputColor);
501 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700502 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
503 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
504 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
505 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
506 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
507 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
508 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400509 case SkBlendMode::kDstIn:
Brian Salomon31853842017-03-28 16:32:05 -0400510 TEST_ASSERT(!xpi.fIgnoresInputColor);
511 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700512 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
513 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
514 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
515 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
516 TEST_ASSERT(kSA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
517 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
518 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400519 case SkBlendMode::kSrcOut:
Brian Salomon31853842017-03-28 16:32:05 -0400520 TEST_ASSERT(!xpi.fIgnoresInputColor);
521 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700522 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
523 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
524 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
525 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
526 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
527 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
528 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400529 case SkBlendMode::kDstOut:
Brian Salomon31853842017-03-28 16:32:05 -0400530 TEST_ASSERT(!xpi.fIgnoresInputColor);
531 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700532 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
533 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
534 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
535 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
536 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
537 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
538 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400539 case SkBlendMode::kSrcATop:
Brian Salomon31853842017-03-28 16:32:05 -0400540 TEST_ASSERT(!xpi.fIgnoresInputColor);
541 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700542 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
543 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
544 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
545 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
546 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
547 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
548 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400549 case SkBlendMode::kDstATop:
Brian Salomon31853842017-03-28 16:32:05 -0400550 TEST_ASSERT(!xpi.fIgnoresInputColor);
551 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700552 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
553 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
554 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
555 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
556 TEST_ASSERT(kSA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
557 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
558 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400559 case SkBlendMode::kXor:
Brian Salomon31853842017-03-28 16:32:05 -0400560 TEST_ASSERT(!xpi.fIgnoresInputColor);
561 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700562 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
563 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
564 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
565 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
566 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
567 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
568 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400569 case SkBlendMode::kPlus:
Brian Salomon31853842017-03-28 16:32:05 -0400570 TEST_ASSERT(!xpi.fIgnoresInputColor);
571 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700572 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
573 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
574 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
575 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
576 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
577 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
578 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400579 case SkBlendMode::kModulate:
Brian Salomon31853842017-03-28 16:32:05 -0400580 TEST_ASSERT(!xpi.fIgnoresInputColor);
581 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700582 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
583 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
584 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
585 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
586 TEST_ASSERT(kSC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
587 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
588 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400589 case SkBlendMode::kScreen:
Brian Salomon31853842017-03-28 16:32:05 -0400590 TEST_ASSERT(!xpi.fIgnoresInputColor);
591 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700592 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
593 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
594 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
595 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
596 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
597 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
598 break;
599 default:
600 ERRORF(reporter, "Invalid xfermode.");
601 break;
602 }
603 }
604}
605
606static void test_color_opaque_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomona811b122017-03-30 08:21:32 -0400607 GrProcessorAnalysisColor inputColor = GrProcessorAnalysisColor::Opaque::kYes;
608 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kSingleChannel;
cdalton6fd158e2015-05-27 15:08:33 -0700609
Mike Reed7d954ad2016-10-28 15:42:34 -0400610 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
611 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon31853842017-03-28 16:32:05 -0400612 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
cdalton6fd158e2015-05-27 15:08:33 -0700613 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400614 case SkBlendMode::kClear:
Brian Salomon31853842017-03-28 16:32:05 -0400615 TEST_ASSERT(xpi.fIgnoresInputColor);
616 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700617 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
618 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
619 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
620 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
621 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
622 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
623 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400624 case SkBlendMode::kSrc:
Brian Salomon31853842017-03-28 16:32:05 -0400625 TEST_ASSERT(!xpi.fIgnoresInputColor);
626 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700627 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
628 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
629 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
630 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
631 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
632 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
633 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400634 case SkBlendMode::kDst:
Brian Salomon31853842017-03-28 16:32:05 -0400635 TEST_ASSERT(xpi.fIgnoresInputColor);
636 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700637 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
638 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
639 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
640 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
641 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
642 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
643 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400644 case SkBlendMode::kSrcOver:
Brian Salomon31853842017-03-28 16:32:05 -0400645 TEST_ASSERT(!xpi.fIgnoresInputColor);
646 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700647 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
648 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
649 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
650 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
651 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
652 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
653 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400654 case SkBlendMode::kDstOver:
Brian Salomon31853842017-03-28 16:32:05 -0400655 TEST_ASSERT(!xpi.fIgnoresInputColor);
656 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700657 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
658 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
659 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
660 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
661 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
662 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
663 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400664 case SkBlendMode::kSrcIn:
Brian Salomon31853842017-03-28 16:32:05 -0400665 TEST_ASSERT(!xpi.fIgnoresInputColor);
666 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700667 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
668 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
669 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
670 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
671 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
672 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
673 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400674 case SkBlendMode::kDstIn:
Brian Salomon31853842017-03-28 16:32:05 -0400675 TEST_ASSERT(xpi.fIgnoresInputColor);
676 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700677 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
678 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
679 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
680 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
681 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
682 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
683 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400684 case SkBlendMode::kSrcOut:
Brian Salomon31853842017-03-28 16:32:05 -0400685 TEST_ASSERT(!xpi.fIgnoresInputColor);
686 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700687 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
688 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
689 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
690 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
691 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
692 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
693 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400694 case SkBlendMode::kDstOut:
Brian Salomon31853842017-03-28 16:32:05 -0400695 TEST_ASSERT(xpi.fIgnoresInputColor);
696 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700697 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
698 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
699 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
700 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
701 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
702 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
703 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400704 case SkBlendMode::kSrcATop:
Brian Salomon31853842017-03-28 16:32:05 -0400705 TEST_ASSERT(!xpi.fIgnoresInputColor);
706 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700707 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
708 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
709 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
710 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
711 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
712 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
713 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400714 case SkBlendMode::kDstATop:
Brian Salomon31853842017-03-28 16:32:05 -0400715 TEST_ASSERT(!xpi.fIgnoresInputColor);
716 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700717 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
718 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
719 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
720 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
721 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
722 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
723 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400724 case SkBlendMode::kXor:
Brian Salomon31853842017-03-28 16:32:05 -0400725 TEST_ASSERT(!xpi.fIgnoresInputColor);
726 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700727 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
728 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
729 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
730 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
731 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
732 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
733 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400734 case SkBlendMode::kPlus:
Brian Salomon31853842017-03-28 16:32:05 -0400735 TEST_ASSERT(!xpi.fIgnoresInputColor);
736 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700737 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
738 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
739 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
740 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
741 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
742 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
743 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400744 case SkBlendMode::kModulate:
Brian Salomon31853842017-03-28 16:32:05 -0400745 TEST_ASSERT(!xpi.fIgnoresInputColor);
cdalton6fd158e2015-05-27 15:08:33 -0700746 TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType);
747 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
748 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
749 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
750 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
751 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
752 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400753 case SkBlendMode::kScreen:
Brian Salomon31853842017-03-28 16:32:05 -0400754 TEST_ASSERT(!xpi.fIgnoresInputColor);
755 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700756 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
757 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
758 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
759 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
760 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
761 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
762 break;
763 default:
764 ERRORF(reporter, "Invalid xfermode.");
765 break;
766 }
767 }
768}
769
770static void test_color_opaque_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomona811b122017-03-30 08:21:32 -0400771 GrProcessorAnalysisColor inputColor = GrProcessorAnalysisColor::Opaque::kYes;
772 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kNone;
cdalton6fd158e2015-05-27 15:08:33 -0700773
Mike Reed7d954ad2016-10-28 15:42:34 -0400774 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
775 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon31853842017-03-28 16:32:05 -0400776 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
cdalton6fd158e2015-05-27 15:08:33 -0700777
778 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400779 case SkBlendMode::kClear:
Brian Salomon31853842017-03-28 16:32:05 -0400780 TEST_ASSERT(xpi.fIgnoresInputColor);
781 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700782 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
783 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
784 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
785 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
786 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
787 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
788 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400789 case SkBlendMode::kSrc:
Brian Salomon31853842017-03-28 16:32:05 -0400790 TEST_ASSERT(!xpi.fIgnoresInputColor);
791 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700792 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
793 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
794 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
795 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
796 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
797 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
798 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400799 case SkBlendMode::kDst:
Brian Salomon31853842017-03-28 16:32:05 -0400800 TEST_ASSERT(xpi.fIgnoresInputColor);
801 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700802 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
803 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
804 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
805 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
806 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
807 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
808 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400809 case SkBlendMode::kSrcOver:
Brian Salomon28207df2017-06-05 12:25:13 -0400810 // We don't specialize opaque src-over. See note in GrPorterDuffXferProcessor.cpp
Brian Salomon31853842017-03-28 16:32:05 -0400811 TEST_ASSERT(!xpi.fIgnoresInputColor);
Brian Salomon28207df2017-06-05 12:25:13 -0400812 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700813 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
814 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
815 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
816 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
Brian Salomon28207df2017-06-05 12:25:13 -0400817 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
cdalton6fd158e2015-05-27 15:08:33 -0700818 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
819 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400820 case SkBlendMode::kDstOver:
Brian Salomon31853842017-03-28 16:32:05 -0400821 TEST_ASSERT(!xpi.fIgnoresInputColor);
822 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700823 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
824 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
825 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
826 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
827 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
828 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
829 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400830 case SkBlendMode::kSrcIn:
Brian Salomon31853842017-03-28 16:32:05 -0400831 TEST_ASSERT(!xpi.fIgnoresInputColor);
832 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700833 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
834 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
835 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
836 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
837 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
838 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
839 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400840 case SkBlendMode::kDstIn:
Brian Salomon31853842017-03-28 16:32:05 -0400841 TEST_ASSERT(xpi.fIgnoresInputColor);
842 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700843 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
844 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
845 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
846 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
847 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
848 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
849 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400850 case SkBlendMode::kSrcOut:
Brian Salomon31853842017-03-28 16:32:05 -0400851 TEST_ASSERT(!xpi.fIgnoresInputColor);
852 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700853 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
854 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
855 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
856 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
857 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
858 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
859 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400860 case SkBlendMode::kDstOut:
Brian Salomon31853842017-03-28 16:32:05 -0400861 TEST_ASSERT(xpi.fIgnoresInputColor);
862 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700863 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
864 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
865 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
866 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
867 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
868 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
869 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400870 case SkBlendMode::kSrcATop:
Brian Salomon31853842017-03-28 16:32:05 -0400871 TEST_ASSERT(!xpi.fIgnoresInputColor);
872 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700873 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
874 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
875 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
876 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
877 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
878 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
879 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400880 case SkBlendMode::kDstATop:
Brian Salomon31853842017-03-28 16:32:05 -0400881 TEST_ASSERT(!xpi.fIgnoresInputColor);
882 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700883 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
884 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
885 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
886 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
887 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
888 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
889 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400890 case SkBlendMode::kXor:
Brian Salomon31853842017-03-28 16:32:05 -0400891 TEST_ASSERT(!xpi.fIgnoresInputColor);
892 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700893 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
894 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
895 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
896 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
897 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
898 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
899 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400900 case SkBlendMode::kPlus:
Brian Salomon31853842017-03-28 16:32:05 -0400901 TEST_ASSERT(!xpi.fIgnoresInputColor);
902 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700903 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
904 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
905 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
906 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
907 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
908 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
909 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400910 case SkBlendMode::kModulate:
Brian Salomon31853842017-03-28 16:32:05 -0400911 TEST_ASSERT(!xpi.fIgnoresInputColor);
912 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700913 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
914 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
915 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
916 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
917 TEST_ASSERT(kSC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
918 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
919 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400920 case SkBlendMode::kScreen:
Brian Salomon31853842017-03-28 16:32:05 -0400921 TEST_ASSERT(!xpi.fIgnoresInputColor);
922 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700923 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
924 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
925 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
926 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
927 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
928 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
929 break;
930 default:
931 ERRORF(reporter, "Invalid xfermode.");
932 break;
933 }
934 }
935}
936
egdaniel723b0502015-09-15 09:31:40 -0700937static void test_lcd_coverage_fallback_case(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomon31853842017-03-28 16:32:05 -0400938 const GrXPFactory* xpf = GrPorterDuffXPFactory::Get(SkBlendMode::kSrcOver);
Brian Osmancf860852018-10-31 14:04:39 -0400939 GrProcessorAnalysisColor color = SkPMColor4f::FromBytes_RGBA(GrColorPackRGBA(123, 45, 67, 255));
Brian Salomona811b122017-03-30 08:21:32 -0400940 GrProcessorAnalysisCoverage coverage = GrProcessorAnalysisCoverage::kLCD;
Brian Osman532b3f92018-07-11 10:02:07 -0400941 TEST_ASSERT(!(GrXPFactory::GetAnalysisProperties(xpf, color, coverage, caps) &
Greg Daniel6ebe4b92017-05-19 10:56:46 -0400942 GrXPFactory::AnalysisProperties::kRequiresDstTexture));
943 sk_sp<const GrXferProcessor> xp_opaque(
Brian Osman532b3f92018-07-11 10:02:07 -0400944 GrXPFactory::MakeXferProcessor(xpf, color, coverage, false, caps));
Greg Daniel6ebe4b92017-05-19 10:56:46 -0400945 if (!xp_opaque) {
946 ERRORF(reporter, "Failed to create an XP with LCD coverage.");
947 return;
948 }
949
950 GrXferProcessor::BlendInfo blendInfo;
951 xp_opaque->getBlendInfo(&blendInfo);
952 TEST_ASSERT(blendInfo.fWriteColor);
953
954 // Test with non-opaque alpha
Brian Osmancf860852018-10-31 14:04:39 -0400955 color = SkPMColor4f::FromBytes_RGBA(GrColorPackRGBA(123, 45, 67, 221));
Greg Daniel6ebe4b92017-05-19 10:56:46 -0400956 coverage = GrProcessorAnalysisCoverage::kLCD;
Brian Osman532b3f92018-07-11 10:02:07 -0400957 TEST_ASSERT(!(GrXPFactory::GetAnalysisProperties(xpf, color, coverage, caps) &
Greg Danield7b11592017-06-14 13:37:12 -0400958 GrXPFactory::AnalysisProperties::kRequiresDstTexture));
Brian Salomond61c9d92017-04-10 10:54:25 -0400959 sk_sp<const GrXferProcessor> xp(
Brian Osman532b3f92018-07-11 10:02:07 -0400960 GrXPFactory::MakeXferProcessor(xpf, color, coverage, false, caps));
cdalton6fd158e2015-05-27 15:08:33 -0700961 if (!xp) {
962 ERRORF(reporter, "Failed to create an XP with LCD coverage.");
963 return;
964 }
965
cdalton6fd158e2015-05-27 15:08:33 -0700966 xp->getBlendInfo(&blendInfo);
967 TEST_ASSERT(blendInfo.fWriteColor);
968}
969
Brian Salomondcfca432017-11-15 15:48:03 -0500970DEF_GPUTEST(PorterDuffNoDualSourceBlending, reporter, options) {
971 GrContextOptions opts = options;
cdalton6fd158e2015-05-27 15:08:33 -0700972 opts.fSuppressDualSourceBlending = true;
bsalomon3724e572016-03-30 18:56:19 -0700973 sk_gpu_test::GrContextFactory mockFactory(opts);
bsalomon85b4b532016-04-05 11:06:27 -0700974 GrContext* ctx = mockFactory.get(sk_gpu_test::GrContextFactory::kNullGL_ContextType);
cdalton6fd158e2015-05-27 15:08:33 -0700975 if (!ctx) {
Ben Wagnerb4aab9a2017-08-16 10:53:04 -0400976 SK_ABORT("Failed to create null context without ARB_blend_func_extended.");
cdalton6fd158e2015-05-27 15:08:33 -0700977 return;
978 }
979
Robert Phillipsf35fd8d2018-01-22 10:48:15 -0500980 GrGpu* gpu = ctx->contextPriv().getGpu();
Robert Phillips0bd24dc2018-01-16 08:06:32 -0500981 GrProxyProvider* proxyProvider = ctx->contextPriv().proxyProvider();
Brian Salomonc7fe0f72018-05-11 10:14:21 -0400982 const GrCaps& caps = *ctx->contextPriv().caps();
cdalton6fd158e2015-05-27 15:08:33 -0700983 if (caps.shaderCaps()->dualSourceBlendingSupport()) {
Ben Wagnerb4aab9a2017-08-16 10:53:04 -0400984 SK_ABORT("Null context failed to honor request for no ARB_blend_func_extended.");
cdalton6fd158e2015-05-27 15:08:33 -0700985 return;
986 }
987
Robert Phillipsd21b2a52017-12-12 13:01:25 -0500988 GrBackendTexture backendTex =
Robert Phillips646f6372018-09-25 09:31:10 -0400989 gpu->createTestingOnlyBackendTexture(nullptr, 100, 100, GrColorType::kRGBA_8888,
Robert Phillipsf35fd8d2018-01-22 10:48:15 -0500990 false, GrMipMapped::kNo);
Greg Daniel7ef28f32017-04-20 16:41:55 +0000991
Robert Phillipsbb581ce2017-05-29 15:05:15 -0400992 GrXferProcessor::DstProxy fakeDstProxy;
993 {
Brian Salomonc67c31c2018-12-06 10:00:03 -0500994 sk_sp<GrTextureProxy> proxy = proxyProvider->wrapBackendTexture(
995 backendTex, kTopLeft_GrSurfaceOrigin, kBorrow_GrWrapOwnership, kRead_GrIOType);
Robert Phillipsbb581ce2017-05-29 15:05:15 -0400996 fakeDstProxy.setProxy(std::move(proxy));
997 }
cdalton6fd158e2015-05-27 15:08:33 -0700998
Brian Salomona811b122017-03-30 08:21:32 -0400999 static const GrProcessorAnalysisColor colorInputs[] = {
1000 GrProcessorAnalysisColor::Opaque::kNo, GrProcessorAnalysisColor::Opaque::kYes,
Brian Osmancf860852018-10-31 14:04:39 -04001001 GrProcessorAnalysisColor(SkPMColor4f::FromBytes_RGBA(GrColorPackRGBA(0, 82, 17, 100))),
1002 GrProcessorAnalysisColor(SkPMColor4f::FromBytes_RGBA(GrColorPackRGBA(0, 82, 17, 255)))};
cdalton6fd158e2015-05-27 15:08:33 -07001003
Brian Salomonc6b71462017-02-14 11:33:01 -05001004 for (const auto& colorInput : colorInputs) {
Brian Salomona811b122017-03-30 08:21:32 -04001005 for (GrProcessorAnalysisCoverage coverageType :
1006 {GrProcessorAnalysisCoverage::kSingleChannel, GrProcessorAnalysisCoverage::kNone}) {
Mike Reed7d954ad2016-10-28 15:42:34 -04001007 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
1008 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomona1633922017-01-09 11:46:10 -05001009 const GrXPFactory* xpf = GrPorterDuffXPFactory::Get(xfermode);
Brian Salomond61c9d92017-04-10 10:54:25 -04001010 sk_sp<const GrXferProcessor> xp(
Brian Osman532b3f92018-07-11 10:02:07 -04001011 GrXPFactory::MakeXferProcessor(xpf, colorInput, coverageType, false, caps));
cdalton6fd158e2015-05-27 15:08:33 -07001012 if (!xp) {
1013 ERRORF(reporter, "Failed to create an XP without dual source blending.");
1014 return;
1015 }
1016 TEST_ASSERT(!xp->hasSecondaryOutput());
cdalton6fd158e2015-05-27 15:08:33 -07001017 }
1018 }
1019 }
Brian Salomon26102cb2018-03-09 09:33:19 -05001020 gpu->deleteTestingOnlyBackendTexture(backendTex);
cdalton6fd158e2015-05-27 15:08:33 -07001021}