blob: 78497d2b3194163055885ef900306070db371253 [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
10#if SK_SUPPORT_GPU
11
cdalton6fd158e2015-05-27 15:08:33 -070012#include "GrContextFactory.h"
13#include "GrContextOptions.h"
Greg Daniel7ef28f32017-04-20 16:41:55 +000014#include "GrContextPriv.h"
cdalton6fd158e2015-05-27 15:08:33 -070015#include "GrGpu.h"
16#include "GrResourceProvider.h"
Greg Daniel7ef28f32017-04-20 16:41:55 +000017#include "GrTest.h"
cdalton6fd158e2015-05-27 15:08:33 -070018#include "GrXferProcessor.h"
19#include "effects/GrPorterDuffXferProcessor.h"
20#include "gl/GrGLCaps.h"
Brian Salomon89527432016-12-16 09:52:16 -050021#include "ops/GrMeshDrawOp.h"
cdalton6fd158e2015-05-27 15:08:33 -070022
23////////////////////////////////////////////////////////////////////////////////
24
25static void test_color_unknown_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps);
Brian Salomon31853842017-03-28 16:32:05 -040026static void test_color_not_opaque_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps);
cdalton6fd158e2015-05-27 15:08:33 -070027static void test_color_opaque_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps);
28static void test_color_opaque_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps);
29static void test_lcd_coverage(skiatest::Reporter* reporter, const GrCaps& caps);
egdaniel723b0502015-09-15 09:31:40 -070030static void test_lcd_coverage_fallback_case(skiatest::Reporter* reporter, const GrCaps& caps);
cdalton6fd158e2015-05-27 15:08:33 -070031
bsalomon758586c2016-04-06 14:02:39 -070032DEF_GPUTEST_FOR_NULLGL_CONTEXT(GrPorterDuff, reporter, ctxInfo) {
bsalomon8b7451a2016-05-11 06:33:06 -070033 const GrCaps& caps = *ctxInfo.grContext()->getGpu()->caps();
cdalton6fd158e2015-05-27 15:08:33 -070034 if (!caps.shaderCaps()->dualSourceBlendingSupport()) {
35 SkFAIL("Null context does not support dual source blending.");
36 return;
37 }
38
39 test_color_unknown_with_coverage(reporter, caps);
Brian Salomon31853842017-03-28 16:32:05 -040040 test_color_not_opaque_no_coverage(reporter, caps);
cdalton6fd158e2015-05-27 15:08:33 -070041 test_color_opaque_with_coverage(reporter, caps);
42 test_color_opaque_no_coverage(reporter, caps);
43 test_lcd_coverage(reporter, caps);
egdaniel723b0502015-09-15 09:31:40 -070044 test_lcd_coverage_fallback_case(reporter, caps);
cdalton6fd158e2015-05-27 15:08:33 -070045}
46
47////////////////////////////////////////////////////////////////////////////////
48
49#define TEST_ASSERT(...) REPORTER_ASSERT(reporter, __VA_ARGS__)
50
51enum {
52 kNone_OutputType,
53 kCoverage_OutputType,
54 kModulate_OutputType,
egdaniel723b0502015-09-15 09:31:40 -070055 kSAModulate_OutputType,
cdalton6fd158e2015-05-27 15:08:33 -070056 kISAModulate_OutputType,
57 kISCModulate_OutputType
58};
Greg Daniel79cdf282017-05-22 15:56:22 -040059static const int kInvalid_OutputType = -1;
cdalton6fd158e2015-05-27 15:08:33 -070060
Brian Salomon48d1b4c2017-04-08 07:38:53 -040061static GrProcessorSet::Analysis do_analysis(const GrXPFactory* xpf,
62 const GrProcessorAnalysisColor& colorInput,
63 GrProcessorAnalysisCoverage coverageInput,
64 const GrCaps& caps) {
65 GrPaint paint;
66 paint.setXPFactory(xpf);
67 GrProcessorSet procs(std::move(paint));
68 GrColor overrideColor;
69 GrProcessorSet::Analysis analysis =
70 procs.finalize(colorInput, coverageInput, nullptr, false, caps, &overrideColor);
71 return analysis;
72}
73
cdalton6fd158e2015-05-27 15:08:33 -070074class GrPorterDuffTest {
75public:
76 struct XPInfo {
Mike Reed7d954ad2016-10-28 15:42:34 -040077 XPInfo(skiatest::Reporter* reporter, SkBlendMode xfermode, const GrCaps& caps,
Brian Salomona811b122017-03-30 08:21:32 -040078 GrProcessorAnalysisColor inputColor, GrProcessorAnalysisCoverage inputCoverage) {
Brian Salomona1633922017-01-09 11:46:10 -050079 const GrXPFactory* xpf = GrPorterDuffXPFactory::Get(xfermode);
Brian Salomon48d1b4c2017-04-08 07:38:53 -040080
Greg Daniel79cdf282017-05-22 15:56:22 -040081 bool isLCD = GrProcessorAnalysisCoverage::kLCD == inputCoverage;
82
Brian Salomon48d1b4c2017-04-08 07:38:53 -040083 GrProcessorSet::Analysis analysis = do_analysis(xpf, inputColor, inputCoverage, caps);
Brian Salomon31853842017-03-28 16:32:05 -040084 fCompatibleWithCoverageAsAlpha = analysis.isCompatibleWithCoverageAsAlpha();
85 fCanCombineOverlappedStencilAndCover = analysis.canCombineOverlappedStencilAndCover();
Brian Salomon48d1b4c2017-04-08 07:38:53 -040086 fIgnoresInputColor = analysis.inputColorIsIgnored();
Brian Salomond61c9d92017-04-10 10:54:25 -040087 sk_sp<const GrXferProcessor> xp(
Brian Salomona076d872017-04-04 15:17:03 -040088 GrXPFactory::MakeXferProcessor(xpf, inputColor, inputCoverage, false, caps));
Greg Daniel79cdf282017-05-22 15:56:22 -040089 TEST_ASSERT(!analysis.requiresDstTexture() ||
90 (isLCD &&
91 !caps.shaderCaps()->dstReadInShaderSupport() &&
92 (SkBlendMode::kSrcOver != xfermode ||
93 !inputColor.isOpaque())));
Hal Canary342b7ac2016-11-04 11:49:42 -040094 GetXPOutputTypes(xp.get(), &fPrimaryOutputType, &fSecondaryOutputType);
cdalton6fd158e2015-05-27 15:08:33 -070095 xp->getBlendInfo(&fBlendInfo);
Greg Daniel79cdf282017-05-22 15:56:22 -040096 TEST_ASSERT(!xp->willReadDstColor() ||
97 (isLCD && (SkBlendMode::kSrcOver != xfermode ||
98 !inputColor.isOpaque())));
cdalton6fd158e2015-05-27 15:08:33 -070099 TEST_ASSERT(xp->hasSecondaryOutput() == GrBlendCoeffRefsSrc2(fBlendInfo.fDstBlend));
100 }
101
Brian Salomon54d212e2017-03-21 14:22:38 -0400102 bool fCanCombineOverlappedStencilAndCover;
Brian Salomon31853842017-03-28 16:32:05 -0400103 bool fCompatibleWithCoverageAsAlpha;
104 bool fIgnoresInputColor;
cdalton6fd158e2015-05-27 15:08:33 -0700105 int fPrimaryOutputType;
106 int fSecondaryOutputType;
107 GrXferProcessor::BlendInfo fBlendInfo;
108 };
109
110 static void GetXPOutputTypes(const GrXferProcessor* xp, int* outPrimary, int* outSecondary) {
egdanielf2342722015-11-20 15:12:59 -0800111 GrPorterDuffXPFactory::TestGetXPOutputTypes(xp, outPrimary, outSecondary);
cdalton6fd158e2015-05-27 15:08:33 -0700112 }
113};
114
egdaniel723b0502015-09-15 09:31:40 -0700115static void test_lcd_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Greg Daniel6ebe4b92017-05-19 10:56:46 -0400116 GrProcessorAnalysisColor inputColor = GrProcessorAnalysisColor::Opaque::kYes;
Brian Salomona811b122017-03-30 08:21:32 -0400117 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kLCD;
egdaniel723b0502015-09-15 09:31:40 -0700118
Mike Reed7d954ad2016-10-28 15:42:34 -0400119 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
120 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon31853842017-03-28 16:32:05 -0400121 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
egdaniel723b0502015-09-15 09:31:40 -0700122 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400123 case SkBlendMode::kClear:
Brian Salomon54d212e2017-03-21 14:22:38 -0400124 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400125 TEST_ASSERT(xpi.fIgnoresInputColor);
126 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400127 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
128 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
129 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
130 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
131 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700132 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
133 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400134 case SkBlendMode::kSrc:
Brian Salomon54d212e2017-03-21 14:22:38 -0400135 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400136 TEST_ASSERT(!xpi.fIgnoresInputColor);
137 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400138 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
139 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700140 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
141 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
Greg Daniel79cdf282017-05-22 15:56:22 -0400142 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700143 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
144 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400145 case SkBlendMode::kDst:
Brian Salomon54d212e2017-03-21 14:22:38 -0400146 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400147 TEST_ASSERT(xpi.fIgnoresInputColor);
148 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400149 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
150 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700151 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400152 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
153 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
154 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
egdaniel723b0502015-09-15 09:31:40 -0700155 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400156 case SkBlendMode::kSrcOver:
Brian Salomon54d212e2017-03-21 14:22:38 -0400157 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400158 TEST_ASSERT(!xpi.fIgnoresInputColor);
159 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
egdaniel723b0502015-09-15 09:31:40 -0700160 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
161 TEST_ASSERT(kSAModulate_OutputType == xpi.fSecondaryOutputType);
162 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
163 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
164 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
165 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
166 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400167 case SkBlendMode::kDstOver:
Brian Salomon54d212e2017-03-21 14:22:38 -0400168 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400169 TEST_ASSERT(!xpi.fIgnoresInputColor);
170 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400171 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
172 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700173 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400174 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
175 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700176 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
177 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400178 case SkBlendMode::kSrcIn:
Brian Salomon54d212e2017-03-21 14:22:38 -0400179 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
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);
egdaniel723b0502015-09-15 09:31:40 -0700184 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400185 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::kDstIn:
Brian Salomon54d212e2017-03-21 14:22:38 -0400190 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400191 TEST_ASSERT(!xpi.fIgnoresInputColor);
192 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400193 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
194 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
195 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
196 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
197 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700198 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
199 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400200 case SkBlendMode::kSrcOut:
Brian Salomon54d212e2017-03-21 14:22:38 -0400201 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400202 TEST_ASSERT(!xpi.fIgnoresInputColor);
203 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400204 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
205 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700206 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400207 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
208 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700209 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
210 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400211 case SkBlendMode::kDstOut:
Brian Salomon54d212e2017-03-21 14:22:38 -0400212 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400213 TEST_ASSERT(!xpi.fIgnoresInputColor);
214 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400215 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
216 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700217 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400218 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
219 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700220 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
221 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400222 case SkBlendMode::kSrcATop:
Brian Salomon54d212e2017-03-21 14:22:38 -0400223 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400224 TEST_ASSERT(!xpi.fIgnoresInputColor);
225 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400226 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
227 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700228 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400229 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
230 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700231 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
232 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400233 case SkBlendMode::kDstATop:
Brian Salomon54d212e2017-03-21 14:22:38 -0400234 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400235 TEST_ASSERT(!xpi.fIgnoresInputColor);
236 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400237 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
238 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700239 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400240 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
241 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700242 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
243 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400244 case SkBlendMode::kXor:
Brian Salomon54d212e2017-03-21 14:22:38 -0400245 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400246 TEST_ASSERT(!xpi.fIgnoresInputColor);
247 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400248 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
249 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700250 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400251 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
252 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700253 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
254 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400255 case SkBlendMode::kPlus:
Brian Salomon54d212e2017-03-21 14:22:38 -0400256 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400257 TEST_ASSERT(!xpi.fIgnoresInputColor);
258 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400259 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
260 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700261 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
262 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
Greg Daniel79cdf282017-05-22 15:56:22 -0400263 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700264 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
265 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400266 case SkBlendMode::kModulate:
Brian Salomon54d212e2017-03-21 14:22:38 -0400267 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400268 TEST_ASSERT(!xpi.fIgnoresInputColor);
269 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400270 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
271 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
272 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
273 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
274 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700275 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
276 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400277 case SkBlendMode::kScreen:
Brian Salomon54d212e2017-03-21 14:22:38 -0400278 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400279 TEST_ASSERT(!xpi.fIgnoresInputColor);
280 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400281 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
282 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700283 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
284 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
Greg Daniel79cdf282017-05-22 15:56:22 -0400285 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700286 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
287 break;
288 default:
289 ERRORF(reporter, "Invalid xfermode.");
290 break;
291 }
292 }
293}
cdalton6fd158e2015-05-27 15:08:33 -0700294static void test_color_unknown_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomona811b122017-03-30 08:21:32 -0400295 GrProcessorAnalysisColor inputColor = GrProcessorAnalysisColor::Opaque::kNo;
296 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kSingleChannel;
cdalton6fd158e2015-05-27 15:08:33 -0700297
Mike Reed7d954ad2016-10-28 15:42:34 -0400298 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
299 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon31853842017-03-28 16:32:05 -0400300 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
cdalton6fd158e2015-05-27 15:08:33 -0700301 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400302 case SkBlendMode::kClear:
Brian Salomon54d212e2017-03-21 14:22:38 -0400303 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
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(kCoverage_OutputType == xpi.fPrimaryOutputType);
307 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
308 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
309 TEST_ASSERT(kDC_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::kSrc:
Brian Salomon54d212e2017-03-21 14:22:38 -0400314 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400315 TEST_ASSERT(!xpi.fIgnoresInputColor);
316 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700317 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
318 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
319 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
320 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
321 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
322 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
323 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400324 case SkBlendMode::kDst:
Brian Salomon54d212e2017-03-21 14:22:38 -0400325 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400326 TEST_ASSERT(xpi.fIgnoresInputColor);
327 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700328 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
329 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
330 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
331 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
332 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
333 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
334 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400335 case SkBlendMode::kSrcOver:
Brian Salomon54d212e2017-03-21 14:22:38 -0400336 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400337 TEST_ASSERT(!xpi.fIgnoresInputColor);
338 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700339 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
340 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
341 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
342 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
343 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
344 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
345 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400346 case SkBlendMode::kDstOver:
Brian Salomon54d212e2017-03-21 14:22:38 -0400347 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400348 TEST_ASSERT(!xpi.fIgnoresInputColor);
349 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700350 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
351 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
352 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
353 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
354 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
355 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
356 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400357 case SkBlendMode::kSrcIn:
Brian Salomon54d212e2017-03-21 14:22:38 -0400358 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400359 TEST_ASSERT(!xpi.fIgnoresInputColor);
360 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700361 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
362 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
363 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
364 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
365 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
366 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
367 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400368 case SkBlendMode::kDstIn:
Brian Salomon54d212e2017-03-21 14:22:38 -0400369 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400370 TEST_ASSERT(!xpi.fIgnoresInputColor);
371 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700372 TEST_ASSERT(kISAModulate_OutputType == xpi.fPrimaryOutputType);
373 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
374 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
375 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
376 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
377 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
378 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400379 case SkBlendMode::kSrcOut:
Brian Salomon54d212e2017-03-21 14:22:38 -0400380 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400381 TEST_ASSERT(!xpi.fIgnoresInputColor);
382 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700383 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
384 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
385 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
386 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
387 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
388 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
389 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400390 case SkBlendMode::kDstOut:
Brian Salomon54d212e2017-03-21 14:22:38 -0400391 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400392 TEST_ASSERT(!xpi.fIgnoresInputColor);
393 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700394 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
395 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
396 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
397 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
398 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
399 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
400 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400401 case SkBlendMode::kSrcATop:
Brian Salomon54d212e2017-03-21 14:22:38 -0400402 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400403 TEST_ASSERT(!xpi.fIgnoresInputColor);
404 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700405 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
406 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
407 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
408 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
409 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
410 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
411 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400412 case SkBlendMode::kDstATop:
Brian Salomon54d212e2017-03-21 14:22:38 -0400413 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
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(kModulate_OutputType == xpi.fPrimaryOutputType);
417 TEST_ASSERT(kISAModulate_OutputType == xpi.fSecondaryOutputType);
418 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
419 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
420 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
421 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
422 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400423 case SkBlendMode::kXor:
Brian Salomon54d212e2017-03-21 14:22:38 -0400424 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400425 TEST_ASSERT(!xpi.fIgnoresInputColor);
426 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700427 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
428 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
429 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
430 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
431 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
432 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
433 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400434 case SkBlendMode::kPlus:
Brian Salomon54d212e2017-03-21 14:22:38 -0400435 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400436 TEST_ASSERT(!xpi.fIgnoresInputColor);
437 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700438 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
439 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
440 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
441 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
442 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
443 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
444 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400445 case SkBlendMode::kModulate:
Brian Salomon54d212e2017-03-21 14:22:38 -0400446 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400447 TEST_ASSERT(!xpi.fIgnoresInputColor);
448 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700449 TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType);
450 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
451 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
452 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
453 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
454 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
455 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400456 case SkBlendMode::kScreen:
Brian Salomon54d212e2017-03-21 14:22:38 -0400457 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400458 TEST_ASSERT(!xpi.fIgnoresInputColor);
459 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700460 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
461 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
462 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
463 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
464 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
465 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
466 break;
467 default:
468 ERRORF(reporter, "Invalid xfermode.");
469 break;
470 }
471 }
472}
473
Brian Salomon31853842017-03-28 16:32:05 -0400474static void test_color_not_opaque_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomona811b122017-03-30 08:21:32 -0400475 GrProcessorAnalysisColor inputColor(GrColorPackRGBA(229, 0, 154, 240));
476 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kNone;
cdalton6fd158e2015-05-27 15:08:33 -0700477
Mike Reed7d954ad2016-10-28 15:42:34 -0400478 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
479 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon31853842017-03-28 16:32:05 -0400480 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
cdalton6fd158e2015-05-27 15:08:33 -0700481 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400482 case SkBlendMode::kClear:
Brian Salomon54d212e2017-03-21 14:22:38 -0400483 TEST_ASSERT(xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400484 TEST_ASSERT(xpi.fIgnoresInputColor);
485 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700486 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
487 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
488 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
489 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
490 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
491 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
492 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400493 case SkBlendMode::kSrc:
Brian Salomon54d212e2017-03-21 14:22:38 -0400494 TEST_ASSERT(xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400495 TEST_ASSERT(!xpi.fIgnoresInputColor);
496 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700497 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
498 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
499 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
500 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
501 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
502 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
503 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400504 case SkBlendMode::kDst:
Brian Salomon54d212e2017-03-21 14:22:38 -0400505 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400506 TEST_ASSERT(xpi.fIgnoresInputColor);
507 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700508 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
509 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
510 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
511 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
512 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
513 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
514 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400515 case SkBlendMode::kSrcOver:
Brian Salomon54d212e2017-03-21 14:22:38 -0400516 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400517 TEST_ASSERT(!xpi.fIgnoresInputColor);
518 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700519 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
520 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
521 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
522 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
523 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
524 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
525 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400526 case SkBlendMode::kDstOver:
Brian Salomon54d212e2017-03-21 14:22:38 -0400527 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400528 TEST_ASSERT(!xpi.fIgnoresInputColor);
529 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700530 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
531 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
532 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
533 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
534 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
535 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
536 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400537 case SkBlendMode::kSrcIn:
Brian Salomon54d212e2017-03-21 14:22:38 -0400538 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400539 TEST_ASSERT(!xpi.fIgnoresInputColor);
540 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700541 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
542 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
543 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
544 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
545 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
546 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
547 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400548 case SkBlendMode::kDstIn:
Brian Salomon54d212e2017-03-21 14:22:38 -0400549 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
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(kZero_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::kSrcOut:
Brian Salomon54d212e2017-03-21 14:22:38 -0400560 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400561 TEST_ASSERT(!xpi.fIgnoresInputColor);
562 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700563 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
564 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
565 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
566 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
567 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
568 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
569 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400570 case SkBlendMode::kDstOut:
Brian Salomon54d212e2017-03-21 14:22:38 -0400571 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400572 TEST_ASSERT(!xpi.fIgnoresInputColor);
573 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700574 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
575 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
576 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
577 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
578 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
579 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
580 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400581 case SkBlendMode::kSrcATop:
Brian Salomon54d212e2017-03-21 14:22:38 -0400582 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400583 TEST_ASSERT(!xpi.fIgnoresInputColor);
584 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700585 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
586 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
587 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
588 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
589 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
590 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
591 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400592 case SkBlendMode::kDstATop:
Brian Salomon54d212e2017-03-21 14:22:38 -0400593 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400594 TEST_ASSERT(!xpi.fIgnoresInputColor);
595 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700596 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
597 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
598 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
599 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
600 TEST_ASSERT(kSA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
601 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
602 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400603 case SkBlendMode::kXor:
Brian Salomon54d212e2017-03-21 14:22:38 -0400604 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400605 TEST_ASSERT(!xpi.fIgnoresInputColor);
606 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700607 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
608 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
609 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
610 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
611 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
612 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
613 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400614 case SkBlendMode::kPlus:
Brian Salomon54d212e2017-03-21 14:22:38 -0400615 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400616 TEST_ASSERT(!xpi.fIgnoresInputColor);
617 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700618 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
619 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
620 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
621 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
622 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
623 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
624 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400625 case SkBlendMode::kModulate:
Brian Salomon54d212e2017-03-21 14:22:38 -0400626 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400627 TEST_ASSERT(!xpi.fIgnoresInputColor);
628 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700629 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
630 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
631 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
632 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
633 TEST_ASSERT(kSC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
634 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
635 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400636 case SkBlendMode::kScreen:
Brian Salomon54d212e2017-03-21 14:22:38 -0400637 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400638 TEST_ASSERT(!xpi.fIgnoresInputColor);
639 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700640 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
641 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
642 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
643 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
644 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
645 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
646 break;
647 default:
648 ERRORF(reporter, "Invalid xfermode.");
649 break;
650 }
651 }
652}
653
654static void test_color_opaque_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomona811b122017-03-30 08:21:32 -0400655 GrProcessorAnalysisColor inputColor = GrProcessorAnalysisColor::Opaque::kYes;
656 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kSingleChannel;
cdalton6fd158e2015-05-27 15:08:33 -0700657
Mike Reed7d954ad2016-10-28 15:42:34 -0400658 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
659 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon31853842017-03-28 16:32:05 -0400660 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
cdalton6fd158e2015-05-27 15:08:33 -0700661 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400662 case SkBlendMode::kClear:
Brian Salomon54d212e2017-03-21 14:22:38 -0400663 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400664 TEST_ASSERT(xpi.fIgnoresInputColor);
665 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700666 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
667 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
668 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
669 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
670 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
671 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
672 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400673 case SkBlendMode::kSrc:
Brian Salomon54d212e2017-03-21 14:22:38 -0400674 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
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(kModulate_OutputType == xpi.fPrimaryOutputType);
678 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
679 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
680 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
681 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
682 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
683 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400684 case SkBlendMode::kDst:
Brian Salomon54d212e2017-03-21 14:22:38 -0400685 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400686 TEST_ASSERT(xpi.fIgnoresInputColor);
687 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700688 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
689 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
690 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
691 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
692 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
693 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
694 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400695 case SkBlendMode::kSrcOver:
Brian Salomon54d212e2017-03-21 14:22:38 -0400696 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400697 TEST_ASSERT(!xpi.fIgnoresInputColor);
698 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700699 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
700 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
701 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
702 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
703 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
704 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
705 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400706 case SkBlendMode::kDstOver:
Brian Salomon54d212e2017-03-21 14:22:38 -0400707 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400708 TEST_ASSERT(!xpi.fIgnoresInputColor);
709 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700710 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
711 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
712 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
713 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
714 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
715 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
716 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400717 case SkBlendMode::kSrcIn:
Brian Salomon54d212e2017-03-21 14:22:38 -0400718 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400719 TEST_ASSERT(!xpi.fIgnoresInputColor);
720 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700721 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
722 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
723 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
724 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
725 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
726 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
727 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400728 case SkBlendMode::kDstIn:
Brian Salomon54d212e2017-03-21 14:22:38 -0400729 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400730 TEST_ASSERT(xpi.fIgnoresInputColor);
731 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700732 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
733 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
734 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
735 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
736 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
737 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
738 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400739 case SkBlendMode::kSrcOut:
Brian Salomon54d212e2017-03-21 14:22:38 -0400740 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400741 TEST_ASSERT(!xpi.fIgnoresInputColor);
742 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700743 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
744 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
745 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
746 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
747 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
748 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
749 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400750 case SkBlendMode::kDstOut:
Brian Salomon54d212e2017-03-21 14:22:38 -0400751 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400752 TEST_ASSERT(xpi.fIgnoresInputColor);
753 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700754 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
755 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
756 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
757 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
758 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
759 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
760 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400761 case SkBlendMode::kSrcATop:
Brian Salomon54d212e2017-03-21 14:22:38 -0400762 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400763 TEST_ASSERT(!xpi.fIgnoresInputColor);
764 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700765 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
766 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
767 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
768 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
769 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
770 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
771 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400772 case SkBlendMode::kDstATop:
Brian Salomon54d212e2017-03-21 14:22:38 -0400773 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400774 TEST_ASSERT(!xpi.fIgnoresInputColor);
775 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700776 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
777 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
778 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
779 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
780 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
781 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
782 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400783 case SkBlendMode::kXor:
Brian Salomon54d212e2017-03-21 14:22:38 -0400784 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400785 TEST_ASSERT(!xpi.fIgnoresInputColor);
786 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700787 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
788 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
789 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
790 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
791 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
792 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
793 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400794 case SkBlendMode::kPlus:
Brian Salomon54d212e2017-03-21 14:22:38 -0400795 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400796 TEST_ASSERT(!xpi.fIgnoresInputColor);
797 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700798 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
799 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
800 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
801 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
802 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
803 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
804 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400805 case SkBlendMode::kModulate:
Brian Salomon54d212e2017-03-21 14:22:38 -0400806 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400807 TEST_ASSERT(!xpi.fIgnoresInputColor);
cdalton6fd158e2015-05-27 15:08:33 -0700808 TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType);
809 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
810 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
811 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
812 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
813 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
814 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400815 case SkBlendMode::kScreen:
Brian Salomon54d212e2017-03-21 14:22:38 -0400816 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400817 TEST_ASSERT(!xpi.fIgnoresInputColor);
818 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700819 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
820 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
821 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
822 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
823 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
824 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
825 break;
826 default:
827 ERRORF(reporter, "Invalid xfermode.");
828 break;
829 }
830 }
831}
832
833static void test_color_opaque_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomona811b122017-03-30 08:21:32 -0400834 GrProcessorAnalysisColor inputColor = GrProcessorAnalysisColor::Opaque::kYes;
835 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kNone;
cdalton6fd158e2015-05-27 15:08:33 -0700836
Mike Reed7d954ad2016-10-28 15:42:34 -0400837 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
838 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon31853842017-03-28 16:32:05 -0400839 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
cdalton6fd158e2015-05-27 15:08:33 -0700840
841 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400842 case SkBlendMode::kClear:
Brian Salomon54d212e2017-03-21 14:22:38 -0400843 TEST_ASSERT(xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400844 TEST_ASSERT(xpi.fIgnoresInputColor);
845 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700846 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
847 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
848 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
849 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
850 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
851 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
852 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400853 case SkBlendMode::kSrc:
Brian Salomon54d212e2017-03-21 14:22:38 -0400854 TEST_ASSERT(xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400855 TEST_ASSERT(!xpi.fIgnoresInputColor);
856 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700857 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
858 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
859 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
860 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
861 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
862 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
863 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400864 case SkBlendMode::kDst:
Brian Salomon54d212e2017-03-21 14:22:38 -0400865 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400866 TEST_ASSERT(xpi.fIgnoresInputColor);
867 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700868 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
869 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
870 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
871 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
872 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
873 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
874 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400875 case SkBlendMode::kSrcOver:
Brian Salomon28207df2017-06-05 12:25:13 -0400876 // We don't specialize opaque src-over. See note in GrPorterDuffXferProcessor.cpp
877 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400878 TEST_ASSERT(!xpi.fIgnoresInputColor);
Brian Salomon28207df2017-06-05 12:25:13 -0400879 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700880 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
881 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
882 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
883 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
Brian Salomon28207df2017-06-05 12:25:13 -0400884 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
cdalton6fd158e2015-05-27 15:08:33 -0700885 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
886 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400887 case SkBlendMode::kDstOver:
Brian Salomon54d212e2017-03-21 14:22:38 -0400888 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400889 TEST_ASSERT(!xpi.fIgnoresInputColor);
890 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700891 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
892 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
893 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
894 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
895 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
896 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
897 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400898 case SkBlendMode::kSrcIn:
Brian Salomon54d212e2017-03-21 14:22:38 -0400899 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400900 TEST_ASSERT(!xpi.fIgnoresInputColor);
901 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700902 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
903 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
904 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
905 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
906 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
907 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
908 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400909 case SkBlendMode::kDstIn:
Brian Salomon54d212e2017-03-21 14:22:38 -0400910 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
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(kNone_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(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
918 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
919 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400920 case SkBlendMode::kSrcOut:
Brian Salomon54d212e2017-03-21 14:22:38 -0400921 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400922 TEST_ASSERT(!xpi.fIgnoresInputColor);
923 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700924 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
925 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
926 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
927 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
928 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
929 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
930 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400931 case SkBlendMode::kDstOut:
Brian Salomon54d212e2017-03-21 14:22:38 -0400932 TEST_ASSERT(xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400933 TEST_ASSERT(xpi.fIgnoresInputColor);
934 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700935 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
936 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
937 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
938 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
939 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
940 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
941 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400942 case SkBlendMode::kSrcATop:
Brian Salomon54d212e2017-03-21 14:22:38 -0400943 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400944 TEST_ASSERT(!xpi.fIgnoresInputColor);
945 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700946 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
947 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
948 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
949 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
950 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
951 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
952 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400953 case SkBlendMode::kDstATop:
Brian Salomon54d212e2017-03-21 14:22:38 -0400954 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400955 TEST_ASSERT(!xpi.fIgnoresInputColor);
956 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700957 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
958 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
959 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
960 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
961 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
962 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
963 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400964 case SkBlendMode::kXor:
Brian Salomon54d212e2017-03-21 14:22:38 -0400965 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400966 TEST_ASSERT(!xpi.fIgnoresInputColor);
967 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700968 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
969 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
970 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
971 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
972 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
973 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
974 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400975 case SkBlendMode::kPlus:
Brian Salomon54d212e2017-03-21 14:22:38 -0400976 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400977 TEST_ASSERT(!xpi.fIgnoresInputColor);
978 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700979 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
980 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
981 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
982 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
983 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
984 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
985 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400986 case SkBlendMode::kModulate:
Brian Salomon54d212e2017-03-21 14:22:38 -0400987 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400988 TEST_ASSERT(!xpi.fIgnoresInputColor);
989 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700990 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
991 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
992 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
993 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
994 TEST_ASSERT(kSC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
995 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
996 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400997 case SkBlendMode::kScreen:
Brian Salomon54d212e2017-03-21 14:22:38 -0400998 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400999 TEST_ASSERT(!xpi.fIgnoresInputColor);
1000 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -07001001 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
1002 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
1003 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
1004 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
1005 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
1006 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
1007 break;
1008 default:
1009 ERRORF(reporter, "Invalid xfermode.");
1010 break;
1011 }
1012 }
1013}
1014
egdaniel723b0502015-09-15 09:31:40 -07001015static void test_lcd_coverage_fallback_case(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomon31853842017-03-28 16:32:05 -04001016 const GrXPFactory* xpf = GrPorterDuffXPFactory::Get(SkBlendMode::kSrcOver);
Greg Daniel6ebe4b92017-05-19 10:56:46 -04001017 GrProcessorAnalysisColor color = GrColorPackRGBA(123, 45, 67, 255);
Brian Salomona811b122017-03-30 08:21:32 -04001018 GrProcessorAnalysisCoverage coverage = GrProcessorAnalysisCoverage::kLCD;
Greg Daniel6ebe4b92017-05-19 10:56:46 -04001019 TEST_ASSERT(!(GrXPFactory::GetAnalysisProperties(xpf, color, coverage, caps) &
1020 GrXPFactory::AnalysisProperties::kRequiresDstTexture));
1021 sk_sp<const GrXferProcessor> xp_opaque(
1022 GrXPFactory::MakeXferProcessor(xpf, color, coverage, false, caps));
1023 if (!xp_opaque) {
1024 ERRORF(reporter, "Failed to create an XP with LCD coverage.");
1025 return;
1026 }
1027
1028 GrXferProcessor::BlendInfo blendInfo;
1029 xp_opaque->getBlendInfo(&blendInfo);
1030 TEST_ASSERT(blendInfo.fWriteColor);
1031
1032 // Test with non-opaque alpha
1033 color = GrColorPackRGBA(123, 45, 67, 221);
1034 coverage = GrProcessorAnalysisCoverage::kLCD;
1035 TEST_ASSERT(GrXPFactory::GetAnalysisProperties(xpf, color, coverage, caps) &
1036 GrXPFactory::AnalysisProperties::kRequiresDstTexture);
Brian Salomond61c9d92017-04-10 10:54:25 -04001037 sk_sp<const GrXferProcessor> xp(
1038 GrXPFactory::MakeXferProcessor(xpf, color, coverage, false, caps));
cdalton6fd158e2015-05-27 15:08:33 -07001039 if (!xp) {
1040 ERRORF(reporter, "Failed to create an XP with LCD coverage.");
1041 return;
1042 }
1043
cdalton6fd158e2015-05-27 15:08:33 -07001044 xp->getBlendInfo(&blendInfo);
1045 TEST_ASSERT(blendInfo.fWriteColor);
1046}
1047
kkinnunen15302832015-12-01 04:35:26 -08001048DEF_GPUTEST(PorterDuffNoDualSourceBlending, reporter, /*factory*/) {
cdalton6fd158e2015-05-27 15:08:33 -07001049 GrContextOptions opts;
1050 opts.fSuppressDualSourceBlending = true;
bsalomon3724e572016-03-30 18:56:19 -07001051 sk_gpu_test::GrContextFactory mockFactory(opts);
bsalomon85b4b532016-04-05 11:06:27 -07001052 GrContext* ctx = mockFactory.get(sk_gpu_test::GrContextFactory::kNullGL_ContextType);
cdalton6fd158e2015-05-27 15:08:33 -07001053 if (!ctx) {
1054 SkFAIL("Failed to create null context without ARB_blend_func_extended.");
1055 return;
1056 }
1057
bsalomon76228632015-05-29 08:02:10 -07001058 const GrCaps& caps = *ctx->caps();
cdalton6fd158e2015-05-27 15:08:33 -07001059 if (caps.shaderCaps()->dualSourceBlendingSupport()) {
1060 SkFAIL("Null context failed to honor request for no ARB_blend_func_extended.");
1061 return;
1062 }
1063
Greg Daniel7ef28f32017-04-20 16:41:55 +00001064 GrBackendObject backendTexHandle =
bungeman6bd52842016-10-27 09:30:08 -07001065 ctx->getGpu()->createTestingOnlyBackendTexture(nullptr, 100, 100, kRGBA_8888_GrPixelConfig);
Greg Daniel7ef28f32017-04-20 16:41:55 +00001066 GrBackendTexture backendTex = GrTest::CreateBackendTexture(ctx->contextPriv().getBackend(),
1067 100,
1068 100,
1069 kRGBA_8888_GrPixelConfig,
1070 backendTexHandle);
1071
Robert Phillipsbb581ce2017-05-29 15:05:15 -04001072 GrXferProcessor::DstProxy fakeDstProxy;
1073 {
1074 sk_sp<GrTextureProxy> proxy = GrSurfaceProxy::MakeWrappedBackend(ctx, backendTex,
1075 kTopLeft_GrSurfaceOrigin);
1076 fakeDstProxy.setProxy(std::move(proxy));
1077 }
cdalton6fd158e2015-05-27 15:08:33 -07001078
Brian Salomona811b122017-03-30 08:21:32 -04001079 static const GrProcessorAnalysisColor colorInputs[] = {
1080 GrProcessorAnalysisColor::Opaque::kNo, GrProcessorAnalysisColor::Opaque::kYes,
1081 GrProcessorAnalysisColor(GrColorPackRGBA(0, 82, 17, 100)),
1082 GrProcessorAnalysisColor(GrColorPackRGBA(0, 82, 17, 255))};
cdalton6fd158e2015-05-27 15:08:33 -07001083
Brian Salomonc6b71462017-02-14 11:33:01 -05001084 for (const auto& colorInput : colorInputs) {
Brian Salomona811b122017-03-30 08:21:32 -04001085 for (GrProcessorAnalysisCoverage coverageType :
1086 {GrProcessorAnalysisCoverage::kSingleChannel, GrProcessorAnalysisCoverage::kNone}) {
Mike Reed7d954ad2016-10-28 15:42:34 -04001087 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
1088 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomona1633922017-01-09 11:46:10 -05001089 const GrXPFactory* xpf = GrPorterDuffXPFactory::Get(xfermode);
Brian Salomond61c9d92017-04-10 10:54:25 -04001090 sk_sp<const GrXferProcessor> xp(
Brian Salomona076d872017-04-04 15:17:03 -04001091 GrXPFactory::MakeXferProcessor(xpf, colorInput, coverageType, false, caps));
cdalton6fd158e2015-05-27 15:08:33 -07001092 if (!xp) {
1093 ERRORF(reporter, "Failed to create an XP without dual source blending.");
1094 return;
1095 }
1096 TEST_ASSERT(!xp->hasSecondaryOutput());
cdalton6fd158e2015-05-27 15:08:33 -07001097 }
1098 }
1099 }
Greg Daniel7ef28f32017-04-20 16:41:55 +00001100 ctx->getGpu()->deleteTestingOnlyBackendTexture(backendTexHandle);
cdalton6fd158e2015-05-27 15:08:33 -07001101}
1102
1103#endif