blob: 693481ae91eb98f69b67cc997d5967593709d178 [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"
14#include "GrGpu.h"
15#include "GrResourceProvider.h"
16#include "GrXferProcessor.h"
17#include "effects/GrPorterDuffXferProcessor.h"
18#include "gl/GrGLCaps.h"
Brian Salomon89527432016-12-16 09:52:16 -050019#include "ops/GrMeshDrawOp.h"
cdalton6fd158e2015-05-27 15:08:33 -070020
21////////////////////////////////////////////////////////////////////////////////
22
23static void test_color_unknown_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps);
24static void test_color_unknown_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps);
25static void test_color_opaque_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps);
26static void test_color_opaque_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps);
27static void test_lcd_coverage(skiatest::Reporter* reporter, const GrCaps& caps);
egdaniel723b0502015-09-15 09:31:40 -070028static void test_lcd_coverage_fallback_case(skiatest::Reporter* reporter, const GrCaps& caps);
cdalton6fd158e2015-05-27 15:08:33 -070029
bsalomon758586c2016-04-06 14:02:39 -070030DEF_GPUTEST_FOR_NULLGL_CONTEXT(GrPorterDuff, reporter, ctxInfo) {
bsalomon8b7451a2016-05-11 06:33:06 -070031 const GrCaps& caps = *ctxInfo.grContext()->getGpu()->caps();
cdalton6fd158e2015-05-27 15:08:33 -070032 if (!caps.shaderCaps()->dualSourceBlendingSupport()) {
33 SkFAIL("Null context does not support dual source blending.");
34 return;
35 }
36
37 test_color_unknown_with_coverage(reporter, caps);
38 test_color_unknown_no_coverage(reporter, caps);
39 test_color_opaque_with_coverage(reporter, caps);
40 test_color_opaque_no_coverage(reporter, caps);
41 test_lcd_coverage(reporter, caps);
egdaniel723b0502015-09-15 09:31:40 -070042 test_lcd_coverage_fallback_case(reporter, caps);
cdalton6fd158e2015-05-27 15:08:33 -070043}
44
45////////////////////////////////////////////////////////////////////////////////
46
47#define TEST_ASSERT(...) REPORTER_ASSERT(reporter, __VA_ARGS__)
48
49enum {
50 kNone_OutputType,
51 kCoverage_OutputType,
52 kModulate_OutputType,
egdaniel723b0502015-09-15 09:31:40 -070053 kSAModulate_OutputType,
cdalton6fd158e2015-05-27 15:08:33 -070054 kISAModulate_OutputType,
55 kISCModulate_OutputType
56};
57
58enum {
bsalomon7765a472015-07-08 11:26:37 -070059 kNone_OptFlags = GrXferProcessor::kNone_OptFlags,
cdalton6fd158e2015-05-27 15:08:33 -070060 kSkipDraw_OptFlag = GrXferProcessor::kSkipDraw_OptFlag,
61 kIgnoreColor_OptFlag = GrXferProcessor::kIgnoreColor_OptFlag,
cdalton6fd158e2015-05-27 15:08:33 -070062 kCanTweakAlphaForCoverage_OptFlag = GrXferProcessor::kCanTweakAlphaForCoverage_OptFlag
63};
64
65class GrPorterDuffTest {
66public:
67 struct XPInfo {
Mike Reed7d954ad2016-10-28 15:42:34 -040068 XPInfo(skiatest::Reporter* reporter, SkBlendMode xfermode, const GrCaps& caps,
Brian Salomon92aee3d2016-12-21 09:20:25 -050069 const GrPipelineAnalysis& analysis) {
Brian Salomona1633922017-01-09 11:46:10 -050070 const GrXPFactory* xpf = GrPorterDuffXPFactory::Get(xfermode);
Brian Salomon9a514982017-02-14 10:28:22 -050071 fReadsDst = GrXPFactory::WillReadDst(xpf, analysis.fColorPOI, analysis.fCoveragePOI);
72 fHasConstantPreCoverageBlendedColor = GrXPFactory::IsPreCoverageBlendedColorConstant(
73 xpf, analysis.fColorPOI, &fPreCoverageBlendedColor);
Brian Salomon92aee3d2016-12-21 09:20:25 -050074 sk_sp<GrXferProcessor> xp(xpf->createXferProcessor(analysis, false, nullptr, caps));
75 TEST_ASSERT(!xpf->willNeedDstTexture(caps, analysis));
Brian Salomonbfd51832017-01-04 13:22:08 -050076 GrColor ignoredOverrideColor;
77 fOptFlags = xp->getOptimizations(analysis, false, &ignoredOverrideColor, caps);
Hal Canary342b7ac2016-11-04 11:49:42 -040078 GetXPOutputTypes(xp.get(), &fPrimaryOutputType, &fSecondaryOutputType);
cdalton6fd158e2015-05-27 15:08:33 -070079 xp->getBlendInfo(&fBlendInfo);
80 TEST_ASSERT(!xp->willReadDstColor());
81 TEST_ASSERT(xp->hasSecondaryOutput() == GrBlendCoeffRefsSrc2(fBlendInfo.fDstBlend));
82 }
83
Brian Salomon9a514982017-02-14 10:28:22 -050084 bool fReadsDst;
85 bool fHasConstantPreCoverageBlendedColor;
86 GrColor fPreCoverageBlendedColor;
cdalton6fd158e2015-05-27 15:08:33 -070087 int fOptFlags;
88 int fPrimaryOutputType;
89 int fSecondaryOutputType;
90 GrXferProcessor::BlendInfo fBlendInfo;
91 };
92
93 static void GetXPOutputTypes(const GrXferProcessor* xp, int* outPrimary, int* outSecondary) {
egdanielf2342722015-11-20 15:12:59 -080094 GrPorterDuffXPFactory::TestGetXPOutputTypes(xp, outPrimary, outSecondary);
cdalton6fd158e2015-05-27 15:08:33 -070095 }
96};
97
egdaniel723b0502015-09-15 09:31:40 -070098static void test_lcd_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomon92aee3d2016-12-21 09:20:25 -050099 GrPipelineAnalysis analysis;
Brian Salomonaab259e2017-01-17 10:44:34 -0500100 // Setting the last argument to true will force covPOI to LCD coverage.
Brian Salomonc6b71462017-02-14 11:33:01 -0500101 analysis.fCoveragePOI.resetToLCDCoverage();
egdaniel723b0502015-09-15 09:31:40 -0700102
Brian Salomon92aee3d2016-12-21 09:20:25 -0500103 SkASSERT(!analysis.fColorPOI.isOpaque());
104 SkASSERT(!analysis.fColorPOI.isSolidWhite());
105 SkASSERT(!analysis.fCoveragePOI.isSolidWhite());
Brian Salomonaab259e2017-01-17 10:44:34 -0500106 SkASSERT(analysis.fCoveragePOI.isLCDCoverage());
egdaniel723b0502015-09-15 09:31:40 -0700107
Mike Reed7d954ad2016-10-28 15:42:34 -0400108 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
109 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon92aee3d2016-12-21 09:20:25 -0500110 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, analysis);
egdaniel723b0502015-09-15 09:31:40 -0700111 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400112 case SkBlendMode::kClear:
Brian Salomon9a514982017-02-14 10:28:22 -0500113 TEST_ASSERT(xpi.fReadsDst);
114 TEST_ASSERT(xpi.fHasConstantPreCoverageBlendedColor);
115 TEST_ASSERT(GrColor_TRANSPARENT_BLACK == xpi.fPreCoverageBlendedColor);
egdaniel723b0502015-09-15 09:31:40 -0700116 TEST_ASSERT((kIgnoreColor_OptFlag) == xpi.fOptFlags);
117 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
118 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
119 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
120 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
121 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
122 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
123 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400124 case SkBlendMode::kSrc:
Brian Salomon9a514982017-02-14 10:28:22 -0500125 TEST_ASSERT(xpi.fReadsDst);
126 TEST_ASSERT(!xpi.fHasConstantPreCoverageBlendedColor);
egdaniel723b0502015-09-15 09:31:40 -0700127 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
128 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
129 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
130 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
131 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
132 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
133 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
134 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400135 case SkBlendMode::kDst:
Brian Salomon9a514982017-02-14 10:28:22 -0500136 TEST_ASSERT(xpi.fReadsDst);
137 TEST_ASSERT(!xpi.fHasConstantPreCoverageBlendedColor);
egdaniel723b0502015-09-15 09:31:40 -0700138 TEST_ASSERT((kSkipDraw_OptFlag |
139 kIgnoreColor_OptFlag |
egdaniel723b0502015-09-15 09:31:40 -0700140 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
141 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
142 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
143 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
144 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
145 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
146 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
147 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400148 case SkBlendMode::kSrcOver:
Brian Salomon9a514982017-02-14 10:28:22 -0500149 TEST_ASSERT(xpi.fReadsDst);
150 TEST_ASSERT(!xpi.fHasConstantPreCoverageBlendedColor);
egdaniel723b0502015-09-15 09:31:40 -0700151 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
152 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
153 TEST_ASSERT(kSAModulate_OutputType == xpi.fSecondaryOutputType);
154 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
155 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
156 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
157 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
158 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400159 case SkBlendMode::kDstOver:
Brian Salomon9a514982017-02-14 10:28:22 -0500160 TEST_ASSERT(xpi.fReadsDst);
161 TEST_ASSERT(!xpi.fHasConstantPreCoverageBlendedColor);
egdaniel723b0502015-09-15 09:31:40 -0700162 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
163 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
164 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
165 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
166 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
167 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
168 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
169 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400170 case SkBlendMode::kSrcIn:
Brian Salomon9a514982017-02-14 10:28:22 -0500171 TEST_ASSERT(xpi.fReadsDst);
172 TEST_ASSERT(!xpi.fHasConstantPreCoverageBlendedColor);
egdaniel723b0502015-09-15 09:31:40 -0700173 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
174 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
175 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
176 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
177 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
178 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
179 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
180 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400181 case SkBlendMode::kDstIn:
Brian Salomon9a514982017-02-14 10:28:22 -0500182 TEST_ASSERT(xpi.fReadsDst);
183 TEST_ASSERT(!xpi.fHasConstantPreCoverageBlendedColor);
egdaniel723b0502015-09-15 09:31:40 -0700184 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
185 TEST_ASSERT(kISAModulate_OutputType == xpi.fPrimaryOutputType);
186 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
187 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
188 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
189 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
190 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
191 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400192 case SkBlendMode::kSrcOut:
Brian Salomon9a514982017-02-14 10:28:22 -0500193 TEST_ASSERT(xpi.fReadsDst);
194 TEST_ASSERT(!xpi.fHasConstantPreCoverageBlendedColor);
egdaniel723b0502015-09-15 09:31:40 -0700195 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
196 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
197 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
198 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
199 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
200 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
201 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
202 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400203 case SkBlendMode::kDstOut:
Brian Salomon9a514982017-02-14 10:28:22 -0500204 TEST_ASSERT(xpi.fReadsDst);
205 TEST_ASSERT(!xpi.fHasConstantPreCoverageBlendedColor);
egdaniel723b0502015-09-15 09:31:40 -0700206 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
207 TEST_ASSERT(kSAModulate_OutputType == xpi.fPrimaryOutputType);
208 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
209 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
210 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
211 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
212 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
213 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400214 case SkBlendMode::kSrcATop:
Brian Salomon9a514982017-02-14 10:28:22 -0500215 TEST_ASSERT(xpi.fReadsDst);
216 TEST_ASSERT(!xpi.fHasConstantPreCoverageBlendedColor);
egdaniel723b0502015-09-15 09:31:40 -0700217 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
218 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
219 TEST_ASSERT(kSAModulate_OutputType == xpi.fSecondaryOutputType);
220 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
221 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
222 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
223 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
224 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400225 case SkBlendMode::kDstATop:
Brian Salomon9a514982017-02-14 10:28:22 -0500226 TEST_ASSERT(xpi.fReadsDst);
227 TEST_ASSERT(!xpi.fHasConstantPreCoverageBlendedColor);
egdaniel723b0502015-09-15 09:31:40 -0700228 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
229 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
230 TEST_ASSERT(kISAModulate_OutputType == xpi.fSecondaryOutputType);
231 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
232 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
233 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
234 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
235 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400236 case SkBlendMode::kXor:
Brian Salomon9a514982017-02-14 10:28:22 -0500237 TEST_ASSERT(xpi.fReadsDst);
238 TEST_ASSERT(!xpi.fHasConstantPreCoverageBlendedColor);
egdaniel723b0502015-09-15 09:31:40 -0700239 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
240 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
241 TEST_ASSERT(kSAModulate_OutputType == xpi.fSecondaryOutputType);
242 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
243 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
244 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
245 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
246 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400247 case SkBlendMode::kPlus:
Brian Salomon9a514982017-02-14 10:28:22 -0500248 TEST_ASSERT(xpi.fReadsDst);
249 TEST_ASSERT(!xpi.fHasConstantPreCoverageBlendedColor);
egdaniel723b0502015-09-15 09:31:40 -0700250 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
251 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
252 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
253 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
254 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
255 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
256 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
257 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400258 case SkBlendMode::kModulate:
Brian Salomon9a514982017-02-14 10:28:22 -0500259 TEST_ASSERT(xpi.fReadsDst);
260 TEST_ASSERT(!xpi.fHasConstantPreCoverageBlendedColor);
egdaniel723b0502015-09-15 09:31:40 -0700261 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
262 TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType);
263 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
264 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
265 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
266 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
267 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
268 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400269 case SkBlendMode::kScreen:
Brian Salomon9a514982017-02-14 10:28:22 -0500270 TEST_ASSERT(xpi.fReadsDst);
271 TEST_ASSERT(!xpi.fHasConstantPreCoverageBlendedColor);
egdaniel723b0502015-09-15 09:31:40 -0700272 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
273 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
274 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
275 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
276 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
277 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
278 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
279 break;
280 default:
281 ERRORF(reporter, "Invalid xfermode.");
282 break;
283 }
284 }
285}
cdalton6fd158e2015-05-27 15:08:33 -0700286static void test_color_unknown_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomon92aee3d2016-12-21 09:20:25 -0500287 GrPipelineAnalysis analysis;
cdalton6fd158e2015-05-27 15:08:33 -0700288
Brian Salomon92aee3d2016-12-21 09:20:25 -0500289 SkASSERT(!analysis.fColorPOI.isOpaque());
290 SkASSERT(!analysis.fColorPOI.isSolidWhite());
291 SkASSERT(!analysis.fCoveragePOI.isSolidWhite());
Brian Salomonaab259e2017-01-17 10:44:34 -0500292 SkASSERT(!analysis.fCoveragePOI.isLCDCoverage());
cdalton6fd158e2015-05-27 15:08:33 -0700293
Mike Reed7d954ad2016-10-28 15:42:34 -0400294 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
295 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon92aee3d2016-12-21 09:20:25 -0500296 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, analysis);
cdalton6fd158e2015-05-27 15:08:33 -0700297 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400298 case SkBlendMode::kClear:
Brian Salomon9a514982017-02-14 10:28:22 -0500299 TEST_ASSERT(xpi.fReadsDst);
300 TEST_ASSERT(xpi.fHasConstantPreCoverageBlendedColor);
301 TEST_ASSERT(GrColor_TRANSPARENT_BLACK == xpi.fPreCoverageBlendedColor);
cdalton6fd158e2015-05-27 15:08:33 -0700302 TEST_ASSERT((kIgnoreColor_OptFlag) == xpi.fOptFlags);
303 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
304 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
305 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
306 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
307 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
308 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
309 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400310 case SkBlendMode::kSrc:
Brian Salomon9a514982017-02-14 10:28:22 -0500311 TEST_ASSERT(xpi.fReadsDst);
312 TEST_ASSERT(!xpi.fHasConstantPreCoverageBlendedColor);
bsalomon7765a472015-07-08 11:26:37 -0700313 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700314 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
315 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
316 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
317 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
318 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
319 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
320 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400321 case SkBlendMode::kDst:
Brian Salomon9a514982017-02-14 10:28:22 -0500322 TEST_ASSERT(xpi.fReadsDst);
323 TEST_ASSERT(!xpi.fHasConstantPreCoverageBlendedColor);
cdalton6fd158e2015-05-27 15:08:33 -0700324 TEST_ASSERT((kSkipDraw_OptFlag |
325 kIgnoreColor_OptFlag |
cdalton6fd158e2015-05-27 15:08:33 -0700326 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
327 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
328 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
329 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
330 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
331 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
332 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
333 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400334 case SkBlendMode::kSrcOver:
Brian Salomon9a514982017-02-14 10:28:22 -0500335 TEST_ASSERT(xpi.fReadsDst);
336 TEST_ASSERT(!xpi.fHasConstantPreCoverageBlendedColor);
cdalton6fd158e2015-05-27 15:08:33 -0700337 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
338 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
339 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
340 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
341 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
342 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
343 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
344 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400345 case SkBlendMode::kDstOver:
Brian Salomon9a514982017-02-14 10:28:22 -0500346 TEST_ASSERT(xpi.fReadsDst);
347 TEST_ASSERT(!xpi.fHasConstantPreCoverageBlendedColor);
cdalton6fd158e2015-05-27 15:08:33 -0700348 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
349 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
350 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
351 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
352 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
353 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
354 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
355 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400356 case SkBlendMode::kSrcIn:
Brian Salomon9a514982017-02-14 10:28:22 -0500357 TEST_ASSERT(xpi.fReadsDst);
358 TEST_ASSERT(!xpi.fHasConstantPreCoverageBlendedColor);
bsalomon7765a472015-07-08 11:26:37 -0700359 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700360 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
361 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
362 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
363 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
364 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
365 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
366 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400367 case SkBlendMode::kDstIn:
Brian Salomon9a514982017-02-14 10:28:22 -0500368 TEST_ASSERT(xpi.fReadsDst);
369 TEST_ASSERT(!xpi.fHasConstantPreCoverageBlendedColor);
bsalomon7765a472015-07-08 11:26:37 -0700370 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700371 TEST_ASSERT(kISAModulate_OutputType == xpi.fPrimaryOutputType);
372 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
373 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
374 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
375 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
376 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
377 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400378 case SkBlendMode::kSrcOut:
Brian Salomon9a514982017-02-14 10:28:22 -0500379 TEST_ASSERT(xpi.fReadsDst);
380 TEST_ASSERT(!xpi.fHasConstantPreCoverageBlendedColor);
bsalomon7765a472015-07-08 11:26:37 -0700381 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700382 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
383 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
384 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
385 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
386 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
387 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
388 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400389 case SkBlendMode::kDstOut:
Brian Salomon9a514982017-02-14 10:28:22 -0500390 TEST_ASSERT(xpi.fReadsDst);
391 TEST_ASSERT(!xpi.fHasConstantPreCoverageBlendedColor);
cdalton6fd158e2015-05-27 15:08:33 -0700392 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
393 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
394 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
395 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
396 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
397 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
398 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
399 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400400 case SkBlendMode::kSrcATop:
Brian Salomon9a514982017-02-14 10:28:22 -0500401 TEST_ASSERT(xpi.fReadsDst);
402 TEST_ASSERT(!xpi.fHasConstantPreCoverageBlendedColor);
cdalton6fd158e2015-05-27 15:08:33 -0700403 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
404 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
405 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
406 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
407 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
408 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
409 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
410 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400411 case SkBlendMode::kDstATop:
Brian Salomon9a514982017-02-14 10:28:22 -0500412 TEST_ASSERT(xpi.fReadsDst);
413 TEST_ASSERT(!xpi.fHasConstantPreCoverageBlendedColor);
bsalomon7765a472015-07-08 11:26:37 -0700414 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700415 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
416 TEST_ASSERT(kISAModulate_OutputType == xpi.fSecondaryOutputType);
417 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
418 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
419 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
420 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
421 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400422 case SkBlendMode::kXor:
Brian Salomon9a514982017-02-14 10:28:22 -0500423 TEST_ASSERT(xpi.fReadsDst);
424 TEST_ASSERT(!xpi.fHasConstantPreCoverageBlendedColor);
cdalton6fd158e2015-05-27 15:08:33 -0700425 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
426 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
427 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
428 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
429 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
430 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
431 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
432 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400433 case SkBlendMode::kPlus:
Brian Salomon9a514982017-02-14 10:28:22 -0500434 TEST_ASSERT(xpi.fReadsDst);
435 TEST_ASSERT(!xpi.fHasConstantPreCoverageBlendedColor);
cdalton6fd158e2015-05-27 15:08:33 -0700436 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
437 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
438 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
439 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
440 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
441 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
442 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
443 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400444 case SkBlendMode::kModulate:
Brian Salomon9a514982017-02-14 10:28:22 -0500445 TEST_ASSERT(xpi.fReadsDst);
446 TEST_ASSERT(!xpi.fHasConstantPreCoverageBlendedColor);
bsalomon7765a472015-07-08 11:26:37 -0700447 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700448 TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType);
449 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
450 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
451 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
452 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
453 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
454 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400455 case SkBlendMode::kScreen:
Brian Salomon9a514982017-02-14 10:28:22 -0500456 TEST_ASSERT(xpi.fReadsDst);
457 TEST_ASSERT(!xpi.fHasConstantPreCoverageBlendedColor);
cdalton6fd158e2015-05-27 15:08:33 -0700458 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
459 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
460 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
461 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
462 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
463 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
464 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
465 break;
466 default:
467 ERRORF(reporter, "Invalid xfermode.");
468 break;
469 }
470 }
471}
472
473static void test_color_unknown_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomon92aee3d2016-12-21 09:20:25 -0500474 GrPipelineAnalysis analysis;
Brian Salomonc6b71462017-02-14 11:33:01 -0500475 analysis.fColorPOI.reset(GrPipelineInput(GrColorPackRGBA(229, 0, 154, 240)));
476 analysis.fCoveragePOI.reset(GrPipelineInput(GrColorPackA4(255)));
cdalton6fd158e2015-05-27 15:08:33 -0700477
Brian Salomon92aee3d2016-12-21 09:20:25 -0500478 SkASSERT(!analysis.fColorPOI.isOpaque());
479 SkASSERT(!analysis.fColorPOI.isSolidWhite());
480 SkASSERT(analysis.fCoveragePOI.isSolidWhite());
Brian Salomonaab259e2017-01-17 10:44:34 -0500481 SkASSERT(!analysis.fCoveragePOI.isLCDCoverage());
cdalton6fd158e2015-05-27 15:08:33 -0700482
Mike Reed7d954ad2016-10-28 15:42:34 -0400483 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
484 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon92aee3d2016-12-21 09:20:25 -0500485 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, analysis);
cdalton6fd158e2015-05-27 15:08:33 -0700486 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400487 case SkBlendMode::kClear:
Brian Salomon9a514982017-02-14 10:28:22 -0500488 TEST_ASSERT(!xpi.fReadsDst);
489 TEST_ASSERT(xpi.fHasConstantPreCoverageBlendedColor);
490 TEST_ASSERT(GrColor_TRANSPARENT_BLACK == xpi.fPreCoverageBlendedColor);
Brian Salomon8c852be2017-01-04 10:44:42 -0500491 TEST_ASSERT(kIgnoreColor_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700492 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
493 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
494 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
495 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
496 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
497 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
498 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400499 case SkBlendMode::kSrc:
Brian Salomon9a514982017-02-14 10:28:22 -0500500 TEST_ASSERT(!xpi.fReadsDst);
501 TEST_ASSERT(xpi.fHasConstantPreCoverageBlendedColor);
502 TEST_ASSERT(229 == GrColorUnpackR(xpi.fPreCoverageBlendedColor));
503 TEST_ASSERT(0 == GrColorUnpackG(xpi.fPreCoverageBlendedColor));
504 TEST_ASSERT(154 == GrColorUnpackB(xpi.fPreCoverageBlendedColor));
505 TEST_ASSERT(240 == GrColorUnpackA(xpi.fPreCoverageBlendedColor));
Brian Salomon8c852be2017-01-04 10:44:42 -0500506 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700507 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
508 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
509 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
510 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
511 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
512 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
513 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400514 case SkBlendMode::kDst:
Brian Salomon9a514982017-02-14 10:28:22 -0500515 TEST_ASSERT(xpi.fReadsDst);
516 TEST_ASSERT(!xpi.fHasConstantPreCoverageBlendedColor);
cdalton6fd158e2015-05-27 15:08:33 -0700517 TEST_ASSERT((kSkipDraw_OptFlag |
518 kIgnoreColor_OptFlag |
cdalton6fd158e2015-05-27 15:08:33 -0700519 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
520 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
521 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
522 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
523 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
524 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
525 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
526 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400527 case SkBlendMode::kSrcOver:
Brian Salomon9a514982017-02-14 10:28:22 -0500528 TEST_ASSERT(xpi.fReadsDst);
529 TEST_ASSERT(!xpi.fHasConstantPreCoverageBlendedColor);
Brian Salomon8c852be2017-01-04 10:44:42 -0500530 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700531 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
532 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
533 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
534 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
535 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
536 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
537 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400538 case SkBlendMode::kDstOver:
Brian Salomon9a514982017-02-14 10:28:22 -0500539 TEST_ASSERT(xpi.fReadsDst);
540 TEST_ASSERT(!xpi.fHasConstantPreCoverageBlendedColor);
Brian Salomon8c852be2017-01-04 10:44:42 -0500541 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700542 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
543 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
544 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
545 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
546 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
547 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
548 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400549 case SkBlendMode::kSrcIn:
Brian Salomon9a514982017-02-14 10:28:22 -0500550 TEST_ASSERT(xpi.fReadsDst);
551 TEST_ASSERT(!xpi.fHasConstantPreCoverageBlendedColor);
Brian Salomon8c852be2017-01-04 10:44:42 -0500552 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700553 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
554 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
555 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
556 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
557 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
558 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
559 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400560 case SkBlendMode::kDstIn:
Brian Salomon9a514982017-02-14 10:28:22 -0500561 TEST_ASSERT(xpi.fReadsDst);
562 TEST_ASSERT(!xpi.fHasConstantPreCoverageBlendedColor);
Brian Salomon8c852be2017-01-04 10:44:42 -0500563 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700564 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
565 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
566 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
567 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
568 TEST_ASSERT(kSA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
569 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
570 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400571 case SkBlendMode::kSrcOut:
Brian Salomon9a514982017-02-14 10:28:22 -0500572 TEST_ASSERT(xpi.fReadsDst);
573 TEST_ASSERT(!xpi.fHasConstantPreCoverageBlendedColor);
Brian Salomon8c852be2017-01-04 10:44:42 -0500574 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700575 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
576 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
577 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
578 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
579 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
580 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
581 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400582 case SkBlendMode::kDstOut:
Brian Salomon9a514982017-02-14 10:28:22 -0500583 TEST_ASSERT(xpi.fReadsDst);
584 TEST_ASSERT(!xpi.fHasConstantPreCoverageBlendedColor);
Brian Salomon8c852be2017-01-04 10:44:42 -0500585 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700586 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
587 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
588 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
589 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
590 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
591 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
592 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400593 case SkBlendMode::kSrcATop:
Brian Salomon9a514982017-02-14 10:28:22 -0500594 TEST_ASSERT(xpi.fReadsDst);
595 TEST_ASSERT(!xpi.fHasConstantPreCoverageBlendedColor);
Brian Salomon8c852be2017-01-04 10:44:42 -0500596 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700597 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
598 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
599 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
600 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
601 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
602 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
603 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400604 case SkBlendMode::kDstATop:
Brian Salomon9a514982017-02-14 10:28:22 -0500605 TEST_ASSERT(xpi.fReadsDst);
606 TEST_ASSERT(!xpi.fHasConstantPreCoverageBlendedColor);
Brian Salomon8c852be2017-01-04 10:44:42 -0500607 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700608 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
609 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
610 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
611 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
612 TEST_ASSERT(kSA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
613 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
614 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400615 case SkBlendMode::kXor:
Brian Salomon9a514982017-02-14 10:28:22 -0500616 TEST_ASSERT(xpi.fReadsDst);
617 TEST_ASSERT(!xpi.fHasConstantPreCoverageBlendedColor);
Brian Salomon8c852be2017-01-04 10:44:42 -0500618 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700619 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
620 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
621 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
622 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
623 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
624 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
625 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400626 case SkBlendMode::kPlus:
Brian Salomon9a514982017-02-14 10:28:22 -0500627 TEST_ASSERT(xpi.fReadsDst);
628 TEST_ASSERT(!xpi.fHasConstantPreCoverageBlendedColor);
Brian Salomon8c852be2017-01-04 10:44:42 -0500629 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700630 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
631 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
632 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
633 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
634 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
635 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
636 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400637 case SkBlendMode::kModulate:
Brian Salomon9a514982017-02-14 10:28:22 -0500638 TEST_ASSERT(xpi.fReadsDst);
639 TEST_ASSERT(!xpi.fHasConstantPreCoverageBlendedColor);
Brian Salomon8c852be2017-01-04 10:44:42 -0500640 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700641 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
642 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
643 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
644 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
645 TEST_ASSERT(kSC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
646 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
647 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400648 case SkBlendMode::kScreen:
Brian Salomon9a514982017-02-14 10:28:22 -0500649 TEST_ASSERT(xpi.fReadsDst);
650 TEST_ASSERT(!xpi.fHasConstantPreCoverageBlendedColor);
Brian Salomon8c852be2017-01-04 10:44:42 -0500651 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700652 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
653 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
654 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
655 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
656 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
657 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
658 break;
659 default:
660 ERRORF(reporter, "Invalid xfermode.");
661 break;
662 }
663 }
664}
665
666static void test_color_opaque_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomon92aee3d2016-12-21 09:20:25 -0500667 GrPipelineAnalysis analysis;
Brian Salomonc6b71462017-02-14 11:33:01 -0500668 analysis.fColorPOI.reset(GrPipelineInput(GrPipelineInput::Opaque::kYes));
cdalton6fd158e2015-05-27 15:08:33 -0700669
Brian Salomon92aee3d2016-12-21 09:20:25 -0500670 SkASSERT(analysis.fColorPOI.isOpaque());
671 SkASSERT(!analysis.fColorPOI.isSolidWhite());
672 SkASSERT(!analysis.fCoveragePOI.isSolidWhite());
Brian Salomonaab259e2017-01-17 10:44:34 -0500673 SkASSERT(!analysis.fCoveragePOI.isLCDCoverage());
cdalton6fd158e2015-05-27 15:08:33 -0700674
Mike Reed7d954ad2016-10-28 15:42:34 -0400675 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
676 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon92aee3d2016-12-21 09:20:25 -0500677 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, analysis);
cdalton6fd158e2015-05-27 15:08:33 -0700678 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400679 case SkBlendMode::kClear:
Brian Salomon9a514982017-02-14 10:28:22 -0500680 TEST_ASSERT(xpi.fReadsDst);
681 TEST_ASSERT(xpi.fHasConstantPreCoverageBlendedColor);
682 TEST_ASSERT(GrColor_TRANSPARENT_BLACK == xpi.fPreCoverageBlendedColor);
cdalton6fd158e2015-05-27 15:08:33 -0700683 TEST_ASSERT((kIgnoreColor_OptFlag) == xpi.fOptFlags);
684 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
685 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
686 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
687 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
688 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
689 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
690 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400691 case SkBlendMode::kSrc:
Brian Salomon9a514982017-02-14 10:28:22 -0500692 TEST_ASSERT(xpi.fReadsDst);
693 TEST_ASSERT(!xpi.fHasConstantPreCoverageBlendedColor);
cdalton6fd158e2015-05-27 15:08:33 -0700694 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
695 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
696 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
697 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
698 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
699 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
700 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
701 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400702 case SkBlendMode::kDst:
Brian Salomon9a514982017-02-14 10:28:22 -0500703 TEST_ASSERT(xpi.fReadsDst);
704 TEST_ASSERT(!xpi.fHasConstantPreCoverageBlendedColor);
cdalton6fd158e2015-05-27 15:08:33 -0700705 TEST_ASSERT((kSkipDraw_OptFlag |
706 kIgnoreColor_OptFlag |
cdalton6fd158e2015-05-27 15:08:33 -0700707 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
708 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
709 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
710 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
711 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
712 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
713 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
714 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400715 case SkBlendMode::kSrcOver:
Brian Salomon9a514982017-02-14 10:28:22 -0500716 TEST_ASSERT(xpi.fReadsDst);
717 TEST_ASSERT(!xpi.fHasConstantPreCoverageBlendedColor);
cdalton6fd158e2015-05-27 15:08:33 -0700718 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
719 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
720 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
721 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
722 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
723 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
724 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
725 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400726 case SkBlendMode::kDstOver:
Brian Salomon9a514982017-02-14 10:28:22 -0500727 TEST_ASSERT(xpi.fReadsDst);
728 TEST_ASSERT(!xpi.fHasConstantPreCoverageBlendedColor);
cdalton6fd158e2015-05-27 15:08:33 -0700729 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
730 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
731 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
732 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
733 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
734 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
735 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
736 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400737 case SkBlendMode::kSrcIn:
Brian Salomon9a514982017-02-14 10:28:22 -0500738 TEST_ASSERT(xpi.fReadsDst);
739 TEST_ASSERT(!xpi.fHasConstantPreCoverageBlendedColor);
cdalton6fd158e2015-05-27 15:08:33 -0700740 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
741 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
742 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
743 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
744 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
745 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
746 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
747 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400748 case SkBlendMode::kDstIn:
Brian Salomon9a514982017-02-14 10:28:22 -0500749 TEST_ASSERT(xpi.fReadsDst);
750 TEST_ASSERT(!xpi.fHasConstantPreCoverageBlendedColor);
cdalton6fd158e2015-05-27 15:08:33 -0700751 TEST_ASSERT((kSkipDraw_OptFlag |
752 kIgnoreColor_OptFlag |
cdalton6fd158e2015-05-27 15:08:33 -0700753 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
754 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
755 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
756 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
757 TEST_ASSERT(kZero_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::kSrcOut:
Brian Salomon9a514982017-02-14 10:28:22 -0500762 TEST_ASSERT(xpi.fReadsDst);
763 TEST_ASSERT(!xpi.fHasConstantPreCoverageBlendedColor);
cdalton6fd158e2015-05-27 15:08:33 -0700764 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
765 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
766 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
767 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
768 TEST_ASSERT(kIDA_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::kDstOut:
Brian Salomon9a514982017-02-14 10:28:22 -0500773 TEST_ASSERT(xpi.fReadsDst);
774 TEST_ASSERT(xpi.fHasConstantPreCoverageBlendedColor);
775 TEST_ASSERT(GrColor_TRANSPARENT_BLACK == xpi.fPreCoverageBlendedColor);
cdalton6fd158e2015-05-27 15:08:33 -0700776 TEST_ASSERT((kIgnoreColor_OptFlag) == xpi.fOptFlags);
777 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
778 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
779 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
780 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
781 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
782 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
783 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400784 case SkBlendMode::kSrcATop:
Brian Salomon9a514982017-02-14 10:28:22 -0500785 TEST_ASSERT(xpi.fReadsDst);
786 TEST_ASSERT(!xpi.fHasConstantPreCoverageBlendedColor);
cdalton6fd158e2015-05-27 15:08:33 -0700787 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
788 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
789 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
790 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
791 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
792 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
793 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
794 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400795 case SkBlendMode::kDstATop:
Brian Salomon9a514982017-02-14 10:28:22 -0500796 TEST_ASSERT(xpi.fReadsDst);
797 TEST_ASSERT(!xpi.fHasConstantPreCoverageBlendedColor);
cdalton6fd158e2015-05-27 15:08:33 -0700798 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
799 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
800 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
801 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
802 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
803 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
804 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
805 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400806 case SkBlendMode::kXor:
Brian Salomon9a514982017-02-14 10:28:22 -0500807 TEST_ASSERT(xpi.fReadsDst);
808 TEST_ASSERT(!xpi.fHasConstantPreCoverageBlendedColor);
cdalton6fd158e2015-05-27 15:08:33 -0700809 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
810 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
811 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
812 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
813 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
814 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
815 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
816 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400817 case SkBlendMode::kPlus:
Brian Salomon9a514982017-02-14 10:28:22 -0500818 TEST_ASSERT(xpi.fReadsDst);
819 TEST_ASSERT(!xpi.fHasConstantPreCoverageBlendedColor);
cdalton6fd158e2015-05-27 15:08:33 -0700820 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
821 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(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
826 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
827 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400828 case SkBlendMode::kModulate:
Brian Salomon9a514982017-02-14 10:28:22 -0500829 TEST_ASSERT(xpi.fReadsDst);
830 TEST_ASSERT(!xpi.fHasConstantPreCoverageBlendedColor);
bsalomon7765a472015-07-08 11:26:37 -0700831 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700832 TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType);
833 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
834 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
835 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
836 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
837 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
838 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400839 case SkBlendMode::kScreen:
Brian Salomon9a514982017-02-14 10:28:22 -0500840 TEST_ASSERT(xpi.fReadsDst);
841 TEST_ASSERT(!xpi.fHasConstantPreCoverageBlendedColor);
cdalton6fd158e2015-05-27 15:08:33 -0700842 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
843 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
844 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
845 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
846 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
847 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
848 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
849 break;
850 default:
851 ERRORF(reporter, "Invalid xfermode.");
852 break;
853 }
854 }
855}
856
857static void test_color_opaque_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomon92aee3d2016-12-21 09:20:25 -0500858 GrPipelineAnalysis analysis;
Brian Salomonc6b71462017-02-14 11:33:01 -0500859 analysis.fColorPOI.reset(GrPipelineInput(GrPipelineInput::Opaque::kYes));
860 analysis.fCoveragePOI.reset(GrPipelineInput(GrColorPackA4(255)));
cdalton6fd158e2015-05-27 15:08:33 -0700861
Brian Salomon92aee3d2016-12-21 09:20:25 -0500862 SkASSERT(analysis.fColorPOI.isOpaque());
863 SkASSERT(!analysis.fColorPOI.isSolidWhite());
864 SkASSERT(analysis.fCoveragePOI.isSolidWhite());
Brian Salomonaab259e2017-01-17 10:44:34 -0500865 SkASSERT(!analysis.fCoveragePOI.isLCDCoverage());
cdalton6fd158e2015-05-27 15:08:33 -0700866
Mike Reed7d954ad2016-10-28 15:42:34 -0400867 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
868 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon92aee3d2016-12-21 09:20:25 -0500869 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, analysis);
cdalton6fd158e2015-05-27 15:08:33 -0700870
871 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400872 case SkBlendMode::kClear:
Brian Salomon9a514982017-02-14 10:28:22 -0500873 TEST_ASSERT(!xpi.fReadsDst);
874 TEST_ASSERT(xpi.fHasConstantPreCoverageBlendedColor);
875 TEST_ASSERT(GrColor_TRANSPARENT_BLACK == xpi.fPreCoverageBlendedColor);
Brian Salomon8c852be2017-01-04 10:44:42 -0500876 TEST_ASSERT(kIgnoreColor_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700877 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
878 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
879 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
880 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
881 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
882 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
883 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400884 case SkBlendMode::kSrc:
Brian Salomon9a514982017-02-14 10:28:22 -0500885 TEST_ASSERT(!xpi.fReadsDst);
Brian Salomon9a514982017-02-14 10:28:22 -0500886 TEST_ASSERT(!xpi.fHasConstantPreCoverageBlendedColor);
Brian Salomon8c852be2017-01-04 10:44:42 -0500887 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700888 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
889 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
890 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
891 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
892 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
893 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
894 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400895 case SkBlendMode::kDst:
Brian Salomon9a514982017-02-14 10:28:22 -0500896 TEST_ASSERT(xpi.fReadsDst);
897 TEST_ASSERT(!xpi.fHasConstantPreCoverageBlendedColor);
cdalton6fd158e2015-05-27 15:08:33 -0700898 TEST_ASSERT((kSkipDraw_OptFlag |
899 kIgnoreColor_OptFlag |
cdalton6fd158e2015-05-27 15:08:33 -0700900 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
901 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
902 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
903 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
904 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
905 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
906 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
907 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400908 case SkBlendMode::kSrcOver:
Brian Salomon9a514982017-02-14 10:28:22 -0500909 TEST_ASSERT(!xpi.fReadsDst);
Brian Salomoneec6f7b2017-02-10 14:29:38 -0500910 // We don't really track per-component blended output anymore.
Brian Salomon9a514982017-02-14 10:28:22 -0500911 TEST_ASSERT(!xpi.fHasConstantPreCoverageBlendedColor);
Brian Salomon8c852be2017-01-04 10:44:42 -0500912 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700913 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
914 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
915 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
916 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
917 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
918 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
919 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400920 case SkBlendMode::kDstOver:
Brian Salomon9a514982017-02-14 10:28:22 -0500921 TEST_ASSERT(xpi.fReadsDst);
922 TEST_ASSERT(!xpi.fHasConstantPreCoverageBlendedColor);
Brian Salomon8c852be2017-01-04 10:44:42 -0500923 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
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(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
929 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
930 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400931 case SkBlendMode::kSrcIn:
Brian Salomon9a514982017-02-14 10:28:22 -0500932 TEST_ASSERT(xpi.fReadsDst);
933 TEST_ASSERT(!xpi.fHasConstantPreCoverageBlendedColor);
Brian Salomon8c852be2017-01-04 10:44:42 -0500934 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700935 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
936 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
937 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
938 TEST_ASSERT(kDA_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::kDstIn:
Brian Salomon9a514982017-02-14 10:28:22 -0500943 TEST_ASSERT(xpi.fReadsDst);
944 TEST_ASSERT(!xpi.fHasConstantPreCoverageBlendedColor);
cdalton6fd158e2015-05-27 15:08:33 -0700945 TEST_ASSERT((kSkipDraw_OptFlag |
946 kIgnoreColor_OptFlag |
cdalton6fd158e2015-05-27 15:08:33 -0700947 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
948 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
949 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
950 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
951 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
952 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
953 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
954 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400955 case SkBlendMode::kSrcOut:
Brian Salomon9a514982017-02-14 10:28:22 -0500956 TEST_ASSERT(xpi.fReadsDst);
957 TEST_ASSERT(!xpi.fHasConstantPreCoverageBlendedColor);
Brian Salomon8c852be2017-01-04 10:44:42 -0500958 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
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(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
964 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
965 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400966 case SkBlendMode::kDstOut:
Brian Salomon9a514982017-02-14 10:28:22 -0500967 TEST_ASSERT(!xpi.fReadsDst);
968 TEST_ASSERT(xpi.fHasConstantPreCoverageBlendedColor);
969 TEST_ASSERT(GrColor_TRANSPARENT_BLACK == xpi.fPreCoverageBlendedColor);
Brian Salomon8c852be2017-01-04 10:44:42 -0500970 TEST_ASSERT(kIgnoreColor_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700971 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
972 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
973 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
974 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
975 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
976 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
977 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400978 case SkBlendMode::kSrcATop:
Brian Salomon9a514982017-02-14 10:28:22 -0500979 TEST_ASSERT(xpi.fReadsDst);
980 TEST_ASSERT(!xpi.fHasConstantPreCoverageBlendedColor);
Brian Salomon8c852be2017-01-04 10:44:42 -0500981 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700982 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
983 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
984 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
985 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
986 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
987 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
988 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400989 case SkBlendMode::kDstATop:
Brian Salomon9a514982017-02-14 10:28:22 -0500990 TEST_ASSERT(xpi.fReadsDst);
991 TEST_ASSERT(!xpi.fHasConstantPreCoverageBlendedColor);
Brian Salomon8c852be2017-01-04 10:44:42 -0500992 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700993 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
994 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
995 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
996 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
997 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
998 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
999 break;
Mike Reed7d954ad2016-10-28 15:42:34 -04001000 case SkBlendMode::kXor:
Brian Salomon9a514982017-02-14 10:28:22 -05001001 TEST_ASSERT(xpi.fReadsDst);
1002 TEST_ASSERT(!xpi.fHasConstantPreCoverageBlendedColor);
Brian Salomon8c852be2017-01-04 10:44:42 -05001003 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -07001004 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
1005 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
1006 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
1007 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
1008 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
1009 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
1010 break;
Mike Reed7d954ad2016-10-28 15:42:34 -04001011 case SkBlendMode::kPlus:
Brian Salomon9a514982017-02-14 10:28:22 -05001012 TEST_ASSERT(xpi.fReadsDst);
1013 TEST_ASSERT(!xpi.fHasConstantPreCoverageBlendedColor);
Brian Salomon8c852be2017-01-04 10:44:42 -05001014 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -07001015 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
1016 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
1017 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
1018 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
1019 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
1020 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
1021 break;
Mike Reed7d954ad2016-10-28 15:42:34 -04001022 case SkBlendMode::kModulate:
Brian Salomon9a514982017-02-14 10:28:22 -05001023 TEST_ASSERT(xpi.fReadsDst);
1024 TEST_ASSERT(!xpi.fHasConstantPreCoverageBlendedColor);
Brian Salomon8c852be2017-01-04 10:44:42 -05001025 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -07001026 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
1027 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
1028 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
1029 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
1030 TEST_ASSERT(kSC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
1031 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
1032 break;
Mike Reed7d954ad2016-10-28 15:42:34 -04001033 case SkBlendMode::kScreen:
Brian Salomon9a514982017-02-14 10:28:22 -05001034 TEST_ASSERT(xpi.fReadsDst);
1035 TEST_ASSERT(!xpi.fHasConstantPreCoverageBlendedColor);
Brian Salomon8c852be2017-01-04 10:44:42 -05001036 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -07001037 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
1038 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
1039 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
1040 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
1041 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
1042 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
1043 break;
1044 default:
1045 ERRORF(reporter, "Invalid xfermode.");
1046 break;
1047 }
1048 }
1049}
1050
egdaniel723b0502015-09-15 09:31:40 -07001051static void test_lcd_coverage_fallback_case(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomon92aee3d2016-12-21 09:20:25 -05001052 class TestLCDCoverageOp : public GrMeshDrawOp {
reed1b55a962015-09-17 20:16:13 -07001053 public:
Brian Salomon25a88092016-12-01 09:36:50 -05001054 DEFINE_OP_CLASS_ID
reed1b55a962015-09-17 20:16:13 -07001055
Brian Salomon92aee3d2016-12-21 09:20:25 -05001056 TestLCDCoverageOp() : INHERITED(ClassID()) {}
cdalton6fd158e2015-05-27 15:08:33 -07001057
Brian Salomon09d994e2016-12-21 11:14:46 -05001058 const char* name() const override { return "Test LCD Text Op"; }
Brian Salomon92aee3d2016-12-21 09:20:25 -05001059
1060 private:
1061 void getPipelineAnalysisInput(GrPipelineAnalysisDrawOpInput* input) const override {
Brian Salomonc6b71462017-02-14 11:33:01 -05001062 input->pipelineColorInput()->setToConstant(GrColorPackRGBA(123, 45, 67, 221));
1063 input->pipelineCoverageInput()->setToLCDCoverage();
Brian Salomon92aee3d2016-12-21 09:20:25 -05001064 }
1065
1066 void applyPipelineOptimizations(const GrPipelineOptimizations&) override {}
Brian Salomon25a88092016-12-01 09:36:50 -05001067 bool onCombineIfPossible(GrOp*, const GrCaps&) override { return false; }
Mike Kleinfc6c37b2016-09-27 09:34:10 -04001068 void onPrepareDraws(Target*) const override {}
cdalton6fd158e2015-05-27 15:08:33 -07001069
Brian Salomondad29232016-12-01 16:40:24 -05001070 typedef GrMeshDrawOp INHERITED;
Brian Salomon92aee3d2016-12-21 09:20:25 -05001071 } testLCDCoverageOp;
cdalton6fd158e2015-05-27 15:08:33 -07001072
Brian Salomon92aee3d2016-12-21 09:20:25 -05001073 GrPipelineAnalysis analysis;
1074 testLCDCoverageOp.initPipelineAnalysis(&analysis);
1075 GrProcOptInfo colorPOI = analysis.fColorPOI;
1076 GrProcOptInfo covPOI = analysis.fCoveragePOI;
Brian Salomoneec6f7b2017-02-10 14:29:38 -05001077 // Prevent unused var warnings in release.
1078 (void)colorPOI;
1079 (void)covPOI;
cdalton6fd158e2015-05-27 15:08:33 -07001080
Brian Salomoneec6f7b2017-02-10 14:29:38 -05001081 SkASSERT(colorPOI.hasKnownOutputColor());
Brian Salomonaab259e2017-01-17 10:44:34 -05001082 SkASSERT(covPOI.isLCDCoverage());
cdalton6fd158e2015-05-27 15:08:33 -07001083
Brian Salomona1633922017-01-09 11:46:10 -05001084 const GrXPFactory* xpf = GrPorterDuffXPFactory::Get(SkBlendMode::kSrcOver);
Brian Salomon92aee3d2016-12-21 09:20:25 -05001085 TEST_ASSERT(!xpf->willNeedDstTexture(caps, analysis));
cdalton6fd158e2015-05-27 15:08:33 -07001086
Brian Salomon92aee3d2016-12-21 09:20:25 -05001087 sk_sp<GrXferProcessor> xp(xpf->createXferProcessor(analysis, false, nullptr, caps));
cdalton6fd158e2015-05-27 15:08:33 -07001088 if (!xp) {
1089 ERRORF(reporter, "Failed to create an XP with LCD coverage.");
1090 return;
1091 }
1092
Brian Salomon9a514982017-02-14 10:28:22 -05001093 GrColor color;
1094 TEST_ASSERT(GrXPFactory::WillReadDst(xpf, colorPOI, covPOI));
1095 TEST_ASSERT(!GrXPFactory::IsPreCoverageBlendedColorConstant(xpf, colorPOI, &color));
cdalton6fd158e2015-05-27 15:08:33 -07001096
1097 GrColor overrideColor;
Brian Salomon92aee3d2016-12-21 09:20:25 -05001098 xp->getOptimizations(analysis, false, &overrideColor, caps);
cdalton6fd158e2015-05-27 15:08:33 -07001099
1100 GrXferProcessor::BlendInfo blendInfo;
1101 xp->getBlendInfo(&blendInfo);
1102 TEST_ASSERT(blendInfo.fWriteColor);
1103}
1104
kkinnunen15302832015-12-01 04:35:26 -08001105DEF_GPUTEST(PorterDuffNoDualSourceBlending, reporter, /*factory*/) {
cdalton6fd158e2015-05-27 15:08:33 -07001106 GrContextOptions opts;
1107 opts.fSuppressDualSourceBlending = true;
bsalomon3724e572016-03-30 18:56:19 -07001108 sk_gpu_test::GrContextFactory mockFactory(opts);
bsalomon85b4b532016-04-05 11:06:27 -07001109 GrContext* ctx = mockFactory.get(sk_gpu_test::GrContextFactory::kNullGL_ContextType);
cdalton6fd158e2015-05-27 15:08:33 -07001110 if (!ctx) {
1111 SkFAIL("Failed to create null context without ARB_blend_func_extended.");
1112 return;
1113 }
1114
bsalomon76228632015-05-29 08:02:10 -07001115 const GrCaps& caps = *ctx->caps();
cdalton6fd158e2015-05-27 15:08:33 -07001116 if (caps.shaderCaps()->dualSourceBlendingSupport()) {
1117 SkFAIL("Null context failed to honor request for no ARB_blend_func_extended.");
1118 return;
1119 }
1120
bsalomon091f60c2015-11-10 11:54:56 -08001121 GrBackendObject backendTex =
bungeman6bd52842016-10-27 09:30:08 -07001122 ctx->getGpu()->createTestingOnlyBackendTexture(nullptr, 100, 100, kRGBA_8888_GrPixelConfig);
cdalton6fd158e2015-05-27 15:08:33 -07001123 GrBackendTextureDesc fakeDesc;
1124 fakeDesc.fConfig = kRGBA_8888_GrPixelConfig;
1125 fakeDesc.fWidth = fakeDesc.fHeight = 100;
bsalomon091f60c2015-11-10 11:54:56 -08001126 fakeDesc.fTextureHandle = backendTex;
cdalton6fd158e2015-05-27 15:08:33 -07001127 GrXferProcessor::DstTexture fakeDstTexture;
bungeman6bd52842016-10-27 09:30:08 -07001128 fakeDstTexture.setTexture(
1129 ctx->textureProvider()->wrapBackendTexture(fakeDesc, kBorrow_GrWrapOwnership));
cdalton6fd158e2015-05-27 15:08:33 -07001130
Brian Salomonc6b71462017-02-14 11:33:01 -05001131 static const GrPipelineInput colorInputs[] = {GrPipelineInput(),
1132 GrPipelineInput(GrPipelineInput::Opaque::kYes),
1133 GrPipelineInput(GrColorPackRGBA(0, 82, 17, 100)),
1134 GrPipelineInput(GrColorPackRGBA(0, 82, 17, 255))};
cdalton6fd158e2015-05-27 15:08:33 -07001135
Brian Salomonc6b71462017-02-14 11:33:01 -05001136 for (const auto& colorInput : colorInputs) {
Brian Salomon92aee3d2016-12-21 09:20:25 -05001137 GrPipelineAnalysis analysis;
Brian Salomonc6b71462017-02-14 11:33:01 -05001138 analysis.fColorPOI = colorInput;
1139 for (bool fractionalCoverage : {true, false}) {
1140 if (!fractionalCoverage) {
1141 analysis.fCoveragePOI.reset(GrPipelineInput(GrColorPackA4(255)));
cdalton6fd158e2015-05-27 15:08:33 -07001142 }
Mike Reed7d954ad2016-10-28 15:42:34 -04001143 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
1144 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomona1633922017-01-09 11:46:10 -05001145 const GrXPFactory* xpf = GrPorterDuffXPFactory::Get(xfermode);
cdalton86ae0a92015-06-08 15:11:04 -07001146 GrXferProcessor::DstTexture* dstTexture =
Brian Salomon92aee3d2016-12-21 09:20:25 -05001147 xpf->willNeedDstTexture(caps, analysis) ? &fakeDstTexture : 0;
Hal Canary342b7ac2016-11-04 11:49:42 -04001148 sk_sp<GrXferProcessor> xp(
Brian Salomon92aee3d2016-12-21 09:20:25 -05001149 xpf->createXferProcessor(analysis, false, dstTexture, caps));
cdalton6fd158e2015-05-27 15:08:33 -07001150 if (!xp) {
1151 ERRORF(reporter, "Failed to create an XP without dual source blending.");
1152 return;
1153 }
1154 TEST_ASSERT(!xp->hasSecondaryOutput());
Brian Salomonbfd51832017-01-04 13:22:08 -05001155 GrColor ignoredOverrideColor;
1156 xp->getOptimizations(analysis, false, &ignoredOverrideColor, caps);
cdalton6fd158e2015-05-27 15:08:33 -07001157 TEST_ASSERT(!xp->hasSecondaryOutput());
1158 }
1159 }
1160 }
bsalomon091f60c2015-11-10 11:54:56 -08001161 ctx->getGpu()->deleteTestingOnlyBackendTexture(backendTex);
cdalton6fd158e2015-05-27 15:08:33 -07001162}
1163
1164#endif