blob: e621fb865aa549d5d8c79d592fb8c56ef476729f [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));
66 GrColor overrideColor;
67 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();
83 fCanCombineOverlappedStencilAndCover = analysis.canCombineOverlappedStencilAndCover();
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())));
Hal Canary342b7ac2016-11-04 11:49:42 -040092 GetXPOutputTypes(xp.get(), &fPrimaryOutputType, &fSecondaryOutputType);
cdalton6fd158e2015-05-27 15:08:33 -070093 xp->getBlendInfo(&fBlendInfo);
Greg Daniel79cdf282017-05-22 15:56:22 -040094 TEST_ASSERT(!xp->willReadDstColor() ||
95 (isLCD && (SkBlendMode::kSrcOver != xfermode ||
96 !inputColor.isOpaque())));
cdalton6fd158e2015-05-27 15:08:33 -070097 TEST_ASSERT(xp->hasSecondaryOutput() == GrBlendCoeffRefsSrc2(fBlendInfo.fDstBlend));
98 }
99
Brian Salomon54d212e2017-03-21 14:22:38 -0400100 bool fCanCombineOverlappedStencilAndCover;
Brian Salomon31853842017-03-28 16:32:05 -0400101 bool fCompatibleWithCoverageAsAlpha;
102 bool fIgnoresInputColor;
cdalton6fd158e2015-05-27 15:08:33 -0700103 int fPrimaryOutputType;
104 int fSecondaryOutputType;
105 GrXferProcessor::BlendInfo fBlendInfo;
106 };
107
108 static void GetXPOutputTypes(const GrXferProcessor* xp, int* outPrimary, int* outSecondary) {
egdanielf2342722015-11-20 15:12:59 -0800109 GrPorterDuffXPFactory::TestGetXPOutputTypes(xp, outPrimary, outSecondary);
cdalton6fd158e2015-05-27 15:08:33 -0700110 }
111};
112
egdaniel723b0502015-09-15 09:31:40 -0700113static void test_lcd_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Greg Daniel6ebe4b92017-05-19 10:56:46 -0400114 GrProcessorAnalysisColor inputColor = GrProcessorAnalysisColor::Opaque::kYes;
Brian Salomona811b122017-03-30 08:21:32 -0400115 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kLCD;
egdaniel723b0502015-09-15 09:31:40 -0700116
Mike Reed7d954ad2016-10-28 15:42:34 -0400117 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
118 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon31853842017-03-28 16:32:05 -0400119 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
egdaniel723b0502015-09-15 09:31:40 -0700120 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400121 case SkBlendMode::kClear:
Brian Salomon54d212e2017-03-21 14:22:38 -0400122 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400123 TEST_ASSERT(xpi.fIgnoresInputColor);
124 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400125 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
126 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
127 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
128 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
129 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700130 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
131 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400132 case SkBlendMode::kSrc:
Brian Salomon54d212e2017-03-21 14:22:38 -0400133 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400134 TEST_ASSERT(!xpi.fIgnoresInputColor);
135 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400136 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
137 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700138 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
139 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
Greg Daniel79cdf282017-05-22 15:56:22 -0400140 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700141 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
142 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400143 case SkBlendMode::kDst:
Brian Salomon54d212e2017-03-21 14:22:38 -0400144 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400145 TEST_ASSERT(xpi.fIgnoresInputColor);
146 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400147 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
148 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700149 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400150 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
151 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
152 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
egdaniel723b0502015-09-15 09:31:40 -0700153 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400154 case SkBlendMode::kSrcOver:
Brian Salomon54d212e2017-03-21 14:22:38 -0400155 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
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 Salomon54d212e2017-03-21 14:22:38 -0400166 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400167 TEST_ASSERT(!xpi.fIgnoresInputColor);
168 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400169 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
170 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700171 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400172 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
173 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700174 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
175 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400176 case SkBlendMode::kSrcIn:
Brian Salomon54d212e2017-03-21 14:22:38 -0400177 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400178 TEST_ASSERT(!xpi.fIgnoresInputColor);
179 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400180 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
181 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700182 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400183 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
184 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700185 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
186 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400187 case SkBlendMode::kDstIn:
Brian Salomon54d212e2017-03-21 14:22:38 -0400188 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400189 TEST_ASSERT(!xpi.fIgnoresInputColor);
190 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400191 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
192 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
193 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
194 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
195 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700196 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
197 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400198 case SkBlendMode::kSrcOut:
Brian Salomon54d212e2017-03-21 14:22:38 -0400199 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
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::kDstOut:
Brian Salomon54d212e2017-03-21 14:22:38 -0400210 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400211 TEST_ASSERT(!xpi.fIgnoresInputColor);
212 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400213 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
214 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700215 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400216 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
217 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700218 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
219 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400220 case SkBlendMode::kSrcATop:
Brian Salomon54d212e2017-03-21 14:22:38 -0400221 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400222 TEST_ASSERT(!xpi.fIgnoresInputColor);
223 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400224 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
225 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700226 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400227 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
228 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700229 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
230 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400231 case SkBlendMode::kDstATop:
Brian Salomon54d212e2017-03-21 14:22:38 -0400232 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400233 TEST_ASSERT(!xpi.fIgnoresInputColor);
234 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400235 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
236 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700237 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400238 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
239 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700240 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
241 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400242 case SkBlendMode::kXor:
Brian Salomon54d212e2017-03-21 14:22:38 -0400243 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400244 TEST_ASSERT(!xpi.fIgnoresInputColor);
245 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400246 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
247 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700248 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400249 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
250 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700251 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
252 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400253 case SkBlendMode::kPlus:
Brian Salomon54d212e2017-03-21 14:22:38 -0400254 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400255 TEST_ASSERT(!xpi.fIgnoresInputColor);
256 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400257 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
258 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700259 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
260 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
Greg Daniel79cdf282017-05-22 15:56:22 -0400261 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700262 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
263 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400264 case SkBlendMode::kModulate:
Brian Salomon54d212e2017-03-21 14:22:38 -0400265 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
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);
270 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
271 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
272 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700273 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
274 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400275 case SkBlendMode::kScreen:
Brian Salomon54d212e2017-03-21 14:22:38 -0400276 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400277 TEST_ASSERT(!xpi.fIgnoresInputColor);
278 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400279 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
280 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700281 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
282 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
Greg Daniel79cdf282017-05-22 15:56:22 -0400283 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700284 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
285 break;
286 default:
287 ERRORF(reporter, "Invalid xfermode.");
288 break;
289 }
290 }
291}
cdalton6fd158e2015-05-27 15:08:33 -0700292static void test_color_unknown_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomona811b122017-03-30 08:21:32 -0400293 GrProcessorAnalysisColor inputColor = GrProcessorAnalysisColor::Opaque::kNo;
294 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kSingleChannel;
cdalton6fd158e2015-05-27 15:08:33 -0700295
Mike Reed7d954ad2016-10-28 15:42:34 -0400296 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
297 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon31853842017-03-28 16:32:05 -0400298 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
cdalton6fd158e2015-05-27 15:08:33 -0700299 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400300 case SkBlendMode::kClear:
Brian Salomon54d212e2017-03-21 14:22:38 -0400301 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400302 TEST_ASSERT(xpi.fIgnoresInputColor);
303 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700304 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
305 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
306 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
307 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
308 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
309 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
310 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400311 case SkBlendMode::kSrc:
Brian Salomon54d212e2017-03-21 14:22:38 -0400312 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400313 TEST_ASSERT(!xpi.fIgnoresInputColor);
314 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700315 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
316 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
317 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
318 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
319 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
320 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
321 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400322 case SkBlendMode::kDst:
Brian Salomon54d212e2017-03-21 14:22:38 -0400323 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
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(kNone_OutputType == xpi.fPrimaryOutputType);
327 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
328 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
329 TEST_ASSERT(kZero_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::kSrcOver:
Brian Salomon54d212e2017-03-21 14:22:38 -0400334 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400335 TEST_ASSERT(!xpi.fIgnoresInputColor);
336 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700337 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
338 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
339 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
340 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
341 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
342 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
343 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400344 case SkBlendMode::kDstOver:
Brian Salomon54d212e2017-03-21 14:22:38 -0400345 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400346 TEST_ASSERT(!xpi.fIgnoresInputColor);
347 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700348 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
349 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
350 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
351 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
352 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
353 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
354 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400355 case SkBlendMode::kSrcIn:
Brian Salomon54d212e2017-03-21 14:22:38 -0400356 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400357 TEST_ASSERT(!xpi.fIgnoresInputColor);
358 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700359 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
360 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
361 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
362 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
363 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
364 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
365 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400366 case SkBlendMode::kDstIn:
Brian Salomon54d212e2017-03-21 14:22:38 -0400367 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400368 TEST_ASSERT(!xpi.fIgnoresInputColor);
369 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700370 TEST_ASSERT(kISAModulate_OutputType == xpi.fPrimaryOutputType);
371 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
372 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
373 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
374 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
375 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
376 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400377 case SkBlendMode::kSrcOut:
Brian Salomon54d212e2017-03-21 14:22:38 -0400378 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400379 TEST_ASSERT(!xpi.fIgnoresInputColor);
380 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700381 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
382 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
383 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
384 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
385 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
386 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
387 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400388 case SkBlendMode::kDstOut:
Brian Salomon54d212e2017-03-21 14:22:38 -0400389 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
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(kNone_OutputType == xpi.fSecondaryOutputType);
394 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
395 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
396 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
397 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
398 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400399 case SkBlendMode::kSrcATop:
Brian Salomon54d212e2017-03-21 14:22:38 -0400400 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400401 TEST_ASSERT(!xpi.fIgnoresInputColor);
402 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700403 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
404 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
405 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
406 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
407 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
408 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
409 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400410 case SkBlendMode::kDstATop:
Brian Salomon54d212e2017-03-21 14:22:38 -0400411 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400412 TEST_ASSERT(!xpi.fIgnoresInputColor);
413 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700414 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
415 TEST_ASSERT(kISAModulate_OutputType == xpi.fSecondaryOutputType);
416 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
417 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
418 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
419 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
420 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400421 case SkBlendMode::kXor:
Brian Salomon54d212e2017-03-21 14:22:38 -0400422 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400423 TEST_ASSERT(!xpi.fIgnoresInputColor);
424 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700425 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
426 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
427 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
428 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
429 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
430 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
431 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400432 case SkBlendMode::kPlus:
Brian Salomon54d212e2017-03-21 14:22:38 -0400433 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400434 TEST_ASSERT(!xpi.fIgnoresInputColor);
435 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700436 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
437 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
438 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
439 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
440 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
441 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
442 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400443 case SkBlendMode::kModulate:
Brian Salomon54d212e2017-03-21 14:22:38 -0400444 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400445 TEST_ASSERT(!xpi.fIgnoresInputColor);
446 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700447 TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType);
448 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
449 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
450 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
451 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
452 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
453 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400454 case SkBlendMode::kScreen:
Brian Salomon54d212e2017-03-21 14:22:38 -0400455 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
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(kModulate_OutputType == xpi.fPrimaryOutputType);
459 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
460 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
461 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
462 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
463 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
464 break;
465 default:
466 ERRORF(reporter, "Invalid xfermode.");
467 break;
468 }
469 }
470}
471
Brian Salomon31853842017-03-28 16:32:05 -0400472static void test_color_not_opaque_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomona811b122017-03-30 08:21:32 -0400473 GrProcessorAnalysisColor inputColor(GrColorPackRGBA(229, 0, 154, 240));
474 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kNone;
cdalton6fd158e2015-05-27 15:08:33 -0700475
Mike Reed7d954ad2016-10-28 15:42:34 -0400476 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
477 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon31853842017-03-28 16:32:05 -0400478 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
cdalton6fd158e2015-05-27 15:08:33 -0700479 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400480 case SkBlendMode::kClear:
Brian Salomon54d212e2017-03-21 14:22:38 -0400481 TEST_ASSERT(xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400482 TEST_ASSERT(xpi.fIgnoresInputColor);
483 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700484 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
485 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
486 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
487 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
488 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
489 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
490 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400491 case SkBlendMode::kSrc:
Brian Salomon54d212e2017-03-21 14:22:38 -0400492 TEST_ASSERT(xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400493 TEST_ASSERT(!xpi.fIgnoresInputColor);
494 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700495 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
496 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
497 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
498 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
499 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
500 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
501 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400502 case SkBlendMode::kDst:
Brian Salomon54d212e2017-03-21 14:22:38 -0400503 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400504 TEST_ASSERT(xpi.fIgnoresInputColor);
505 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700506 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
507 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
508 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
509 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
510 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
511 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
512 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400513 case SkBlendMode::kSrcOver:
Brian Salomon54d212e2017-03-21 14:22:38 -0400514 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400515 TEST_ASSERT(!xpi.fIgnoresInputColor);
516 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700517 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
518 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
519 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
520 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
521 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
522 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
523 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400524 case SkBlendMode::kDstOver:
Brian Salomon54d212e2017-03-21 14:22:38 -0400525 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
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(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
533 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
534 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400535 case SkBlendMode::kSrcIn:
Brian Salomon54d212e2017-03-21 14:22:38 -0400536 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400537 TEST_ASSERT(!xpi.fIgnoresInputColor);
538 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700539 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
540 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
541 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
542 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
543 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
544 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
545 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400546 case SkBlendMode::kDstIn:
Brian Salomon54d212e2017-03-21 14:22:38 -0400547 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400548 TEST_ASSERT(!xpi.fIgnoresInputColor);
549 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700550 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
551 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
552 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
553 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
554 TEST_ASSERT(kSA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
555 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
556 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400557 case SkBlendMode::kSrcOut:
Brian Salomon54d212e2017-03-21 14:22:38 -0400558 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400559 TEST_ASSERT(!xpi.fIgnoresInputColor);
560 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700561 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
562 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
563 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
564 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
565 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
566 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
567 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400568 case SkBlendMode::kDstOut:
Brian Salomon54d212e2017-03-21 14:22:38 -0400569 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
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(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
576 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
577 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
578 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400579 case SkBlendMode::kSrcATop:
Brian Salomon54d212e2017-03-21 14:22:38 -0400580 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400581 TEST_ASSERT(!xpi.fIgnoresInputColor);
582 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700583 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
584 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
585 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
586 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
587 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
588 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
589 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400590 case SkBlendMode::kDstATop:
Brian Salomon54d212e2017-03-21 14:22:38 -0400591 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400592 TEST_ASSERT(!xpi.fIgnoresInputColor);
593 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700594 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
595 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
596 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
597 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
598 TEST_ASSERT(kSA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
599 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
600 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400601 case SkBlendMode::kXor:
Brian Salomon54d212e2017-03-21 14:22:38 -0400602 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400603 TEST_ASSERT(!xpi.fIgnoresInputColor);
604 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700605 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
606 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
607 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
608 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
609 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
610 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
611 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400612 case SkBlendMode::kPlus:
Brian Salomon54d212e2017-03-21 14:22:38 -0400613 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400614 TEST_ASSERT(!xpi.fIgnoresInputColor);
615 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700616 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
617 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
618 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
619 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
620 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
621 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
622 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400623 case SkBlendMode::kModulate:
Brian Salomon54d212e2017-03-21 14:22:38 -0400624 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
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(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
631 TEST_ASSERT(kSC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
632 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
633 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400634 case SkBlendMode::kScreen:
Brian Salomon54d212e2017-03-21 14:22:38 -0400635 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400636 TEST_ASSERT(!xpi.fIgnoresInputColor);
637 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700638 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
639 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
640 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
641 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
642 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
643 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
644 break;
645 default:
646 ERRORF(reporter, "Invalid xfermode.");
647 break;
648 }
649 }
650}
651
652static void test_color_opaque_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomona811b122017-03-30 08:21:32 -0400653 GrProcessorAnalysisColor inputColor = GrProcessorAnalysisColor::Opaque::kYes;
654 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kSingleChannel;
cdalton6fd158e2015-05-27 15:08:33 -0700655
Mike Reed7d954ad2016-10-28 15:42:34 -0400656 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
657 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon31853842017-03-28 16:32:05 -0400658 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
cdalton6fd158e2015-05-27 15:08:33 -0700659 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400660 case SkBlendMode::kClear:
Brian Salomon54d212e2017-03-21 14:22:38 -0400661 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400662 TEST_ASSERT(xpi.fIgnoresInputColor);
663 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700664 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
665 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
666 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
667 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
668 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
669 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
670 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400671 case SkBlendMode::kSrc:
Brian Salomon54d212e2017-03-21 14:22:38 -0400672 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400673 TEST_ASSERT(!xpi.fIgnoresInputColor);
674 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700675 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
676 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
677 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
678 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
679 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
680 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
681 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400682 case SkBlendMode::kDst:
Brian Salomon54d212e2017-03-21 14:22:38 -0400683 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400684 TEST_ASSERT(xpi.fIgnoresInputColor);
685 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700686 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
687 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
688 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
689 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
690 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
691 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
692 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400693 case SkBlendMode::kSrcOver:
Brian Salomon54d212e2017-03-21 14:22:38 -0400694 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
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(kModulate_OutputType == xpi.fPrimaryOutputType);
698 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
699 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
700 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
701 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
702 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
703 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400704 case SkBlendMode::kDstOver:
Brian Salomon54d212e2017-03-21 14:22:38 -0400705 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400706 TEST_ASSERT(!xpi.fIgnoresInputColor);
707 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700708 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
709 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
710 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
711 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
712 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
713 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
714 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400715 case SkBlendMode::kSrcIn:
Brian Salomon54d212e2017-03-21 14:22:38 -0400716 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400717 TEST_ASSERT(!xpi.fIgnoresInputColor);
718 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700719 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
720 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
721 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
722 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
723 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
724 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
725 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400726 case SkBlendMode::kDstIn:
Brian Salomon54d212e2017-03-21 14:22:38 -0400727 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400728 TEST_ASSERT(xpi.fIgnoresInputColor);
729 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700730 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
731 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
732 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
733 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
734 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
735 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
736 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400737 case SkBlendMode::kSrcOut:
Brian Salomon54d212e2017-03-21 14:22:38 -0400738 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400739 TEST_ASSERT(!xpi.fIgnoresInputColor);
740 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700741 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
742 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
743 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
744 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
745 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
746 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
747 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400748 case SkBlendMode::kDstOut:
Brian Salomon54d212e2017-03-21 14:22:38 -0400749 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400750 TEST_ASSERT(xpi.fIgnoresInputColor);
751 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700752 TEST_ASSERT(kCoverage_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::kSrcATop:
Brian Salomon54d212e2017-03-21 14:22:38 -0400760 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400761 TEST_ASSERT(!xpi.fIgnoresInputColor);
762 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700763 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
764 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
765 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
766 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
767 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
768 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
769 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400770 case SkBlendMode::kDstATop:
Brian Salomon54d212e2017-03-21 14:22:38 -0400771 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400772 TEST_ASSERT(!xpi.fIgnoresInputColor);
773 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700774 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
775 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
776 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
777 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
778 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
779 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
780 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400781 case SkBlendMode::kXor:
Brian Salomon54d212e2017-03-21 14:22:38 -0400782 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400783 TEST_ASSERT(!xpi.fIgnoresInputColor);
784 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700785 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
786 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
787 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
788 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
789 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
790 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
791 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400792 case SkBlendMode::kPlus:
Brian Salomon54d212e2017-03-21 14:22:38 -0400793 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400794 TEST_ASSERT(!xpi.fIgnoresInputColor);
795 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700796 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
797 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
798 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
799 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
800 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
801 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
802 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400803 case SkBlendMode::kModulate:
Brian Salomon54d212e2017-03-21 14:22:38 -0400804 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400805 TEST_ASSERT(!xpi.fIgnoresInputColor);
cdalton6fd158e2015-05-27 15:08:33 -0700806 TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType);
807 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
808 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
809 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
810 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
811 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
812 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400813 case SkBlendMode::kScreen:
Brian Salomon54d212e2017-03-21 14:22:38 -0400814 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400815 TEST_ASSERT(!xpi.fIgnoresInputColor);
816 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700817 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
818 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
819 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
820 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
821 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
822 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
823 break;
824 default:
825 ERRORF(reporter, "Invalid xfermode.");
826 break;
827 }
828 }
829}
830
831static void test_color_opaque_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomona811b122017-03-30 08:21:32 -0400832 GrProcessorAnalysisColor inputColor = GrProcessorAnalysisColor::Opaque::kYes;
833 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kNone;
cdalton6fd158e2015-05-27 15:08:33 -0700834
Mike Reed7d954ad2016-10-28 15:42:34 -0400835 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
836 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon31853842017-03-28 16:32:05 -0400837 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
cdalton6fd158e2015-05-27 15:08:33 -0700838
839 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400840 case SkBlendMode::kClear:
Brian Salomon54d212e2017-03-21 14:22:38 -0400841 TEST_ASSERT(xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400842 TEST_ASSERT(xpi.fIgnoresInputColor);
843 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700844 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
845 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
846 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
847 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
848 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
849 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
850 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400851 case SkBlendMode::kSrc:
Brian Salomon54d212e2017-03-21 14:22:38 -0400852 TEST_ASSERT(xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400853 TEST_ASSERT(!xpi.fIgnoresInputColor);
854 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700855 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
856 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
857 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
858 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
859 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
860 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
861 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400862 case SkBlendMode::kDst:
Brian Salomon54d212e2017-03-21 14:22:38 -0400863 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400864 TEST_ASSERT(xpi.fIgnoresInputColor);
865 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700866 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
867 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
868 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
869 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
870 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
871 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
872 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400873 case SkBlendMode::kSrcOver:
Brian Salomon28207df2017-06-05 12:25:13 -0400874 // We don't specialize opaque src-over. See note in GrPorterDuffXferProcessor.cpp
875 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400876 TEST_ASSERT(!xpi.fIgnoresInputColor);
Brian Salomon28207df2017-06-05 12:25:13 -0400877 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700878 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
879 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
880 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
881 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
Brian Salomon28207df2017-06-05 12:25:13 -0400882 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
cdalton6fd158e2015-05-27 15:08:33 -0700883 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
884 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400885 case SkBlendMode::kDstOver:
Brian Salomon54d212e2017-03-21 14:22:38 -0400886 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
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::kSrcIn:
Brian Salomon54d212e2017-03-21 14:22:38 -0400897 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400898 TEST_ASSERT(!xpi.fIgnoresInputColor);
899 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700900 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
901 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
902 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
903 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
904 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
905 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
906 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400907 case SkBlendMode::kDstIn:
Brian Salomon54d212e2017-03-21 14:22:38 -0400908 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400909 TEST_ASSERT(xpi.fIgnoresInputColor);
910 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700911 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
912 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
913 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
914 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
915 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
916 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
917 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400918 case SkBlendMode::kSrcOut:
Brian Salomon54d212e2017-03-21 14:22:38 -0400919 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400920 TEST_ASSERT(!xpi.fIgnoresInputColor);
921 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700922 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
923 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
924 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
925 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
926 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
927 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
928 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400929 case SkBlendMode::kDstOut:
Brian Salomon54d212e2017-03-21 14:22:38 -0400930 TEST_ASSERT(xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400931 TEST_ASSERT(xpi.fIgnoresInputColor);
932 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700933 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
934 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
935 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
936 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
937 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
938 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
939 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400940 case SkBlendMode::kSrcATop:
Brian Salomon54d212e2017-03-21 14:22:38 -0400941 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400942 TEST_ASSERT(!xpi.fIgnoresInputColor);
943 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700944 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
945 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
946 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
947 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
948 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
949 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
950 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400951 case SkBlendMode::kDstATop:
Brian Salomon54d212e2017-03-21 14:22:38 -0400952 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400953 TEST_ASSERT(!xpi.fIgnoresInputColor);
954 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700955 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
956 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
957 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
958 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
959 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
960 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
961 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400962 case SkBlendMode::kXor:
Brian Salomon54d212e2017-03-21 14:22:38 -0400963 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400964 TEST_ASSERT(!xpi.fIgnoresInputColor);
965 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700966 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
967 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
968 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
969 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
970 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
971 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
972 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400973 case SkBlendMode::kPlus:
Brian Salomon54d212e2017-03-21 14:22:38 -0400974 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400975 TEST_ASSERT(!xpi.fIgnoresInputColor);
976 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700977 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
978 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
979 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
980 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
981 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
982 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
983 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400984 case SkBlendMode::kModulate:
Brian Salomon54d212e2017-03-21 14:22:38 -0400985 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400986 TEST_ASSERT(!xpi.fIgnoresInputColor);
987 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700988 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
989 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
990 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
991 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
992 TEST_ASSERT(kSC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
993 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
994 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400995 case SkBlendMode::kScreen:
Brian Salomon54d212e2017-03-21 14:22:38 -0400996 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400997 TEST_ASSERT(!xpi.fIgnoresInputColor);
998 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700999 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
1000 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
1001 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
1002 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
1003 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
1004 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
1005 break;
1006 default:
1007 ERRORF(reporter, "Invalid xfermode.");
1008 break;
1009 }
1010 }
1011}
1012
egdaniel723b0502015-09-15 09:31:40 -07001013static void test_lcd_coverage_fallback_case(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomon31853842017-03-28 16:32:05 -04001014 const GrXPFactory* xpf = GrPorterDuffXPFactory::Get(SkBlendMode::kSrcOver);
Greg Daniel6ebe4b92017-05-19 10:56:46 -04001015 GrProcessorAnalysisColor color = GrColorPackRGBA(123, 45, 67, 255);
Brian Salomona811b122017-03-30 08:21:32 -04001016 GrProcessorAnalysisCoverage coverage = GrProcessorAnalysisCoverage::kLCD;
Brian Osman532b3f92018-07-11 10:02:07 -04001017 TEST_ASSERT(!(GrXPFactory::GetAnalysisProperties(xpf, color, coverage, caps) &
Greg Daniel6ebe4b92017-05-19 10:56:46 -04001018 GrXPFactory::AnalysisProperties::kRequiresDstTexture));
1019 sk_sp<const GrXferProcessor> xp_opaque(
Brian Osman532b3f92018-07-11 10:02:07 -04001020 GrXPFactory::MakeXferProcessor(xpf, color, coverage, false, caps));
Greg Daniel6ebe4b92017-05-19 10:56:46 -04001021 if (!xp_opaque) {
1022 ERRORF(reporter, "Failed to create an XP with LCD coverage.");
1023 return;
1024 }
1025
1026 GrXferProcessor::BlendInfo blendInfo;
1027 xp_opaque->getBlendInfo(&blendInfo);
1028 TEST_ASSERT(blendInfo.fWriteColor);
1029
1030 // Test with non-opaque alpha
1031 color = GrColorPackRGBA(123, 45, 67, 221);
1032 coverage = GrProcessorAnalysisCoverage::kLCD;
Brian Osman532b3f92018-07-11 10:02:07 -04001033 TEST_ASSERT(!(GrXPFactory::GetAnalysisProperties(xpf, color, coverage, caps) &
Greg Danield7b11592017-06-14 13:37:12 -04001034 GrXPFactory::AnalysisProperties::kRequiresDstTexture));
Brian Salomond61c9d92017-04-10 10:54:25 -04001035 sk_sp<const GrXferProcessor> xp(
Brian Osman532b3f92018-07-11 10:02:07 -04001036 GrXPFactory::MakeXferProcessor(xpf, color, coverage, false, caps));
cdalton6fd158e2015-05-27 15:08:33 -07001037 if (!xp) {
1038 ERRORF(reporter, "Failed to create an XP with LCD coverage.");
1039 return;
1040 }
1041
cdalton6fd158e2015-05-27 15:08:33 -07001042 xp->getBlendInfo(&blendInfo);
1043 TEST_ASSERT(blendInfo.fWriteColor);
1044}
1045
Brian Salomondcfca432017-11-15 15:48:03 -05001046DEF_GPUTEST(PorterDuffNoDualSourceBlending, reporter, options) {
1047 GrContextOptions opts = options;
cdalton6fd158e2015-05-27 15:08:33 -07001048 opts.fSuppressDualSourceBlending = true;
bsalomon3724e572016-03-30 18:56:19 -07001049 sk_gpu_test::GrContextFactory mockFactory(opts);
bsalomon85b4b532016-04-05 11:06:27 -07001050 GrContext* ctx = mockFactory.get(sk_gpu_test::GrContextFactory::kNullGL_ContextType);
cdalton6fd158e2015-05-27 15:08:33 -07001051 if (!ctx) {
Ben Wagnerb4aab9a2017-08-16 10:53:04 -04001052 SK_ABORT("Failed to create null context without ARB_blend_func_extended.");
cdalton6fd158e2015-05-27 15:08:33 -07001053 return;
1054 }
1055
Robert Phillipsf35fd8d2018-01-22 10:48:15 -05001056 GrGpu* gpu = ctx->contextPriv().getGpu();
Robert Phillips0bd24dc2018-01-16 08:06:32 -05001057 GrProxyProvider* proxyProvider = ctx->contextPriv().proxyProvider();
Brian Salomonc7fe0f72018-05-11 10:14:21 -04001058 const GrCaps& caps = *ctx->contextPriv().caps();
cdalton6fd158e2015-05-27 15:08:33 -07001059 if (caps.shaderCaps()->dualSourceBlendingSupport()) {
Ben Wagnerb4aab9a2017-08-16 10:53:04 -04001060 SK_ABORT("Null context failed to honor request for no ARB_blend_func_extended.");
cdalton6fd158e2015-05-27 15:08:33 -07001061 return;
1062 }
1063
Robert Phillipsd21b2a52017-12-12 13:01:25 -05001064 GrBackendTexture backendTex =
Robert Phillips646f6372018-09-25 09:31:10 -04001065 gpu->createTestingOnlyBackendTexture(nullptr, 100, 100, GrColorType::kRGBA_8888,
Robert Phillipsf35fd8d2018-01-22 10:48:15 -05001066 false, GrMipMapped::kNo);
Greg Daniel7ef28f32017-04-20 16:41:55 +00001067
Robert Phillipsbb581ce2017-05-29 15:05:15 -04001068 GrXferProcessor::DstProxy fakeDstProxy;
1069 {
Brian Salomon7578f3e2018-03-07 14:39:54 -05001070 sk_sp<GrTextureProxy> proxy =
1071 proxyProvider->wrapBackendTexture(backendTex, kTopLeft_GrSurfaceOrigin);
Robert Phillipsbb581ce2017-05-29 15:05:15 -04001072 fakeDstProxy.setProxy(std::move(proxy));
1073 }
cdalton6fd158e2015-05-27 15:08:33 -07001074
Brian Salomona811b122017-03-30 08:21:32 -04001075 static const GrProcessorAnalysisColor colorInputs[] = {
1076 GrProcessorAnalysisColor::Opaque::kNo, GrProcessorAnalysisColor::Opaque::kYes,
1077 GrProcessorAnalysisColor(GrColorPackRGBA(0, 82, 17, 100)),
1078 GrProcessorAnalysisColor(GrColorPackRGBA(0, 82, 17, 255))};
cdalton6fd158e2015-05-27 15:08:33 -07001079
Brian Salomonc6b71462017-02-14 11:33:01 -05001080 for (const auto& colorInput : colorInputs) {
Brian Salomona811b122017-03-30 08:21:32 -04001081 for (GrProcessorAnalysisCoverage coverageType :
1082 {GrProcessorAnalysisCoverage::kSingleChannel, GrProcessorAnalysisCoverage::kNone}) {
Mike Reed7d954ad2016-10-28 15:42:34 -04001083 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
1084 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomona1633922017-01-09 11:46:10 -05001085 const GrXPFactory* xpf = GrPorterDuffXPFactory::Get(xfermode);
Brian Salomond61c9d92017-04-10 10:54:25 -04001086 sk_sp<const GrXferProcessor> xp(
Brian Osman532b3f92018-07-11 10:02:07 -04001087 GrXPFactory::MakeXferProcessor(xpf, colorInput, coverageType, false, caps));
cdalton6fd158e2015-05-27 15:08:33 -07001088 if (!xp) {
1089 ERRORF(reporter, "Failed to create an XP without dual source blending.");
1090 return;
1091 }
1092 TEST_ASSERT(!xp->hasSecondaryOutput());
cdalton6fd158e2015-05-27 15:08:33 -07001093 }
1094 }
1095 }
Brian Salomon26102cb2018-03-09 09:33:19 -05001096 gpu->deleteTestingOnlyBackendTexture(backendTex);
cdalton6fd158e2015-05-27 15:08:33 -07001097}