blob: 7e938c77617d71fffad8f2e34f90fccdeb57d75d [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"
Robert Phillips0bd24dc2018-01-16 08:06:32 -050016#include "GrProxyProvider.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) {
Robert Phillipsf35fd8d2018-01-22 10:48:15 -050033 const GrCaps& caps = *ctxInfo.grContext()->contextPriv().getGpu()->caps();
cdalton6fd158e2015-05-27 15:08:33 -070034 if (!caps.shaderCaps()->dualSourceBlendingSupport()) {
Ben Wagnerb4aab9a2017-08-16 10:53:04 -040035 SK_ABORT("Null context does not support dual source blending.");
cdalton6fd158e2015-05-27 15:08:33 -070036 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 =
Brian Osman9a725dd2017-09-20 09:53:22 -040070 procs.finalize(colorInput, coverageInput, nullptr, false, caps,
71 GrPixelConfigIsClamped::kYes, &overrideColor);
Brian Salomon48d1b4c2017-04-08 07:38:53 -040072 return analysis;
73}
74
cdalton6fd158e2015-05-27 15:08:33 -070075class GrPorterDuffTest {
76public:
77 struct XPInfo {
Mike Reed7d954ad2016-10-28 15:42:34 -040078 XPInfo(skiatest::Reporter* reporter, SkBlendMode xfermode, const GrCaps& caps,
Brian Salomona811b122017-03-30 08:21:32 -040079 GrProcessorAnalysisColor inputColor, GrProcessorAnalysisCoverage inputCoverage) {
Brian Salomona1633922017-01-09 11:46:10 -050080 const GrXPFactory* xpf = GrPorterDuffXPFactory::Get(xfermode);
Brian Salomon48d1b4c2017-04-08 07:38:53 -040081
Greg Daniel79cdf282017-05-22 15:56:22 -040082 bool isLCD = GrProcessorAnalysisCoverage::kLCD == inputCoverage;
83
Brian Salomon48d1b4c2017-04-08 07:38:53 -040084 GrProcessorSet::Analysis analysis = do_analysis(xpf, inputColor, inputCoverage, caps);
Brian Salomon31853842017-03-28 16:32:05 -040085 fCompatibleWithCoverageAsAlpha = analysis.isCompatibleWithCoverageAsAlpha();
86 fCanCombineOverlappedStencilAndCover = analysis.canCombineOverlappedStencilAndCover();
Brian Salomon48d1b4c2017-04-08 07:38:53 -040087 fIgnoresInputColor = analysis.inputColorIsIgnored();
Brian Salomond61c9d92017-04-10 10:54:25 -040088 sk_sp<const GrXferProcessor> xp(
Brian Osman9a725dd2017-09-20 09:53:22 -040089 GrXPFactory::MakeXferProcessor(xpf, inputColor, inputCoverage, false, caps,
90 GrPixelConfigIsClamped::kYes));
Greg Daniel79cdf282017-05-22 15:56:22 -040091 TEST_ASSERT(!analysis.requiresDstTexture() ||
92 (isLCD &&
93 !caps.shaderCaps()->dstReadInShaderSupport() &&
94 (SkBlendMode::kSrcOver != xfermode ||
95 !inputColor.isOpaque())));
Hal Canary342b7ac2016-11-04 11:49:42 -040096 GetXPOutputTypes(xp.get(), &fPrimaryOutputType, &fSecondaryOutputType);
cdalton6fd158e2015-05-27 15:08:33 -070097 xp->getBlendInfo(&fBlendInfo);
Greg Daniel79cdf282017-05-22 15:56:22 -040098 TEST_ASSERT(!xp->willReadDstColor() ||
99 (isLCD && (SkBlendMode::kSrcOver != xfermode ||
100 !inputColor.isOpaque())));
cdalton6fd158e2015-05-27 15:08:33 -0700101 TEST_ASSERT(xp->hasSecondaryOutput() == GrBlendCoeffRefsSrc2(fBlendInfo.fDstBlend));
102 }
103
Brian Salomon54d212e2017-03-21 14:22:38 -0400104 bool fCanCombineOverlappedStencilAndCover;
Brian Salomon31853842017-03-28 16:32:05 -0400105 bool fCompatibleWithCoverageAsAlpha;
106 bool fIgnoresInputColor;
cdalton6fd158e2015-05-27 15:08:33 -0700107 int fPrimaryOutputType;
108 int fSecondaryOutputType;
109 GrXferProcessor::BlendInfo fBlendInfo;
110 };
111
112 static void GetXPOutputTypes(const GrXferProcessor* xp, int* outPrimary, int* outSecondary) {
egdanielf2342722015-11-20 15:12:59 -0800113 GrPorterDuffXPFactory::TestGetXPOutputTypes(xp, outPrimary, outSecondary);
cdalton6fd158e2015-05-27 15:08:33 -0700114 }
115};
116
egdaniel723b0502015-09-15 09:31:40 -0700117static void test_lcd_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Greg Daniel6ebe4b92017-05-19 10:56:46 -0400118 GrProcessorAnalysisColor inputColor = GrProcessorAnalysisColor::Opaque::kYes;
Brian Salomona811b122017-03-30 08:21:32 -0400119 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kLCD;
egdaniel723b0502015-09-15 09:31:40 -0700120
Mike Reed7d954ad2016-10-28 15:42:34 -0400121 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
122 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon31853842017-03-28 16:32:05 -0400123 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
egdaniel723b0502015-09-15 09:31:40 -0700124 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400125 case SkBlendMode::kClear:
Brian Salomon54d212e2017-03-21 14:22:38 -0400126 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400127 TEST_ASSERT(xpi.fIgnoresInputColor);
128 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400129 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
130 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
131 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
132 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
133 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700134 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
135 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400136 case SkBlendMode::kSrc:
Brian Salomon54d212e2017-03-21 14:22:38 -0400137 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400138 TEST_ASSERT(!xpi.fIgnoresInputColor);
139 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400140 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
141 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700142 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
143 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
Greg Daniel79cdf282017-05-22 15:56:22 -0400144 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700145 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
146 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400147 case SkBlendMode::kDst:
Brian Salomon54d212e2017-03-21 14:22:38 -0400148 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400149 TEST_ASSERT(xpi.fIgnoresInputColor);
150 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400151 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
152 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700153 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400154 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
155 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
156 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
egdaniel723b0502015-09-15 09:31:40 -0700157 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400158 case SkBlendMode::kSrcOver:
Brian Salomon54d212e2017-03-21 14:22:38 -0400159 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400160 TEST_ASSERT(!xpi.fIgnoresInputColor);
161 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
egdaniel723b0502015-09-15 09:31:40 -0700162 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
163 TEST_ASSERT(kSAModulate_OutputType == xpi.fSecondaryOutputType);
164 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
165 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
166 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
167 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
168 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400169 case SkBlendMode::kDstOver:
Brian Salomon54d212e2017-03-21 14:22:38 -0400170 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400171 TEST_ASSERT(!xpi.fIgnoresInputColor);
172 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400173 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
174 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700175 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400176 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
177 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700178 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
179 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400180 case SkBlendMode::kSrcIn:
Brian Salomon54d212e2017-03-21 14:22:38 -0400181 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400182 TEST_ASSERT(!xpi.fIgnoresInputColor);
183 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400184 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
185 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700186 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400187 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
188 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700189 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
190 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400191 case SkBlendMode::kDstIn:
Brian Salomon54d212e2017-03-21 14:22:38 -0400192 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400193 TEST_ASSERT(!xpi.fIgnoresInputColor);
194 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400195 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
196 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
197 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
198 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
199 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700200 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
201 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400202 case SkBlendMode::kSrcOut:
Brian Salomon54d212e2017-03-21 14:22:38 -0400203 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400204 TEST_ASSERT(!xpi.fIgnoresInputColor);
205 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400206 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
207 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700208 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400209 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
210 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700211 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
212 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400213 case SkBlendMode::kDstOut:
Brian Salomon54d212e2017-03-21 14:22:38 -0400214 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400215 TEST_ASSERT(!xpi.fIgnoresInputColor);
216 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400217 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
218 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700219 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400220 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
221 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700222 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
223 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400224 case SkBlendMode::kSrcATop:
Brian Salomon54d212e2017-03-21 14:22:38 -0400225 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400226 TEST_ASSERT(!xpi.fIgnoresInputColor);
227 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400228 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
229 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700230 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400231 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
232 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700233 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
234 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400235 case SkBlendMode::kDstATop:
Brian Salomon54d212e2017-03-21 14:22:38 -0400236 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400237 TEST_ASSERT(!xpi.fIgnoresInputColor);
238 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400239 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
240 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700241 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400242 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
243 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700244 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
245 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400246 case SkBlendMode::kXor:
Brian Salomon54d212e2017-03-21 14:22:38 -0400247 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400248 TEST_ASSERT(!xpi.fIgnoresInputColor);
249 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400250 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
251 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700252 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400253 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
254 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700255 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
256 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400257 case SkBlendMode::kPlus:
Brian Salomon54d212e2017-03-21 14:22:38 -0400258 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400259 TEST_ASSERT(!xpi.fIgnoresInputColor);
260 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400261 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
262 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700263 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
264 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
Greg Daniel79cdf282017-05-22 15:56:22 -0400265 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700266 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
267 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400268 case SkBlendMode::kModulate:
Brian Salomon54d212e2017-03-21 14:22:38 -0400269 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400270 TEST_ASSERT(!xpi.fIgnoresInputColor);
271 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400272 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
273 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
274 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
275 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
276 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700277 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
278 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400279 case SkBlendMode::kScreen:
Brian Salomon54d212e2017-03-21 14:22:38 -0400280 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400281 TEST_ASSERT(!xpi.fIgnoresInputColor);
282 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400283 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
284 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700285 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
286 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
Greg Daniel79cdf282017-05-22 15:56:22 -0400287 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700288 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
289 break;
290 default:
291 ERRORF(reporter, "Invalid xfermode.");
292 break;
293 }
294 }
295}
cdalton6fd158e2015-05-27 15:08:33 -0700296static void test_color_unknown_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomona811b122017-03-30 08:21:32 -0400297 GrProcessorAnalysisColor inputColor = GrProcessorAnalysisColor::Opaque::kNo;
298 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kSingleChannel;
cdalton6fd158e2015-05-27 15:08:33 -0700299
Mike Reed7d954ad2016-10-28 15:42:34 -0400300 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
301 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon31853842017-03-28 16:32:05 -0400302 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
cdalton6fd158e2015-05-27 15:08:33 -0700303 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400304 case SkBlendMode::kClear:
Brian Salomon54d212e2017-03-21 14:22:38 -0400305 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400306 TEST_ASSERT(xpi.fIgnoresInputColor);
307 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700308 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
309 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
310 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
311 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
312 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
313 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
314 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400315 case SkBlendMode::kSrc:
Brian Salomon54d212e2017-03-21 14:22:38 -0400316 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400317 TEST_ASSERT(!xpi.fIgnoresInputColor);
318 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700319 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
320 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
321 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
322 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
323 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
324 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
325 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400326 case SkBlendMode::kDst:
Brian Salomon54d212e2017-03-21 14:22:38 -0400327 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400328 TEST_ASSERT(xpi.fIgnoresInputColor);
329 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700330 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
331 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
332 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
333 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
334 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
335 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
336 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400337 case SkBlendMode::kSrcOver:
Brian Salomon54d212e2017-03-21 14:22:38 -0400338 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400339 TEST_ASSERT(!xpi.fIgnoresInputColor);
340 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700341 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
342 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
343 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
344 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
345 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
346 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
347 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400348 case SkBlendMode::kDstOver:
Brian Salomon54d212e2017-03-21 14:22:38 -0400349 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400350 TEST_ASSERT(!xpi.fIgnoresInputColor);
351 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700352 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
353 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
354 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
355 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
356 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
357 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
358 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400359 case SkBlendMode::kSrcIn:
Brian Salomon54d212e2017-03-21 14:22:38 -0400360 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400361 TEST_ASSERT(!xpi.fIgnoresInputColor);
362 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700363 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
364 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
365 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
366 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
367 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
368 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
369 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400370 case SkBlendMode::kDstIn:
Brian Salomon54d212e2017-03-21 14:22:38 -0400371 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400372 TEST_ASSERT(!xpi.fIgnoresInputColor);
373 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700374 TEST_ASSERT(kISAModulate_OutputType == xpi.fPrimaryOutputType);
375 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
376 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
377 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
378 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
379 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
380 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400381 case SkBlendMode::kSrcOut:
Brian Salomon54d212e2017-03-21 14:22:38 -0400382 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400383 TEST_ASSERT(!xpi.fIgnoresInputColor);
384 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700385 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
386 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
387 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
388 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
389 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
390 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
391 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400392 case SkBlendMode::kDstOut:
Brian Salomon54d212e2017-03-21 14:22:38 -0400393 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400394 TEST_ASSERT(!xpi.fIgnoresInputColor);
395 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700396 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
397 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
398 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
399 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
400 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
401 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
402 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400403 case SkBlendMode::kSrcATop:
Brian Salomon54d212e2017-03-21 14:22:38 -0400404 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400405 TEST_ASSERT(!xpi.fIgnoresInputColor);
406 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700407 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
408 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
409 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
410 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
411 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
412 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
413 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400414 case SkBlendMode::kDstATop:
Brian Salomon54d212e2017-03-21 14:22:38 -0400415 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400416 TEST_ASSERT(!xpi.fIgnoresInputColor);
417 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700418 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
419 TEST_ASSERT(kISAModulate_OutputType == xpi.fSecondaryOutputType);
420 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
421 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
422 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
423 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
424 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400425 case SkBlendMode::kXor:
Brian Salomon54d212e2017-03-21 14:22:38 -0400426 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400427 TEST_ASSERT(!xpi.fIgnoresInputColor);
428 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700429 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
430 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
431 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
432 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
433 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
434 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
435 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400436 case SkBlendMode::kPlus:
Brian Salomon54d212e2017-03-21 14:22:38 -0400437 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400438 TEST_ASSERT(!xpi.fIgnoresInputColor);
439 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700440 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
441 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
442 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
443 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
444 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
445 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
446 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400447 case SkBlendMode::kModulate:
Brian Salomon54d212e2017-03-21 14:22:38 -0400448 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400449 TEST_ASSERT(!xpi.fIgnoresInputColor);
450 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700451 TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType);
452 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
453 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
454 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
455 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
456 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
457 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400458 case SkBlendMode::kScreen:
Brian Salomon54d212e2017-03-21 14:22:38 -0400459 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400460 TEST_ASSERT(!xpi.fIgnoresInputColor);
461 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700462 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
463 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
464 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
465 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
466 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
467 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
468 break;
469 default:
470 ERRORF(reporter, "Invalid xfermode.");
471 break;
472 }
473 }
474}
475
Brian Salomon31853842017-03-28 16:32:05 -0400476static void test_color_not_opaque_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomona811b122017-03-30 08:21:32 -0400477 GrProcessorAnalysisColor inputColor(GrColorPackRGBA(229, 0, 154, 240));
478 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kNone;
cdalton6fd158e2015-05-27 15:08:33 -0700479
Mike Reed7d954ad2016-10-28 15:42:34 -0400480 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
481 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon31853842017-03-28 16:32:05 -0400482 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
cdalton6fd158e2015-05-27 15:08:33 -0700483 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400484 case SkBlendMode::kClear:
Brian Salomon54d212e2017-03-21 14:22:38 -0400485 TEST_ASSERT(xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400486 TEST_ASSERT(xpi.fIgnoresInputColor);
487 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700488 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
489 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
490 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
491 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
492 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
493 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
494 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400495 case SkBlendMode::kSrc:
Brian Salomon54d212e2017-03-21 14:22:38 -0400496 TEST_ASSERT(xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400497 TEST_ASSERT(!xpi.fIgnoresInputColor);
498 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700499 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
500 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
501 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
502 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
503 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
504 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
505 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400506 case SkBlendMode::kDst:
Brian Salomon54d212e2017-03-21 14:22:38 -0400507 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400508 TEST_ASSERT(xpi.fIgnoresInputColor);
509 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700510 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
511 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
512 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
513 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
514 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
515 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
516 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400517 case SkBlendMode::kSrcOver:
Brian Salomon54d212e2017-03-21 14:22:38 -0400518 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400519 TEST_ASSERT(!xpi.fIgnoresInputColor);
520 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700521 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
522 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
523 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
524 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
525 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
526 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
527 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400528 case SkBlendMode::kDstOver:
Brian Salomon54d212e2017-03-21 14:22:38 -0400529 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400530 TEST_ASSERT(!xpi.fIgnoresInputColor);
531 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700532 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
533 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
534 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
535 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
536 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
537 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
538 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400539 case SkBlendMode::kSrcIn:
Brian Salomon54d212e2017-03-21 14:22:38 -0400540 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400541 TEST_ASSERT(!xpi.fIgnoresInputColor);
542 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700543 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
544 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
545 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
546 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
547 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
548 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
549 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400550 case SkBlendMode::kDstIn:
Brian Salomon54d212e2017-03-21 14:22:38 -0400551 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400552 TEST_ASSERT(!xpi.fIgnoresInputColor);
553 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700554 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
555 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
556 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
557 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
558 TEST_ASSERT(kSA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
559 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
560 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400561 case SkBlendMode::kSrcOut:
Brian Salomon54d212e2017-03-21 14:22:38 -0400562 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400563 TEST_ASSERT(!xpi.fIgnoresInputColor);
564 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700565 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
566 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
567 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
568 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
569 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
570 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
571 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400572 case SkBlendMode::kDstOut:
Brian Salomon54d212e2017-03-21 14:22:38 -0400573 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400574 TEST_ASSERT(!xpi.fIgnoresInputColor);
575 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700576 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
577 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
578 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
579 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
580 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
581 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
582 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400583 case SkBlendMode::kSrcATop:
Brian Salomon54d212e2017-03-21 14:22:38 -0400584 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400585 TEST_ASSERT(!xpi.fIgnoresInputColor);
586 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700587 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
588 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
589 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
590 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
591 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
592 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
593 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400594 case SkBlendMode::kDstATop:
Brian Salomon54d212e2017-03-21 14:22:38 -0400595 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400596 TEST_ASSERT(!xpi.fIgnoresInputColor);
597 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700598 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
599 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
600 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
601 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
602 TEST_ASSERT(kSA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
603 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
604 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400605 case SkBlendMode::kXor:
Brian Salomon54d212e2017-03-21 14:22:38 -0400606 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400607 TEST_ASSERT(!xpi.fIgnoresInputColor);
608 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700609 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
610 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
611 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
612 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
613 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
614 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
615 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400616 case SkBlendMode::kPlus:
Brian Salomon54d212e2017-03-21 14:22:38 -0400617 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400618 TEST_ASSERT(!xpi.fIgnoresInputColor);
619 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700620 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
621 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
622 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
623 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
624 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
625 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
626 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400627 case SkBlendMode::kModulate:
Brian Salomon54d212e2017-03-21 14:22:38 -0400628 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400629 TEST_ASSERT(!xpi.fIgnoresInputColor);
630 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700631 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
632 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
633 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
634 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
635 TEST_ASSERT(kSC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
636 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
637 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400638 case SkBlendMode::kScreen:
Brian Salomon54d212e2017-03-21 14:22:38 -0400639 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400640 TEST_ASSERT(!xpi.fIgnoresInputColor);
641 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700642 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
643 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
644 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
645 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
646 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
647 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
648 break;
649 default:
650 ERRORF(reporter, "Invalid xfermode.");
651 break;
652 }
653 }
654}
655
656static void test_color_opaque_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomona811b122017-03-30 08:21:32 -0400657 GrProcessorAnalysisColor inputColor = GrProcessorAnalysisColor::Opaque::kYes;
658 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kSingleChannel;
cdalton6fd158e2015-05-27 15:08:33 -0700659
Mike Reed7d954ad2016-10-28 15:42:34 -0400660 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
661 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon31853842017-03-28 16:32:05 -0400662 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
cdalton6fd158e2015-05-27 15:08:33 -0700663 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400664 case SkBlendMode::kClear:
Brian Salomon54d212e2017-03-21 14:22:38 -0400665 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400666 TEST_ASSERT(xpi.fIgnoresInputColor);
667 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700668 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
669 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
670 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
671 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
672 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
673 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
674 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400675 case SkBlendMode::kSrc:
Brian Salomon54d212e2017-03-21 14:22:38 -0400676 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400677 TEST_ASSERT(!xpi.fIgnoresInputColor);
678 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700679 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
680 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
681 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
682 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
683 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
684 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
685 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400686 case SkBlendMode::kDst:
Brian Salomon54d212e2017-03-21 14:22:38 -0400687 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400688 TEST_ASSERT(xpi.fIgnoresInputColor);
689 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700690 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
691 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
692 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
693 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
694 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
695 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
696 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400697 case SkBlendMode::kSrcOver:
Brian Salomon54d212e2017-03-21 14:22:38 -0400698 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400699 TEST_ASSERT(!xpi.fIgnoresInputColor);
700 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700701 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
702 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
703 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
704 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
705 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
706 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
707 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400708 case SkBlendMode::kDstOver:
Brian Salomon54d212e2017-03-21 14:22:38 -0400709 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400710 TEST_ASSERT(!xpi.fIgnoresInputColor);
711 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700712 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
713 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
714 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
715 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
716 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
717 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
718 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400719 case SkBlendMode::kSrcIn:
Brian Salomon54d212e2017-03-21 14:22:38 -0400720 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400721 TEST_ASSERT(!xpi.fIgnoresInputColor);
722 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700723 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
724 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
725 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
726 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
727 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
728 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
729 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400730 case SkBlendMode::kDstIn:
Brian Salomon54d212e2017-03-21 14:22:38 -0400731 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400732 TEST_ASSERT(xpi.fIgnoresInputColor);
733 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700734 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
735 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
736 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
737 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
738 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
739 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
740 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400741 case SkBlendMode::kSrcOut:
Brian Salomon54d212e2017-03-21 14:22:38 -0400742 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400743 TEST_ASSERT(!xpi.fIgnoresInputColor);
744 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700745 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
746 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
747 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
748 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
749 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
750 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
751 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400752 case SkBlendMode::kDstOut:
Brian Salomon54d212e2017-03-21 14:22:38 -0400753 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400754 TEST_ASSERT(xpi.fIgnoresInputColor);
755 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700756 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
757 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
758 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
759 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
760 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
761 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
762 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400763 case SkBlendMode::kSrcATop:
Brian Salomon54d212e2017-03-21 14:22:38 -0400764 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400765 TEST_ASSERT(!xpi.fIgnoresInputColor);
766 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700767 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
768 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
769 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
770 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
771 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
772 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
773 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400774 case SkBlendMode::kDstATop:
Brian Salomon54d212e2017-03-21 14:22:38 -0400775 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400776 TEST_ASSERT(!xpi.fIgnoresInputColor);
777 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700778 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
779 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
780 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
781 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
782 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
783 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
784 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400785 case SkBlendMode::kXor:
Brian Salomon54d212e2017-03-21 14:22:38 -0400786 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400787 TEST_ASSERT(!xpi.fIgnoresInputColor);
788 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700789 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
790 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
791 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
792 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
793 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
794 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
795 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400796 case SkBlendMode::kPlus:
Brian Salomon54d212e2017-03-21 14:22:38 -0400797 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400798 TEST_ASSERT(!xpi.fIgnoresInputColor);
799 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700800 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
801 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
802 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
803 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
804 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
805 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
806 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400807 case SkBlendMode::kModulate:
Brian Salomon54d212e2017-03-21 14:22:38 -0400808 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400809 TEST_ASSERT(!xpi.fIgnoresInputColor);
cdalton6fd158e2015-05-27 15:08:33 -0700810 TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType);
811 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
812 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
813 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
814 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
815 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
816 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400817 case SkBlendMode::kScreen:
Brian Salomon54d212e2017-03-21 14:22:38 -0400818 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400819 TEST_ASSERT(!xpi.fIgnoresInputColor);
820 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700821 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
822 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
823 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
824 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
825 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
826 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
827 break;
828 default:
829 ERRORF(reporter, "Invalid xfermode.");
830 break;
831 }
832 }
833}
834
835static void test_color_opaque_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomona811b122017-03-30 08:21:32 -0400836 GrProcessorAnalysisColor inputColor = GrProcessorAnalysisColor::Opaque::kYes;
837 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kNone;
cdalton6fd158e2015-05-27 15:08:33 -0700838
Mike Reed7d954ad2016-10-28 15:42:34 -0400839 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
840 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon31853842017-03-28 16:32:05 -0400841 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
cdalton6fd158e2015-05-27 15:08:33 -0700842
843 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400844 case SkBlendMode::kClear:
Brian Salomon54d212e2017-03-21 14:22:38 -0400845 TEST_ASSERT(xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400846 TEST_ASSERT(xpi.fIgnoresInputColor);
847 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700848 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
849 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
850 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
851 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
852 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
853 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
854 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400855 case SkBlendMode::kSrc:
Brian Salomon54d212e2017-03-21 14:22:38 -0400856 TEST_ASSERT(xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400857 TEST_ASSERT(!xpi.fIgnoresInputColor);
858 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700859 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
860 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
861 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
862 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
863 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
864 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
865 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400866 case SkBlendMode::kDst:
Brian Salomon54d212e2017-03-21 14:22:38 -0400867 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400868 TEST_ASSERT(xpi.fIgnoresInputColor);
869 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700870 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
871 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
872 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
873 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
874 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
875 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
876 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400877 case SkBlendMode::kSrcOver:
Brian Salomon28207df2017-06-05 12:25:13 -0400878 // We don't specialize opaque src-over. See note in GrPorterDuffXferProcessor.cpp
879 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400880 TEST_ASSERT(!xpi.fIgnoresInputColor);
Brian Salomon28207df2017-06-05 12:25:13 -0400881 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700882 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
883 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
884 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
885 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
Brian Salomon28207df2017-06-05 12:25:13 -0400886 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
cdalton6fd158e2015-05-27 15:08:33 -0700887 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
888 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400889 case SkBlendMode::kDstOver:
Brian Salomon54d212e2017-03-21 14:22:38 -0400890 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400891 TEST_ASSERT(!xpi.fIgnoresInputColor);
892 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700893 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
894 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
895 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
896 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
897 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
898 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
899 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400900 case SkBlendMode::kSrcIn:
Brian Salomon54d212e2017-03-21 14:22:38 -0400901 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400902 TEST_ASSERT(!xpi.fIgnoresInputColor);
903 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700904 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
905 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
906 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
907 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
908 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
909 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
910 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400911 case SkBlendMode::kDstIn:
Brian Salomon54d212e2017-03-21 14:22:38 -0400912 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400913 TEST_ASSERT(xpi.fIgnoresInputColor);
914 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700915 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
916 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
917 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
918 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
919 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
920 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
921 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400922 case SkBlendMode::kSrcOut:
Brian Salomon54d212e2017-03-21 14:22:38 -0400923 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400924 TEST_ASSERT(!xpi.fIgnoresInputColor);
925 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700926 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
927 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
928 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
929 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
930 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
931 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
932 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400933 case SkBlendMode::kDstOut:
Brian Salomon54d212e2017-03-21 14:22:38 -0400934 TEST_ASSERT(xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400935 TEST_ASSERT(xpi.fIgnoresInputColor);
936 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700937 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
938 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
939 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
940 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
941 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
942 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
943 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400944 case SkBlendMode::kSrcATop:
Brian Salomon54d212e2017-03-21 14:22:38 -0400945 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400946 TEST_ASSERT(!xpi.fIgnoresInputColor);
947 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700948 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
949 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
950 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
951 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
952 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
953 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
954 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400955 case SkBlendMode::kDstATop:
Brian Salomon54d212e2017-03-21 14:22:38 -0400956 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400957 TEST_ASSERT(!xpi.fIgnoresInputColor);
958 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700959 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
960 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
961 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
962 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
963 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
964 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
965 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400966 case SkBlendMode::kXor:
Brian Salomon54d212e2017-03-21 14:22:38 -0400967 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400968 TEST_ASSERT(!xpi.fIgnoresInputColor);
969 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700970 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
971 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
972 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
973 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
974 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
975 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
976 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400977 case SkBlendMode::kPlus:
Brian Salomon54d212e2017-03-21 14:22:38 -0400978 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400979 TEST_ASSERT(!xpi.fIgnoresInputColor);
980 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700981 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
982 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
983 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
984 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
985 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
986 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
987 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400988 case SkBlendMode::kModulate:
Brian Salomon54d212e2017-03-21 14:22:38 -0400989 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400990 TEST_ASSERT(!xpi.fIgnoresInputColor);
991 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700992 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
993 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
994 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
995 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
996 TEST_ASSERT(kSC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
997 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
998 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400999 case SkBlendMode::kScreen:
Brian Salomon54d212e2017-03-21 14:22:38 -04001000 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -04001001 TEST_ASSERT(!xpi.fIgnoresInputColor);
1002 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -07001003 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
1004 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
1005 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
1006 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
1007 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
1008 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
1009 break;
1010 default:
1011 ERRORF(reporter, "Invalid xfermode.");
1012 break;
1013 }
1014 }
1015}
1016
egdaniel723b0502015-09-15 09:31:40 -07001017static void test_lcd_coverage_fallback_case(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomon31853842017-03-28 16:32:05 -04001018 const GrXPFactory* xpf = GrPorterDuffXPFactory::Get(SkBlendMode::kSrcOver);
Greg Daniel6ebe4b92017-05-19 10:56:46 -04001019 GrProcessorAnalysisColor color = GrColorPackRGBA(123, 45, 67, 255);
Brian Salomona811b122017-03-30 08:21:32 -04001020 GrProcessorAnalysisCoverage coverage = GrProcessorAnalysisCoverage::kLCD;
Brian Osman9a725dd2017-09-20 09:53:22 -04001021 TEST_ASSERT(!(GrXPFactory::GetAnalysisProperties(xpf, color, coverage, caps,
1022 GrPixelConfigIsClamped::kYes) &
Greg Daniel6ebe4b92017-05-19 10:56:46 -04001023 GrXPFactory::AnalysisProperties::kRequiresDstTexture));
1024 sk_sp<const GrXferProcessor> xp_opaque(
Brian Osman9a725dd2017-09-20 09:53:22 -04001025 GrXPFactory::MakeXferProcessor(xpf, color, coverage, false, caps,
1026 GrPixelConfigIsClamped::kYes));
Greg Daniel6ebe4b92017-05-19 10:56:46 -04001027 if (!xp_opaque) {
1028 ERRORF(reporter, "Failed to create an XP with LCD coverage.");
1029 return;
1030 }
1031
1032 GrXferProcessor::BlendInfo blendInfo;
1033 xp_opaque->getBlendInfo(&blendInfo);
1034 TEST_ASSERT(blendInfo.fWriteColor);
1035
1036 // Test with non-opaque alpha
1037 color = GrColorPackRGBA(123, 45, 67, 221);
1038 coverage = GrProcessorAnalysisCoverage::kLCD;
Brian Osman9a725dd2017-09-20 09:53:22 -04001039 TEST_ASSERT(!(GrXPFactory::GetAnalysisProperties(xpf, color, coverage, caps,
1040 GrPixelConfigIsClamped::kYes) &
Greg Danield7b11592017-06-14 13:37:12 -04001041 GrXPFactory::AnalysisProperties::kRequiresDstTexture));
Brian Salomond61c9d92017-04-10 10:54:25 -04001042 sk_sp<const GrXferProcessor> xp(
Brian Osman9a725dd2017-09-20 09:53:22 -04001043 GrXPFactory::MakeXferProcessor(xpf, color, coverage, false, caps,
1044 GrPixelConfigIsClamped::kYes));
cdalton6fd158e2015-05-27 15:08:33 -07001045 if (!xp) {
1046 ERRORF(reporter, "Failed to create an XP with LCD coverage.");
1047 return;
1048 }
1049
cdalton6fd158e2015-05-27 15:08:33 -07001050 xp->getBlendInfo(&blendInfo);
1051 TEST_ASSERT(blendInfo.fWriteColor);
1052}
1053
Brian Salomondcfca432017-11-15 15:48:03 -05001054DEF_GPUTEST(PorterDuffNoDualSourceBlending, reporter, options) {
1055 GrContextOptions opts = options;
cdalton6fd158e2015-05-27 15:08:33 -07001056 opts.fSuppressDualSourceBlending = true;
bsalomon3724e572016-03-30 18:56:19 -07001057 sk_gpu_test::GrContextFactory mockFactory(opts);
bsalomon85b4b532016-04-05 11:06:27 -07001058 GrContext* ctx = mockFactory.get(sk_gpu_test::GrContextFactory::kNullGL_ContextType);
cdalton6fd158e2015-05-27 15:08:33 -07001059 if (!ctx) {
Ben Wagnerb4aab9a2017-08-16 10:53:04 -04001060 SK_ABORT("Failed to create null context without ARB_blend_func_extended.");
cdalton6fd158e2015-05-27 15:08:33 -07001061 return;
1062 }
1063
Robert Phillipsf35fd8d2018-01-22 10:48:15 -05001064 GrGpu* gpu = ctx->contextPriv().getGpu();
Robert Phillips0bd24dc2018-01-16 08:06:32 -05001065 GrProxyProvider* proxyProvider = ctx->contextPriv().proxyProvider();
bsalomon76228632015-05-29 08:02:10 -07001066 const GrCaps& caps = *ctx->caps();
cdalton6fd158e2015-05-27 15:08:33 -07001067 if (caps.shaderCaps()->dualSourceBlendingSupport()) {
Ben Wagnerb4aab9a2017-08-16 10:53:04 -04001068 SK_ABORT("Null context failed to honor request for no ARB_blend_func_extended.");
cdalton6fd158e2015-05-27 15:08:33 -07001069 return;
1070 }
1071
Robert Phillipsd21b2a52017-12-12 13:01:25 -05001072 GrBackendTexture backendTex =
Robert Phillipsf35fd8d2018-01-22 10:48:15 -05001073 gpu->createTestingOnlyBackendTexture(nullptr, 100, 100, kRGBA_8888_GrPixelConfig,
1074 false, GrMipMapped::kNo);
Greg Daniel7ef28f32017-04-20 16:41:55 +00001075
Robert Phillipsbb581ce2017-05-29 15:05:15 -04001076 GrXferProcessor::DstProxy fakeDstProxy;
1077 {
Robert Phillips0bd24dc2018-01-16 08:06:32 -05001078 sk_sp<GrTextureProxy> proxy = proxyProvider->createWrappedTextureProxy(
1079 backendTex, kTopLeft_GrSurfaceOrigin);
Robert Phillipsbb581ce2017-05-29 15:05:15 -04001080 fakeDstProxy.setProxy(std::move(proxy));
1081 }
cdalton6fd158e2015-05-27 15:08:33 -07001082
Brian Salomona811b122017-03-30 08:21:32 -04001083 static const GrProcessorAnalysisColor colorInputs[] = {
1084 GrProcessorAnalysisColor::Opaque::kNo, GrProcessorAnalysisColor::Opaque::kYes,
1085 GrProcessorAnalysisColor(GrColorPackRGBA(0, 82, 17, 100)),
1086 GrProcessorAnalysisColor(GrColorPackRGBA(0, 82, 17, 255))};
cdalton6fd158e2015-05-27 15:08:33 -07001087
Brian Salomonc6b71462017-02-14 11:33:01 -05001088 for (const auto& colorInput : colorInputs) {
Brian Salomona811b122017-03-30 08:21:32 -04001089 for (GrProcessorAnalysisCoverage coverageType :
1090 {GrProcessorAnalysisCoverage::kSingleChannel, GrProcessorAnalysisCoverage::kNone}) {
Mike Reed7d954ad2016-10-28 15:42:34 -04001091 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
1092 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomona1633922017-01-09 11:46:10 -05001093 const GrXPFactory* xpf = GrPorterDuffXPFactory::Get(xfermode);
Brian Salomond61c9d92017-04-10 10:54:25 -04001094 sk_sp<const GrXferProcessor> xp(
Brian Osman9a725dd2017-09-20 09:53:22 -04001095 GrXPFactory::MakeXferProcessor(xpf, colorInput, coverageType, false, caps,
1096 GrPixelConfigIsClamped::kYes));
cdalton6fd158e2015-05-27 15:08:33 -07001097 if (!xp) {
1098 ERRORF(reporter, "Failed to create an XP without dual source blending.");
1099 return;
1100 }
1101 TEST_ASSERT(!xp->hasSecondaryOutput());
cdalton6fd158e2015-05-27 15:08:33 -07001102 }
1103 }
1104 }
Robert Phillipsf35fd8d2018-01-22 10:48:15 -05001105 gpu->deleteTestingOnlyBackendTexture(&backendTex);
cdalton6fd158e2015-05-27 15:08:33 -07001106}
1107
1108#endif