blob: a193162ada179cd47fc15fb1b9dc3c12e2a80410 [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);
Brian Salomon92aee3d2016-12-21 09:20:25 -050072 sk_sp<GrXferProcessor> xp(xpf->createXferProcessor(analysis, false, nullptr, caps));
73 TEST_ASSERT(!xpf->willNeedDstTexture(caps, analysis));
Brian Salomonbfd51832017-01-04 13:22:08 -050074 GrColor ignoredOverrideColor;
75 fOptFlags = xp->getOptimizations(analysis, false, &ignoredOverrideColor, caps);
Hal Canary342b7ac2016-11-04 11:49:42 -040076 GetXPOutputTypes(xp.get(), &fPrimaryOutputType, &fSecondaryOutputType);
cdalton6fd158e2015-05-27 15:08:33 -070077 xp->getBlendInfo(&fBlendInfo);
78 TEST_ASSERT(!xp->willReadDstColor());
79 TEST_ASSERT(xp->hasSecondaryOutput() == GrBlendCoeffRefsSrc2(fBlendInfo.fDstBlend));
80 }
81
Brian Salomon9a514982017-02-14 10:28:22 -050082 bool fReadsDst;
cdalton6fd158e2015-05-27 15:08:33 -070083 int fOptFlags;
84 int fPrimaryOutputType;
85 int fSecondaryOutputType;
86 GrXferProcessor::BlendInfo fBlendInfo;
87 };
88
89 static void GetXPOutputTypes(const GrXferProcessor* xp, int* outPrimary, int* outSecondary) {
egdanielf2342722015-11-20 15:12:59 -080090 GrPorterDuffXPFactory::TestGetXPOutputTypes(xp, outPrimary, outSecondary);
cdalton6fd158e2015-05-27 15:08:33 -070091 }
92};
93
egdaniel723b0502015-09-15 09:31:40 -070094static void test_lcd_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomon92aee3d2016-12-21 09:20:25 -050095 GrPipelineAnalysis analysis;
Brian Salomonaab259e2017-01-17 10:44:34 -050096 // Setting the last argument to true will force covPOI to LCD coverage.
Brian Salomonc6b71462017-02-14 11:33:01 -050097 analysis.fCoveragePOI.resetToLCDCoverage();
egdaniel723b0502015-09-15 09:31:40 -070098
Brian Salomon92aee3d2016-12-21 09:20:25 -050099 SkASSERT(!analysis.fColorPOI.isOpaque());
100 SkASSERT(!analysis.fColorPOI.isSolidWhite());
101 SkASSERT(!analysis.fCoveragePOI.isSolidWhite());
Brian Salomonaab259e2017-01-17 10:44:34 -0500102 SkASSERT(analysis.fCoveragePOI.isLCDCoverage());
egdaniel723b0502015-09-15 09:31:40 -0700103
Mike Reed7d954ad2016-10-28 15:42:34 -0400104 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
105 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon92aee3d2016-12-21 09:20:25 -0500106 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, analysis);
egdaniel723b0502015-09-15 09:31:40 -0700107 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400108 case SkBlendMode::kClear:
Brian Salomon9a514982017-02-14 10:28:22 -0500109 TEST_ASSERT(xpi.fReadsDst);
egdaniel723b0502015-09-15 09:31:40 -0700110 TEST_ASSERT((kIgnoreColor_OptFlag) == xpi.fOptFlags);
111 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
112 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
113 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
114 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
115 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
116 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
117 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400118 case SkBlendMode::kSrc:
Brian Salomon9a514982017-02-14 10:28:22 -0500119 TEST_ASSERT(xpi.fReadsDst);
egdaniel723b0502015-09-15 09:31:40 -0700120 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
121 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
122 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
123 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
124 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
125 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
126 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
127 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400128 case SkBlendMode::kDst:
Brian Salomon9a514982017-02-14 10:28:22 -0500129 TEST_ASSERT(xpi.fReadsDst);
egdaniel723b0502015-09-15 09:31:40 -0700130 TEST_ASSERT((kSkipDraw_OptFlag |
131 kIgnoreColor_OptFlag |
egdaniel723b0502015-09-15 09:31:40 -0700132 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
133 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
134 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
135 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
136 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
137 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
138 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
139 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400140 case SkBlendMode::kSrcOver:
Brian Salomon9a514982017-02-14 10:28:22 -0500141 TEST_ASSERT(xpi.fReadsDst);
egdaniel723b0502015-09-15 09:31:40 -0700142 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
143 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
144 TEST_ASSERT(kSAModulate_OutputType == xpi.fSecondaryOutputType);
145 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
146 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
147 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
148 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
149 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400150 case SkBlendMode::kDstOver:
Brian Salomon9a514982017-02-14 10:28:22 -0500151 TEST_ASSERT(xpi.fReadsDst);
egdaniel723b0502015-09-15 09:31:40 -0700152 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
153 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
154 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
155 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
156 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
157 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
158 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
159 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400160 case SkBlendMode::kSrcIn:
Brian Salomon9a514982017-02-14 10:28:22 -0500161 TEST_ASSERT(xpi.fReadsDst);
egdaniel723b0502015-09-15 09:31:40 -0700162 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
163 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
164 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
165 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
166 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
167 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
168 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
169 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400170 case SkBlendMode::kDstIn:
Brian Salomon9a514982017-02-14 10:28:22 -0500171 TEST_ASSERT(xpi.fReadsDst);
egdaniel723b0502015-09-15 09:31:40 -0700172 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
173 TEST_ASSERT(kISAModulate_OutputType == xpi.fPrimaryOutputType);
174 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
175 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
176 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
177 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
178 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
179 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400180 case SkBlendMode::kSrcOut:
Brian Salomon9a514982017-02-14 10:28:22 -0500181 TEST_ASSERT(xpi.fReadsDst);
egdaniel723b0502015-09-15 09:31:40 -0700182 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
183 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
184 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
185 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
186 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
187 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
188 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
189 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400190 case SkBlendMode::kDstOut:
Brian Salomon9a514982017-02-14 10:28:22 -0500191 TEST_ASSERT(xpi.fReadsDst);
egdaniel723b0502015-09-15 09:31:40 -0700192 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
193 TEST_ASSERT(kSAModulate_OutputType == xpi.fPrimaryOutputType);
194 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
195 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
196 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
197 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
198 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
199 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400200 case SkBlendMode::kSrcATop:
Brian Salomon9a514982017-02-14 10:28:22 -0500201 TEST_ASSERT(xpi.fReadsDst);
egdaniel723b0502015-09-15 09:31:40 -0700202 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
203 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
204 TEST_ASSERT(kSAModulate_OutputType == xpi.fSecondaryOutputType);
205 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
206 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
207 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
208 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
209 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400210 case SkBlendMode::kDstATop:
Brian Salomon9a514982017-02-14 10:28:22 -0500211 TEST_ASSERT(xpi.fReadsDst);
egdaniel723b0502015-09-15 09:31:40 -0700212 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
213 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
214 TEST_ASSERT(kISAModulate_OutputType == xpi.fSecondaryOutputType);
215 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
216 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
217 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
218 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
219 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400220 case SkBlendMode::kXor:
Brian Salomon9a514982017-02-14 10:28:22 -0500221 TEST_ASSERT(xpi.fReadsDst);
egdaniel723b0502015-09-15 09:31:40 -0700222 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
223 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
224 TEST_ASSERT(kSAModulate_OutputType == xpi.fSecondaryOutputType);
225 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
226 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
227 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
228 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
229 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400230 case SkBlendMode::kPlus:
Brian Salomon9a514982017-02-14 10:28:22 -0500231 TEST_ASSERT(xpi.fReadsDst);
egdaniel723b0502015-09-15 09:31:40 -0700232 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
233 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
234 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
235 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
236 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
237 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
238 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
239 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400240 case SkBlendMode::kModulate:
Brian Salomon9a514982017-02-14 10:28:22 -0500241 TEST_ASSERT(xpi.fReadsDst);
egdaniel723b0502015-09-15 09:31:40 -0700242 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
243 TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType);
244 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
245 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
246 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
247 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
248 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
249 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400250 case SkBlendMode::kScreen:
Brian Salomon9a514982017-02-14 10:28:22 -0500251 TEST_ASSERT(xpi.fReadsDst);
egdaniel723b0502015-09-15 09:31:40 -0700252 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
253 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
254 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
255 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
256 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
257 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
258 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
259 break;
260 default:
261 ERRORF(reporter, "Invalid xfermode.");
262 break;
263 }
264 }
265}
cdalton6fd158e2015-05-27 15:08:33 -0700266static void test_color_unknown_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomon92aee3d2016-12-21 09:20:25 -0500267 GrPipelineAnalysis analysis;
cdalton6fd158e2015-05-27 15:08:33 -0700268
Brian Salomon92aee3d2016-12-21 09:20:25 -0500269 SkASSERT(!analysis.fColorPOI.isOpaque());
270 SkASSERT(!analysis.fColorPOI.isSolidWhite());
271 SkASSERT(!analysis.fCoveragePOI.isSolidWhite());
Brian Salomonaab259e2017-01-17 10:44:34 -0500272 SkASSERT(!analysis.fCoveragePOI.isLCDCoverage());
cdalton6fd158e2015-05-27 15:08:33 -0700273
Mike Reed7d954ad2016-10-28 15:42:34 -0400274 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
275 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon92aee3d2016-12-21 09:20:25 -0500276 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, analysis);
cdalton6fd158e2015-05-27 15:08:33 -0700277 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400278 case SkBlendMode::kClear:
Brian Salomon9a514982017-02-14 10:28:22 -0500279 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700280 TEST_ASSERT((kIgnoreColor_OptFlag) == xpi.fOptFlags);
281 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
282 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
283 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
284 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
285 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
286 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
287 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400288 case SkBlendMode::kSrc:
Brian Salomon9a514982017-02-14 10:28:22 -0500289 TEST_ASSERT(xpi.fReadsDst);
bsalomon7765a472015-07-08 11:26:37 -0700290 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700291 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
292 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
293 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
294 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
295 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
296 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
297 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400298 case SkBlendMode::kDst:
Brian Salomon9a514982017-02-14 10:28:22 -0500299 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700300 TEST_ASSERT((kSkipDraw_OptFlag |
301 kIgnoreColor_OptFlag |
cdalton6fd158e2015-05-27 15:08:33 -0700302 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
303 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
304 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
305 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
306 TEST_ASSERT(kZero_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::kSrcOver:
Brian Salomon9a514982017-02-14 10:28:22 -0500311 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700312 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
313 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
314 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
315 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
316 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
317 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
318 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
319 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400320 case SkBlendMode::kDstOver:
Brian Salomon9a514982017-02-14 10:28:22 -0500321 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700322 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
323 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
324 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
325 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
326 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
327 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
328 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
329 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400330 case SkBlendMode::kSrcIn:
Brian Salomon9a514982017-02-14 10:28:22 -0500331 TEST_ASSERT(xpi.fReadsDst);
bsalomon7765a472015-07-08 11:26:37 -0700332 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700333 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
334 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
335 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
336 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
337 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
338 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
339 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400340 case SkBlendMode::kDstIn:
Brian Salomon9a514982017-02-14 10:28:22 -0500341 TEST_ASSERT(xpi.fReadsDst);
bsalomon7765a472015-07-08 11:26:37 -0700342 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700343 TEST_ASSERT(kISAModulate_OutputType == xpi.fPrimaryOutputType);
344 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
345 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
346 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
347 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
348 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
349 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400350 case SkBlendMode::kSrcOut:
Brian Salomon9a514982017-02-14 10:28:22 -0500351 TEST_ASSERT(xpi.fReadsDst);
bsalomon7765a472015-07-08 11:26:37 -0700352 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700353 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
354 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
355 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
356 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
357 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
358 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
359 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400360 case SkBlendMode::kDstOut:
Brian Salomon9a514982017-02-14 10:28:22 -0500361 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700362 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
363 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
364 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
365 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
366 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
367 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
368 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
369 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400370 case SkBlendMode::kSrcATop:
Brian Salomon9a514982017-02-14 10:28:22 -0500371 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700372 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
373 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
374 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
375 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
376 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
377 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
378 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
379 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400380 case SkBlendMode::kDstATop:
Brian Salomon9a514982017-02-14 10:28:22 -0500381 TEST_ASSERT(xpi.fReadsDst);
bsalomon7765a472015-07-08 11:26:37 -0700382 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700383 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
384 TEST_ASSERT(kISAModulate_OutputType == xpi.fSecondaryOutputType);
385 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
386 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
387 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
388 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
389 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400390 case SkBlendMode::kXor:
Brian Salomon9a514982017-02-14 10:28:22 -0500391 TEST_ASSERT(xpi.fReadsDst);
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(kIDA_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::kPlus:
Brian Salomon9a514982017-02-14 10:28:22 -0500401 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700402 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
403 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
404 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
405 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
406 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
407 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
408 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
409 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400410 case SkBlendMode::kModulate:
Brian Salomon9a514982017-02-14 10:28:22 -0500411 TEST_ASSERT(xpi.fReadsDst);
bsalomon7765a472015-07-08 11:26:37 -0700412 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700413 TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType);
414 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
415 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
416 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
417 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
418 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
419 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400420 case SkBlendMode::kScreen:
Brian Salomon9a514982017-02-14 10:28:22 -0500421 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700422 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
423 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
424 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
425 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
426 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
427 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
428 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
429 break;
430 default:
431 ERRORF(reporter, "Invalid xfermode.");
432 break;
433 }
434 }
435}
436
437static void test_color_unknown_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomon92aee3d2016-12-21 09:20:25 -0500438 GrPipelineAnalysis analysis;
Brian Salomonc6b71462017-02-14 11:33:01 -0500439 analysis.fColorPOI.reset(GrPipelineInput(GrColorPackRGBA(229, 0, 154, 240)));
440 analysis.fCoveragePOI.reset(GrPipelineInput(GrColorPackA4(255)));
cdalton6fd158e2015-05-27 15:08:33 -0700441
Brian Salomon92aee3d2016-12-21 09:20:25 -0500442 SkASSERT(!analysis.fColorPOI.isOpaque());
443 SkASSERT(!analysis.fColorPOI.isSolidWhite());
444 SkASSERT(analysis.fCoveragePOI.isSolidWhite());
Brian Salomonaab259e2017-01-17 10:44:34 -0500445 SkASSERT(!analysis.fCoveragePOI.isLCDCoverage());
cdalton6fd158e2015-05-27 15:08:33 -0700446
Mike Reed7d954ad2016-10-28 15:42:34 -0400447 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
448 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon92aee3d2016-12-21 09:20:25 -0500449 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, analysis);
cdalton6fd158e2015-05-27 15:08:33 -0700450 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400451 case SkBlendMode::kClear:
Brian Salomon9a514982017-02-14 10:28:22 -0500452 TEST_ASSERT(!xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500453 TEST_ASSERT(kIgnoreColor_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700454 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
455 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
456 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
457 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
458 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
459 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
460 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400461 case SkBlendMode::kSrc:
Brian Salomon9a514982017-02-14 10:28:22 -0500462 TEST_ASSERT(!xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500463 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700464 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
465 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
466 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
467 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
468 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
469 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
470 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400471 case SkBlendMode::kDst:
Brian Salomon9a514982017-02-14 10:28:22 -0500472 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700473 TEST_ASSERT((kSkipDraw_OptFlag |
474 kIgnoreColor_OptFlag |
cdalton6fd158e2015-05-27 15:08:33 -0700475 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
476 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
477 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
478 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
479 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
480 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
481 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
482 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400483 case SkBlendMode::kSrcOver:
Brian Salomon9a514982017-02-14 10:28:22 -0500484 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500485 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700486 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
487 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
488 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
489 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
490 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
491 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
492 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400493 case SkBlendMode::kDstOver:
Brian Salomon9a514982017-02-14 10:28:22 -0500494 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500495 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700496 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
497 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
498 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
499 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
500 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
501 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
502 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400503 case SkBlendMode::kSrcIn:
Brian Salomon9a514982017-02-14 10:28:22 -0500504 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500505 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700506 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
507 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
508 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
509 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
510 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
511 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
512 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400513 case SkBlendMode::kDstIn:
Brian Salomon9a514982017-02-14 10:28:22 -0500514 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500515 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700516 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
517 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
518 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
519 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
520 TEST_ASSERT(kSA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
521 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
522 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400523 case SkBlendMode::kSrcOut:
Brian Salomon9a514982017-02-14 10:28:22 -0500524 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500525 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700526 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
527 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
528 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
529 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
530 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
531 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
532 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400533 case SkBlendMode::kDstOut:
Brian Salomon9a514982017-02-14 10:28:22 -0500534 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500535 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700536 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
537 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
538 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
539 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
540 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
541 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
542 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400543 case SkBlendMode::kSrcATop:
Brian Salomon9a514982017-02-14 10:28:22 -0500544 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500545 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700546 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
547 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
548 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
549 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
550 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
551 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
552 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400553 case SkBlendMode::kDstATop:
Brian Salomon9a514982017-02-14 10:28:22 -0500554 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500555 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700556 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
557 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
558 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
559 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
560 TEST_ASSERT(kSA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
561 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
562 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400563 case SkBlendMode::kXor:
Brian Salomon9a514982017-02-14 10:28:22 -0500564 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500565 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700566 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
567 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
568 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
569 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
570 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
571 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
572 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400573 case SkBlendMode::kPlus:
Brian Salomon9a514982017-02-14 10:28:22 -0500574 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500575 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
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(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
580 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
581 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
582 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400583 case SkBlendMode::kModulate:
Brian Salomon9a514982017-02-14 10:28:22 -0500584 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500585 TEST_ASSERT(kNone_OptFlags == 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(kSC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
591 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
592 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400593 case SkBlendMode::kScreen:
Brian Salomon9a514982017-02-14 10:28:22 -0500594 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500595 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700596 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
597 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
598 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
599 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
600 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
601 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
602 break;
603 default:
604 ERRORF(reporter, "Invalid xfermode.");
605 break;
606 }
607 }
608}
609
610static void test_color_opaque_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomon92aee3d2016-12-21 09:20:25 -0500611 GrPipelineAnalysis analysis;
Brian Salomonc6b71462017-02-14 11:33:01 -0500612 analysis.fColorPOI.reset(GrPipelineInput(GrPipelineInput::Opaque::kYes));
cdalton6fd158e2015-05-27 15:08:33 -0700613
Brian Salomon92aee3d2016-12-21 09:20:25 -0500614 SkASSERT(analysis.fColorPOI.isOpaque());
615 SkASSERT(!analysis.fColorPOI.isSolidWhite());
616 SkASSERT(!analysis.fCoveragePOI.isSolidWhite());
Brian Salomonaab259e2017-01-17 10:44:34 -0500617 SkASSERT(!analysis.fCoveragePOI.isLCDCoverage());
cdalton6fd158e2015-05-27 15:08:33 -0700618
Mike Reed7d954ad2016-10-28 15:42:34 -0400619 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
620 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon92aee3d2016-12-21 09:20:25 -0500621 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, analysis);
cdalton6fd158e2015-05-27 15:08:33 -0700622 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400623 case SkBlendMode::kClear:
Brian Salomon9a514982017-02-14 10:28:22 -0500624 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700625 TEST_ASSERT((kIgnoreColor_OptFlag) == xpi.fOptFlags);
626 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
627 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
628 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
629 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
630 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
631 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
632 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400633 case SkBlendMode::kSrc:
Brian Salomon9a514982017-02-14 10:28:22 -0500634 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700635 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
636 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
637 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
638 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
639 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
640 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
641 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
642 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400643 case SkBlendMode::kDst:
Brian Salomon9a514982017-02-14 10:28:22 -0500644 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700645 TEST_ASSERT((kSkipDraw_OptFlag |
646 kIgnoreColor_OptFlag |
cdalton6fd158e2015-05-27 15:08:33 -0700647 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
648 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
649 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
650 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
651 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
652 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
653 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
654 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400655 case SkBlendMode::kSrcOver:
Brian Salomon9a514982017-02-14 10:28:22 -0500656 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700657 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
658 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
659 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
660 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
661 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
662 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
663 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
664 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400665 case SkBlendMode::kDstOver:
Brian Salomon9a514982017-02-14 10:28:22 -0500666 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700667 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
668 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
669 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
670 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
671 TEST_ASSERT(kIDA_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::kSrcIn:
Brian Salomon9a514982017-02-14 10:28:22 -0500676 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700677 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
678 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
679 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
680 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
681 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
682 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
683 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
684 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400685 case SkBlendMode::kDstIn:
Brian Salomon9a514982017-02-14 10:28:22 -0500686 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700687 TEST_ASSERT((kSkipDraw_OptFlag |
688 kIgnoreColor_OptFlag |
cdalton6fd158e2015-05-27 15:08:33 -0700689 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
690 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::kSrcOut:
Brian Salomon9a514982017-02-14 10:28:22 -0500698 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700699 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
700 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
701 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
702 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
703 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
704 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
705 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
706 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400707 case SkBlendMode::kDstOut:
Brian Salomon9a514982017-02-14 10:28:22 -0500708 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700709 TEST_ASSERT((kIgnoreColor_OptFlag) == xpi.fOptFlags);
710 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
711 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
712 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
713 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
714 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
715 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
716 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400717 case SkBlendMode::kSrcATop:
Brian Salomon9a514982017-02-14 10:28:22 -0500718 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700719 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
720 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
721 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
722 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
723 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
724 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
725 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
726 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400727 case SkBlendMode::kDstATop:
Brian Salomon9a514982017-02-14 10:28:22 -0500728 TEST_ASSERT(xpi.fReadsDst);
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::kXor:
Brian Salomon9a514982017-02-14 10:28:22 -0500738 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700739 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
740 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
741 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
742 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
743 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
744 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
745 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
746 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400747 case SkBlendMode::kPlus:
Brian Salomon9a514982017-02-14 10:28:22 -0500748 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700749 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
750 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
751 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
752 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
753 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
754 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
755 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
756 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400757 case SkBlendMode::kModulate:
Brian Salomon9a514982017-02-14 10:28:22 -0500758 TEST_ASSERT(xpi.fReadsDst);
bsalomon7765a472015-07-08 11:26:37 -0700759 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700760 TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType);
761 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
762 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
763 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
764 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
765 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
766 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400767 case SkBlendMode::kScreen:
Brian Salomon9a514982017-02-14 10:28:22 -0500768 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700769 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
770 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
771 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
772 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
773 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
774 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
775 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
776 break;
777 default:
778 ERRORF(reporter, "Invalid xfermode.");
779 break;
780 }
781 }
782}
783
784static void test_color_opaque_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomon92aee3d2016-12-21 09:20:25 -0500785 GrPipelineAnalysis analysis;
Brian Salomonc6b71462017-02-14 11:33:01 -0500786 analysis.fColorPOI.reset(GrPipelineInput(GrPipelineInput::Opaque::kYes));
787 analysis.fCoveragePOI.reset(GrPipelineInput(GrColorPackA4(255)));
cdalton6fd158e2015-05-27 15:08:33 -0700788
Brian Salomon92aee3d2016-12-21 09:20:25 -0500789 SkASSERT(analysis.fColorPOI.isOpaque());
790 SkASSERT(!analysis.fColorPOI.isSolidWhite());
791 SkASSERT(analysis.fCoveragePOI.isSolidWhite());
Brian Salomonaab259e2017-01-17 10:44:34 -0500792 SkASSERT(!analysis.fCoveragePOI.isLCDCoverage());
cdalton6fd158e2015-05-27 15:08:33 -0700793
Mike Reed7d954ad2016-10-28 15:42:34 -0400794 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
795 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon92aee3d2016-12-21 09:20:25 -0500796 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, analysis);
cdalton6fd158e2015-05-27 15:08:33 -0700797
798 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400799 case SkBlendMode::kClear:
Brian Salomon9a514982017-02-14 10:28:22 -0500800 TEST_ASSERT(!xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500801 TEST_ASSERT(kIgnoreColor_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700802 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
803 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
804 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
805 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
806 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
807 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
808 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400809 case SkBlendMode::kSrc:
Brian Salomon9a514982017-02-14 10:28:22 -0500810 TEST_ASSERT(!xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500811 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700812 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
813 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
814 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
815 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
816 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
817 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
818 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400819 case SkBlendMode::kDst:
Brian Salomon9a514982017-02-14 10:28:22 -0500820 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700821 TEST_ASSERT((kSkipDraw_OptFlag |
822 kIgnoreColor_OptFlag |
cdalton6fd158e2015-05-27 15:08:33 -0700823 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
824 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
825 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
826 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
827 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
828 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
829 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
830 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400831 case SkBlendMode::kSrcOver:
Brian Salomon9a514982017-02-14 10:28:22 -0500832 TEST_ASSERT(!xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500833 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700834 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
835 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
836 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
837 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
838 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
839 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
840 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400841 case SkBlendMode::kDstOver:
Brian Salomon9a514982017-02-14 10:28:22 -0500842 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500843 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700844 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
845 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
846 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
847 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
848 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
849 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
850 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400851 case SkBlendMode::kSrcIn:
Brian Salomon9a514982017-02-14 10:28:22 -0500852 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500853 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700854 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
855 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
856 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
857 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
858 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
859 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
860 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400861 case SkBlendMode::kDstIn:
Brian Salomon9a514982017-02-14 10:28:22 -0500862 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700863 TEST_ASSERT((kSkipDraw_OptFlag |
864 kIgnoreColor_OptFlag |
cdalton6fd158e2015-05-27 15:08:33 -0700865 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
866 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
867 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
868 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
869 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
870 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
871 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
872 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400873 case SkBlendMode::kSrcOut:
Brian Salomon9a514982017-02-14 10:28:22 -0500874 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500875 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700876 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
877 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
878 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
879 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
880 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
881 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
882 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400883 case SkBlendMode::kDstOut:
Brian Salomon9a514982017-02-14 10:28:22 -0500884 TEST_ASSERT(!xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500885 TEST_ASSERT(kIgnoreColor_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700886 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
887 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
888 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
889 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
890 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
891 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
892 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400893 case SkBlendMode::kSrcATop:
Brian Salomon9a514982017-02-14 10:28:22 -0500894 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500895 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700896 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
897 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
898 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
899 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
900 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
901 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
902 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400903 case SkBlendMode::kDstATop:
Brian Salomon9a514982017-02-14 10:28:22 -0500904 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500905 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700906 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
907 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
908 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
909 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
910 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
911 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
912 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400913 case SkBlendMode::kXor:
Brian Salomon9a514982017-02-14 10:28:22 -0500914 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500915 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700916 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
917 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
918 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
919 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
920 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
921 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
922 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400923 case SkBlendMode::kPlus:
Brian Salomon9a514982017-02-14 10:28:22 -0500924 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500925 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
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(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
930 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
931 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
932 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400933 case SkBlendMode::kModulate:
Brian Salomon9a514982017-02-14 10:28:22 -0500934 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500935 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700936 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
937 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
938 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
939 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
940 TEST_ASSERT(kSC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
941 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
942 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400943 case SkBlendMode::kScreen:
Brian Salomon9a514982017-02-14 10:28:22 -0500944 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500945 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700946 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
947 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
948 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
949 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
950 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
951 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
952 break;
953 default:
954 ERRORF(reporter, "Invalid xfermode.");
955 break;
956 }
957 }
958}
959
egdaniel723b0502015-09-15 09:31:40 -0700960static void test_lcd_coverage_fallback_case(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomon92aee3d2016-12-21 09:20:25 -0500961 class TestLCDCoverageOp : public GrMeshDrawOp {
reed1b55a962015-09-17 20:16:13 -0700962 public:
Brian Salomon25a88092016-12-01 09:36:50 -0500963 DEFINE_OP_CLASS_ID
reed1b55a962015-09-17 20:16:13 -0700964
Brian Salomon92aee3d2016-12-21 09:20:25 -0500965 TestLCDCoverageOp() : INHERITED(ClassID()) {}
cdalton6fd158e2015-05-27 15:08:33 -0700966
Brian Salomon09d994e2016-12-21 11:14:46 -0500967 const char* name() const override { return "Test LCD Text Op"; }
Brian Salomon92aee3d2016-12-21 09:20:25 -0500968
969 private:
970 void getPipelineAnalysisInput(GrPipelineAnalysisDrawOpInput* input) const override {
Brian Salomonc6b71462017-02-14 11:33:01 -0500971 input->pipelineColorInput()->setToConstant(GrColorPackRGBA(123, 45, 67, 221));
972 input->pipelineCoverageInput()->setToLCDCoverage();
Brian Salomon92aee3d2016-12-21 09:20:25 -0500973 }
974
975 void applyPipelineOptimizations(const GrPipelineOptimizations&) override {}
Brian Salomon25a88092016-12-01 09:36:50 -0500976 bool onCombineIfPossible(GrOp*, const GrCaps&) override { return false; }
Mike Kleinfc6c37b2016-09-27 09:34:10 -0400977 void onPrepareDraws(Target*) const override {}
cdalton6fd158e2015-05-27 15:08:33 -0700978
Brian Salomondad29232016-12-01 16:40:24 -0500979 typedef GrMeshDrawOp INHERITED;
Brian Salomon92aee3d2016-12-21 09:20:25 -0500980 } testLCDCoverageOp;
cdalton6fd158e2015-05-27 15:08:33 -0700981
Brian Salomon92aee3d2016-12-21 09:20:25 -0500982 GrPipelineAnalysis analysis;
983 testLCDCoverageOp.initPipelineAnalysis(&analysis);
984 GrProcOptInfo colorPOI = analysis.fColorPOI;
985 GrProcOptInfo covPOI = analysis.fCoveragePOI;
Brian Salomoneec6f7b2017-02-10 14:29:38 -0500986 // Prevent unused var warnings in release.
987 (void)colorPOI;
988 (void)covPOI;
cdalton6fd158e2015-05-27 15:08:33 -0700989
Brian Salomoneec6f7b2017-02-10 14:29:38 -0500990 SkASSERT(colorPOI.hasKnownOutputColor());
Brian Salomonaab259e2017-01-17 10:44:34 -0500991 SkASSERT(covPOI.isLCDCoverage());
cdalton6fd158e2015-05-27 15:08:33 -0700992
Brian Salomona1633922017-01-09 11:46:10 -0500993 const GrXPFactory* xpf = GrPorterDuffXPFactory::Get(SkBlendMode::kSrcOver);
Brian Salomon92aee3d2016-12-21 09:20:25 -0500994 TEST_ASSERT(!xpf->willNeedDstTexture(caps, analysis));
cdalton6fd158e2015-05-27 15:08:33 -0700995
Brian Salomon92aee3d2016-12-21 09:20:25 -0500996 sk_sp<GrXferProcessor> xp(xpf->createXferProcessor(analysis, false, nullptr, caps));
cdalton6fd158e2015-05-27 15:08:33 -0700997 if (!xp) {
998 ERRORF(reporter, "Failed to create an XP with LCD coverage.");
999 return;
1000 }
1001
Brian Salomon9a514982017-02-14 10:28:22 -05001002 TEST_ASSERT(GrXPFactory::WillReadDst(xpf, colorPOI, covPOI));
cdalton6fd158e2015-05-27 15:08:33 -07001003
1004 GrColor overrideColor;
Brian Salomon92aee3d2016-12-21 09:20:25 -05001005 xp->getOptimizations(analysis, false, &overrideColor, caps);
cdalton6fd158e2015-05-27 15:08:33 -07001006
1007 GrXferProcessor::BlendInfo blendInfo;
1008 xp->getBlendInfo(&blendInfo);
1009 TEST_ASSERT(blendInfo.fWriteColor);
1010}
1011
kkinnunen15302832015-12-01 04:35:26 -08001012DEF_GPUTEST(PorterDuffNoDualSourceBlending, reporter, /*factory*/) {
cdalton6fd158e2015-05-27 15:08:33 -07001013 GrContextOptions opts;
1014 opts.fSuppressDualSourceBlending = true;
bsalomon3724e572016-03-30 18:56:19 -07001015 sk_gpu_test::GrContextFactory mockFactory(opts);
bsalomon85b4b532016-04-05 11:06:27 -07001016 GrContext* ctx = mockFactory.get(sk_gpu_test::GrContextFactory::kNullGL_ContextType);
cdalton6fd158e2015-05-27 15:08:33 -07001017 if (!ctx) {
1018 SkFAIL("Failed to create null context without ARB_blend_func_extended.");
1019 return;
1020 }
1021
bsalomon76228632015-05-29 08:02:10 -07001022 const GrCaps& caps = *ctx->caps();
cdalton6fd158e2015-05-27 15:08:33 -07001023 if (caps.shaderCaps()->dualSourceBlendingSupport()) {
1024 SkFAIL("Null context failed to honor request for no ARB_blend_func_extended.");
1025 return;
1026 }
1027
bsalomon091f60c2015-11-10 11:54:56 -08001028 GrBackendObject backendTex =
bungeman6bd52842016-10-27 09:30:08 -07001029 ctx->getGpu()->createTestingOnlyBackendTexture(nullptr, 100, 100, kRGBA_8888_GrPixelConfig);
cdalton6fd158e2015-05-27 15:08:33 -07001030 GrBackendTextureDesc fakeDesc;
1031 fakeDesc.fConfig = kRGBA_8888_GrPixelConfig;
1032 fakeDesc.fWidth = fakeDesc.fHeight = 100;
bsalomon091f60c2015-11-10 11:54:56 -08001033 fakeDesc.fTextureHandle = backendTex;
cdalton6fd158e2015-05-27 15:08:33 -07001034 GrXferProcessor::DstTexture fakeDstTexture;
bungeman6bd52842016-10-27 09:30:08 -07001035 fakeDstTexture.setTexture(
1036 ctx->textureProvider()->wrapBackendTexture(fakeDesc, kBorrow_GrWrapOwnership));
cdalton6fd158e2015-05-27 15:08:33 -07001037
Brian Salomonc6b71462017-02-14 11:33:01 -05001038 static const GrPipelineInput colorInputs[] = {GrPipelineInput(),
1039 GrPipelineInput(GrPipelineInput::Opaque::kYes),
1040 GrPipelineInput(GrColorPackRGBA(0, 82, 17, 100)),
1041 GrPipelineInput(GrColorPackRGBA(0, 82, 17, 255))};
cdalton6fd158e2015-05-27 15:08:33 -07001042
Brian Salomonc6b71462017-02-14 11:33:01 -05001043 for (const auto& colorInput : colorInputs) {
Brian Salomon92aee3d2016-12-21 09:20:25 -05001044 GrPipelineAnalysis analysis;
Brian Salomonc6b71462017-02-14 11:33:01 -05001045 analysis.fColorPOI = colorInput;
1046 for (bool fractionalCoverage : {true, false}) {
1047 if (!fractionalCoverage) {
1048 analysis.fCoveragePOI.reset(GrPipelineInput(GrColorPackA4(255)));
cdalton6fd158e2015-05-27 15:08:33 -07001049 }
Mike Reed7d954ad2016-10-28 15:42:34 -04001050 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
1051 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomona1633922017-01-09 11:46:10 -05001052 const GrXPFactory* xpf = GrPorterDuffXPFactory::Get(xfermode);
cdalton86ae0a92015-06-08 15:11:04 -07001053 GrXferProcessor::DstTexture* dstTexture =
Brian Salomon92aee3d2016-12-21 09:20:25 -05001054 xpf->willNeedDstTexture(caps, analysis) ? &fakeDstTexture : 0;
Hal Canary342b7ac2016-11-04 11:49:42 -04001055 sk_sp<GrXferProcessor> xp(
Brian Salomon92aee3d2016-12-21 09:20:25 -05001056 xpf->createXferProcessor(analysis, false, dstTexture, caps));
cdalton6fd158e2015-05-27 15:08:33 -07001057 if (!xp) {
1058 ERRORF(reporter, "Failed to create an XP without dual source blending.");
1059 return;
1060 }
1061 TEST_ASSERT(!xp->hasSecondaryOutput());
Brian Salomonbfd51832017-01-04 13:22:08 -05001062 GrColor ignoredOverrideColor;
1063 xp->getOptimizations(analysis, false, &ignoredOverrideColor, caps);
cdalton6fd158e2015-05-27 15:08:33 -07001064 TEST_ASSERT(!xp->hasSecondaryOutput());
1065 }
1066 }
1067 }
bsalomon091f60c2015-11-10 11:54:56 -08001068 ctx->getGpu()->deleteTestingOnlyBackendTexture(backendTex);
cdalton6fd158e2015-05-27 15:08:33 -07001069}
1070
1071#endif