blob: 6ef05d95eda1937c0a40c53e1e711c0e76f2e76e [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 Salomon92aee3d2016-12-21 09:20:25 -050071 sk_sp<GrXferProcessor> xp(xpf->createXferProcessor(analysis, false, nullptr, caps));
72 TEST_ASSERT(!xpf->willNeedDstTexture(caps, analysis));
73 xpf->getInvariantBlendedColor(analysis.fColorPOI, &fBlendedColor);
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
cdalton1fa45722015-06-02 10:43:39 -070082 GrXPFactory::InvariantBlendedColor fBlendedColor;
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 analysis.fColorPOI.reset(0, kNone_GrColorComponentFlags);
97 // Setting the last argument to true will force covPOI to LCD coverage.
98 analysis.fCoveragePOI.resetToLCDCoverage(0, kNone_GrColorComponentFlags);
egdaniel723b0502015-09-15 09:31:40 -070099
Brian Salomon92aee3d2016-12-21 09:20:25 -0500100 SkASSERT(!analysis.fColorPOI.isOpaque());
101 SkASSERT(!analysis.fColorPOI.isSolidWhite());
102 SkASSERT(!analysis.fCoveragePOI.isSolidWhite());
Brian Salomonaab259e2017-01-17 10:44:34 -0500103 SkASSERT(analysis.fCoveragePOI.isLCDCoverage());
egdaniel723b0502015-09-15 09:31:40 -0700104
Mike Reed7d954ad2016-10-28 15:42:34 -0400105 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
106 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon92aee3d2016-12-21 09:20:25 -0500107 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, analysis);
egdaniel723b0502015-09-15 09:31:40 -0700108
109 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400110 case SkBlendMode::kClear:
egdaniel723b0502015-09-15 09:31:40 -0700111 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst);
112 TEST_ASSERT(0 == xpi.fBlendedColor.fKnownColor);
113 TEST_ASSERT(kRGBA_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
114 TEST_ASSERT((kIgnoreColor_OptFlag) == xpi.fOptFlags);
115 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
116 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
117 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
118 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
119 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
120 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
121 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400122 case SkBlendMode::kSrc:
egdaniel723b0502015-09-15 09:31:40 -0700123 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst);
124 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
125 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
126 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
127 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
128 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
129 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
130 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
131 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
132 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400133 case SkBlendMode::kDst:
egdaniel723b0502015-09-15 09:31:40 -0700134 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
135 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
136 TEST_ASSERT((kSkipDraw_OptFlag |
137 kIgnoreColor_OptFlag |
egdaniel723b0502015-09-15 09:31:40 -0700138 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
139 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
140 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
141 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
142 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
143 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
144 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
145 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400146 case SkBlendMode::kSrcOver:
egdaniel723b0502015-09-15 09:31:40 -0700147 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
148 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
149 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
150 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
151 TEST_ASSERT(kSAModulate_OutputType == xpi.fSecondaryOutputType);
152 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
153 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
154 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
155 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
156 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400157 case SkBlendMode::kDstOver:
egdaniel723b0502015-09-15 09:31:40 -0700158 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
159 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
160 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
161 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
162 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
163 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
164 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
165 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
166 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
167 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400168 case SkBlendMode::kSrcIn:
egdaniel723b0502015-09-15 09:31:40 -0700169 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
170 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
171 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
172 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
173 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
174 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
175 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
176 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
177 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
178 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400179 case SkBlendMode::kDstIn:
egdaniel723b0502015-09-15 09:31:40 -0700180 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
181 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
182 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
183 TEST_ASSERT(kISAModulate_OutputType == xpi.fPrimaryOutputType);
184 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
185 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
186 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
187 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
188 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
189 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400190 case SkBlendMode::kSrcOut:
egdaniel723b0502015-09-15 09:31:40 -0700191 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
192 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
193 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
194 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
195 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
196 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
197 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
198 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
199 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
200 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400201 case SkBlendMode::kDstOut:
egdaniel723b0502015-09-15 09:31:40 -0700202 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
203 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
204 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
205 TEST_ASSERT(kSAModulate_OutputType == xpi.fPrimaryOutputType);
206 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
207 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
208 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
209 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
210 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
211 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400212 case SkBlendMode::kSrcATop:
egdaniel723b0502015-09-15 09:31:40 -0700213 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
214 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
215 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
216 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
217 TEST_ASSERT(kSAModulate_OutputType == xpi.fSecondaryOutputType);
218 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
219 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
220 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
221 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
222 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400223 case SkBlendMode::kDstATop:
egdaniel723b0502015-09-15 09:31:40 -0700224 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
225 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
226 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
227 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
228 TEST_ASSERT(kISAModulate_OutputType == xpi.fSecondaryOutputType);
229 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
230 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
231 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
232 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
233 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400234 case SkBlendMode::kXor:
egdaniel723b0502015-09-15 09:31:40 -0700235 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
236 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
237 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
238 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
239 TEST_ASSERT(kSAModulate_OutputType == xpi.fSecondaryOutputType);
240 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
241 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
242 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
243 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
244 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400245 case SkBlendMode::kPlus:
egdaniel723b0502015-09-15 09:31:40 -0700246 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
247 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
248 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
249 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
250 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
251 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
252 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
253 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
254 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
255 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400256 case SkBlendMode::kModulate:
egdaniel723b0502015-09-15 09:31:40 -0700257 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
258 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
259 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
260 TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType);
261 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
262 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
263 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
264 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
265 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
266 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400267 case SkBlendMode::kScreen:
egdaniel723b0502015-09-15 09:31:40 -0700268 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
269 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
270 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
271 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
272 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
273 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
274 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
275 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
276 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
277 break;
278 default:
279 ERRORF(reporter, "Invalid xfermode.");
280 break;
281 }
282 }
283}
cdalton6fd158e2015-05-27 15:08:33 -0700284static void test_color_unknown_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomon92aee3d2016-12-21 09:20:25 -0500285 GrPipelineAnalysis analysis;
Brian Salomonaab259e2017-01-17 10:44:34 -0500286 analysis.fColorPOI.reset(0, kNone_GrColorComponentFlags);
287 analysis.fCoveragePOI.reset(0, kNone_GrColorComponentFlags);
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);
egdaniel723b0502015-09-15 09:31:40 -0700297
cdalton6fd158e2015-05-27 15:08:33 -0700298 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400299 case SkBlendMode::kClear:
cdalton1fa45722015-06-02 10:43:39 -0700300 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst);
301 TEST_ASSERT(0 == xpi.fBlendedColor.fKnownColor);
302 TEST_ASSERT(kRGBA_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700303 TEST_ASSERT((kIgnoreColor_OptFlag) == xpi.fOptFlags);
304 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
305 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
306 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
307 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
308 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
309 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
310 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400311 case SkBlendMode::kSrc:
cdalton1fa45722015-06-02 10:43:39 -0700312 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst);
313 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
bsalomon7765a472015-07-08 11:26:37 -0700314 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700315 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
316 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
317 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
318 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
319 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
320 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
321 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400322 case SkBlendMode::kDst:
cdalton1fa45722015-06-02 10:43:39 -0700323 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
324 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700325 TEST_ASSERT((kSkipDraw_OptFlag |
326 kIgnoreColor_OptFlag |
cdalton6fd158e2015-05-27 15:08:33 -0700327 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
328 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
329 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
330 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
331 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
332 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
333 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
334 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400335 case SkBlendMode::kSrcOver:
cdalton1fa45722015-06-02 10:43:39 -0700336 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
337 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700338 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
339 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
340 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
341 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
342 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
343 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
344 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
345 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400346 case SkBlendMode::kDstOver:
cdalton1fa45722015-06-02 10:43:39 -0700347 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
348 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700349 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
350 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
351 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
352 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
353 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
354 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
355 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
356 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400357 case SkBlendMode::kSrcIn:
cdalton1fa45722015-06-02 10:43:39 -0700358 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
359 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
bsalomon7765a472015-07-08 11:26:37 -0700360 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700361 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
362 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
363 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
364 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
365 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
366 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
367 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400368 case SkBlendMode::kDstIn:
cdalton1fa45722015-06-02 10:43:39 -0700369 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
370 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
bsalomon7765a472015-07-08 11:26:37 -0700371 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700372 TEST_ASSERT(kISAModulate_OutputType == xpi.fPrimaryOutputType);
373 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
374 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
375 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
376 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
377 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
378 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400379 case SkBlendMode::kSrcOut:
cdalton1fa45722015-06-02 10:43:39 -0700380 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
381 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
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(kCoverage_OutputType == xpi.fSecondaryOutputType);
385 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
386 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
387 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
388 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
389 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400390 case SkBlendMode::kDstOut:
cdalton1fa45722015-06-02 10:43:39 -0700391 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
392 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700393 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
394 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
395 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
396 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
397 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
398 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
399 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
400 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400401 case SkBlendMode::kSrcATop:
cdalton1fa45722015-06-02 10:43:39 -0700402 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
403 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700404 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
405 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
406 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
407 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
408 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
409 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
410 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
411 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400412 case SkBlendMode::kDstATop:
cdalton1fa45722015-06-02 10:43:39 -0700413 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
414 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
bsalomon7765a472015-07-08 11:26:37 -0700415 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700416 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
417 TEST_ASSERT(kISAModulate_OutputType == xpi.fSecondaryOutputType);
418 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
419 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
420 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
421 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
422 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400423 case SkBlendMode::kXor:
cdalton1fa45722015-06-02 10:43:39 -0700424 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
425 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700426 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
427 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
428 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
429 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
430 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
431 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
432 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
433 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400434 case SkBlendMode::kPlus:
cdalton1fa45722015-06-02 10:43:39 -0700435 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
436 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700437 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
438 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
439 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
440 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
441 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
442 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
443 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
444 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400445 case SkBlendMode::kModulate:
cdalton1fa45722015-06-02 10:43:39 -0700446 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
447 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
bsalomon7765a472015-07-08 11:26:37 -0700448 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700449 TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType);
450 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
451 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
452 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
453 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
454 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
455 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400456 case SkBlendMode::kScreen:
cdalton1fa45722015-06-02 10:43:39 -0700457 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
458 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700459 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
460 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
461 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
462 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
463 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
464 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
465 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
466 break;
467 default:
468 ERRORF(reporter, "Invalid xfermode.");
469 break;
470 }
471 }
472}
473
474static void test_color_unknown_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomon92aee3d2016-12-21 09:20:25 -0500475 GrPipelineAnalysis analysis;
Brian Salomonaab259e2017-01-17 10:44:34 -0500476 analysis.fColorPOI.reset(GrColorPackRGBA(229, 0, 154, 0),
477 kR_GrColorComponentFlag | kB_GrColorComponentFlag);
478 analysis.fCoveragePOI.reset(GrColorPackA4(255), kRGBA_GrColorComponentFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700479
Brian Salomon92aee3d2016-12-21 09:20:25 -0500480 SkASSERT(!analysis.fColorPOI.isOpaque());
481 SkASSERT(!analysis.fColorPOI.isSolidWhite());
482 SkASSERT(analysis.fCoveragePOI.isSolidWhite());
Brian Salomonaab259e2017-01-17 10:44:34 -0500483 SkASSERT(!analysis.fCoveragePOI.isLCDCoverage());
cdalton6fd158e2015-05-27 15:08:33 -0700484
Mike Reed7d954ad2016-10-28 15:42:34 -0400485 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
486 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon92aee3d2016-12-21 09:20:25 -0500487 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, analysis);
cdalton6fd158e2015-05-27 15:08:33 -0700488
489 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400490 case SkBlendMode::kClear:
cdalton1fa45722015-06-02 10:43:39 -0700491 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst);
492 TEST_ASSERT(0 == xpi.fBlendedColor.fKnownColor);
493 TEST_ASSERT(kRGBA_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -0500494 TEST_ASSERT(kIgnoreColor_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700495 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
496 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
497 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
498 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
499 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
500 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
501 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400502 case SkBlendMode::kSrc:
cdalton1fa45722015-06-02 10:43:39 -0700503 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst);
504 TEST_ASSERT(229 == GrColorUnpackR(xpi.fBlendedColor.fKnownColor));
505 TEST_ASSERT(154 == GrColorUnpackB(xpi.fBlendedColor.fKnownColor));
cdalton6fd158e2015-05-27 15:08:33 -0700506 TEST_ASSERT((kR_GrColorComponentFlag |
cdalton1fa45722015-06-02 10:43:39 -0700507 kB_GrColorComponentFlag) == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -0500508 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700509 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
510 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
511 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
512 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
513 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
514 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
515 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400516 case SkBlendMode::kDst:
cdalton1fa45722015-06-02 10:43:39 -0700517 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
518 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700519 TEST_ASSERT((kSkipDraw_OptFlag |
520 kIgnoreColor_OptFlag |
cdalton6fd158e2015-05-27 15:08:33 -0700521 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
522 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
523 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
524 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
525 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
526 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
527 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
528 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400529 case SkBlendMode::kSrcOver:
cdalton1fa45722015-06-02 10:43:39 -0700530 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
531 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -0500532 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700533 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
534 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
535 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
536 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
537 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
538 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
539 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400540 case SkBlendMode::kDstOver:
cdalton1fa45722015-06-02 10:43:39 -0700541 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
542 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -0500543 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700544 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
545 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
546 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
547 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
548 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
549 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
550 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400551 case SkBlendMode::kSrcIn:
cdalton1fa45722015-06-02 10:43:39 -0700552 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
553 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -0500554 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700555 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
556 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
557 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
558 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
559 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
560 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
561 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400562 case SkBlendMode::kDstIn:
cdalton1fa45722015-06-02 10:43:39 -0700563 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
564 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -0500565 TEST_ASSERT(kNone_OptFlags == 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(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
570 TEST_ASSERT(kSA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
571 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
572 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400573 case SkBlendMode::kSrcOut:
cdalton1fa45722015-06-02 10:43:39 -0700574 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
575 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -0500576 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700577 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
578 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
579 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
580 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
581 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
582 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
583 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400584 case SkBlendMode::kDstOut:
cdalton1fa45722015-06-02 10:43:39 -0700585 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
586 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -0500587 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700588 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
589 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
590 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
591 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
592 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
593 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
594 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400595 case SkBlendMode::kSrcATop:
cdalton1fa45722015-06-02 10:43:39 -0700596 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
597 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -0500598 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700599 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
600 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
601 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
602 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
603 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
604 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
605 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400606 case SkBlendMode::kDstATop:
cdalton1fa45722015-06-02 10:43:39 -0700607 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
608 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -0500609 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700610 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
611 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
612 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
613 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
614 TEST_ASSERT(kSA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
615 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
616 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400617 case SkBlendMode::kXor:
cdalton1fa45722015-06-02 10:43:39 -0700618 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
619 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -0500620 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700621 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
622 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
623 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
624 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
625 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
626 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
627 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400628 case SkBlendMode::kPlus:
cdalton1fa45722015-06-02 10:43:39 -0700629 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
630 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -0500631 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700632 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
633 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
634 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
635 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
636 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
637 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
638 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400639 case SkBlendMode::kModulate:
cdalton1fa45722015-06-02 10:43:39 -0700640 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
641 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -0500642 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700643 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
644 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
645 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
646 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
647 TEST_ASSERT(kSC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
648 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
649 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400650 case SkBlendMode::kScreen:
cdalton1fa45722015-06-02 10:43:39 -0700651 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
652 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -0500653 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700654 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
655 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
656 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
657 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
658 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
659 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
660 break;
661 default:
662 ERRORF(reporter, "Invalid xfermode.");
663 break;
664 }
665 }
666}
667
668static void test_color_opaque_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomon92aee3d2016-12-21 09:20:25 -0500669 GrPipelineAnalysis analysis;
Brian Salomonaab259e2017-01-17 10:44:34 -0500670 analysis.fColorPOI.reset(GrColorPackA4(255), kA_GrColorComponentFlag);
671 analysis.fCoveragePOI.reset(0, kNone_GrColorComponentFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700672
Brian Salomon92aee3d2016-12-21 09:20:25 -0500673 SkASSERT(analysis.fColorPOI.isOpaque());
674 SkASSERT(!analysis.fColorPOI.isSolidWhite());
675 SkASSERT(!analysis.fCoveragePOI.isSolidWhite());
Brian Salomonaab259e2017-01-17 10:44:34 -0500676 SkASSERT(!analysis.fCoveragePOI.isLCDCoverage());
cdalton6fd158e2015-05-27 15:08:33 -0700677
Mike Reed7d954ad2016-10-28 15:42:34 -0400678 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
679 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon92aee3d2016-12-21 09:20:25 -0500680 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, analysis);
cdalton6fd158e2015-05-27 15:08:33 -0700681
682 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400683 case SkBlendMode::kClear:
cdalton1fa45722015-06-02 10:43:39 -0700684 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst);
685 TEST_ASSERT(0 == xpi.fBlendedColor.fKnownColor);
686 TEST_ASSERT(kRGBA_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700687 TEST_ASSERT((kIgnoreColor_OptFlag) == xpi.fOptFlags);
688 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
689 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
690 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
691 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
692 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
693 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
694 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400695 case SkBlendMode::kSrc:
cdalton1fa45722015-06-02 10:43:39 -0700696 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst);
697 TEST_ASSERT(255 == GrColorUnpackA(xpi.fBlendedColor.fKnownColor));
698 TEST_ASSERT(kA_GrColorComponentFlag == xpi.fBlendedColor.fKnownColorFlags);
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(kOne_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::kDst:
cdalton1fa45722015-06-02 10:43:39 -0700708 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
709 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700710 TEST_ASSERT((kSkipDraw_OptFlag |
711 kIgnoreColor_OptFlag |
cdalton6fd158e2015-05-27 15:08:33 -0700712 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
713 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
714 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
715 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
716 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
717 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
718 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
719 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400720 case SkBlendMode::kSrcOver:
cdalton1fa45722015-06-02 10:43:39 -0700721 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst);
722 TEST_ASSERT(255 == GrColorUnpackA(xpi.fBlendedColor.fKnownColor));
723 TEST_ASSERT(kA_GrColorComponentFlag == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700724 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
725 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
726 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
727 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
728 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
729 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
730 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
731 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400732 case SkBlendMode::kDstOver:
cdalton1fa45722015-06-02 10:43:39 -0700733 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
734 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700735 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
736 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
737 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
738 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
739 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
740 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
741 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
742 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400743 case SkBlendMode::kSrcIn:
cdalton1fa45722015-06-02 10:43:39 -0700744 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
745 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700746 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
747 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
748 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
749 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
750 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
751 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
752 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
753 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400754 case SkBlendMode::kDstIn:
cdalton1fa45722015-06-02 10:43:39 -0700755 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
756 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700757 TEST_ASSERT((kSkipDraw_OptFlag |
758 kIgnoreColor_OptFlag |
cdalton6fd158e2015-05-27 15:08:33 -0700759 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
760 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
761 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
762 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
763 TEST_ASSERT(kZero_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::kSrcOut:
cdalton1fa45722015-06-02 10:43:39 -0700768 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
769 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700770 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
771 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
772 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
773 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
774 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
775 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
776 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
777 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400778 case SkBlendMode::kDstOut:
cdalton1fa45722015-06-02 10:43:39 -0700779 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst);
780 TEST_ASSERT(0 == xpi.fBlendedColor.fKnownColor);
781 TEST_ASSERT(kRGBA_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700782 TEST_ASSERT((kIgnoreColor_OptFlag) == xpi.fOptFlags);
783 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
784 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
785 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
786 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
787 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
788 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
789 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400790 case SkBlendMode::kSrcATop:
cdalton1fa45722015-06-02 10:43:39 -0700791 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
792 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700793 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
794 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
795 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
796 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
797 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
798 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
799 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
800 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400801 case SkBlendMode::kDstATop:
cdalton1fa45722015-06-02 10:43:39 -0700802 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
803 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700804 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
805 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
806 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
807 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
808 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
809 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
810 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
811 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400812 case SkBlendMode::kXor:
cdalton1fa45722015-06-02 10:43:39 -0700813 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
814 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700815 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
816 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
817 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
818 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
819 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
820 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
821 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
822 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400823 case SkBlendMode::kPlus:
cdalton1fa45722015-06-02 10:43:39 -0700824 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
825 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700826 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
827 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
828 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
829 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
830 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
831 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
832 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
833 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400834 case SkBlendMode::kModulate:
cdalton1fa45722015-06-02 10:43:39 -0700835 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
836 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
bsalomon7765a472015-07-08 11:26:37 -0700837 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700838 TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType);
839 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
840 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
841 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
842 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
843 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
844 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400845 case SkBlendMode::kScreen:
cdalton1fa45722015-06-02 10:43:39 -0700846 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
847 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700848 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
849 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
850 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
851 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
852 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
853 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
854 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
855 break;
856 default:
857 ERRORF(reporter, "Invalid xfermode.");
858 break;
859 }
860 }
861}
862
863static void test_color_opaque_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomon92aee3d2016-12-21 09:20:25 -0500864 GrPipelineAnalysis analysis;
Brian Salomonaab259e2017-01-17 10:44:34 -0500865 analysis.fColorPOI.reset(GrColorPackRGBA(0, 82, 0, 255),
866 kG_GrColorComponentFlag | kA_GrColorComponentFlag);
867 analysis.fCoveragePOI.reset(GrColorPackA4(255), kRGBA_GrColorComponentFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700868
Brian Salomon92aee3d2016-12-21 09:20:25 -0500869 SkASSERT(analysis.fColorPOI.isOpaque());
870 SkASSERT(!analysis.fColorPOI.isSolidWhite());
871 SkASSERT(analysis.fCoveragePOI.isSolidWhite());
Brian Salomonaab259e2017-01-17 10:44:34 -0500872 SkASSERT(!analysis.fCoveragePOI.isLCDCoverage());
cdalton6fd158e2015-05-27 15:08:33 -0700873
Mike Reed7d954ad2016-10-28 15:42:34 -0400874 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
875 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon92aee3d2016-12-21 09:20:25 -0500876 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, analysis);
cdalton6fd158e2015-05-27 15:08:33 -0700877
878 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400879 case SkBlendMode::kClear:
cdalton1fa45722015-06-02 10:43:39 -0700880 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst);
881 TEST_ASSERT(0 == xpi.fBlendedColor.fKnownColor);
882 TEST_ASSERT(kRGBA_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -0500883 TEST_ASSERT(kIgnoreColor_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700884 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
885 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
886 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
887 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
888 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
889 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
890 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400891 case SkBlendMode::kSrc:
cdalton1fa45722015-06-02 10:43:39 -0700892 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst);
893 TEST_ASSERT(82 == GrColorUnpackG(xpi.fBlendedColor.fKnownColor));
894 TEST_ASSERT(255 == GrColorUnpackA(xpi.fBlendedColor.fKnownColor));
cdalton6fd158e2015-05-27 15:08:33 -0700895 TEST_ASSERT((kG_GrColorComponentFlag |
cdalton1fa45722015-06-02 10:43:39 -0700896 kA_GrColorComponentFlag) == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -0500897 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700898 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
899 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
900 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
901 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
902 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
903 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
904 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400905 case SkBlendMode::kDst:
cdalton1fa45722015-06-02 10:43:39 -0700906 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
907 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700908 TEST_ASSERT((kSkipDraw_OptFlag |
909 kIgnoreColor_OptFlag |
cdalton6fd158e2015-05-27 15:08:33 -0700910 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
911 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
912 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
913 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
914 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
915 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
916 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
917 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400918 case SkBlendMode::kSrcOver:
cdalton1fa45722015-06-02 10:43:39 -0700919 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst);
920 TEST_ASSERT(82 == GrColorUnpackG(xpi.fBlendedColor.fKnownColor));
921 TEST_ASSERT(255 == GrColorUnpackA(xpi.fBlendedColor.fKnownColor));
cdalton6fd158e2015-05-27 15:08:33 -0700922 TEST_ASSERT((kG_GrColorComponentFlag |
cdalton1fa45722015-06-02 10:43:39 -0700923 kA_GrColorComponentFlag) == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -0500924 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700925 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
926 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
927 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
928 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
929 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
930 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
931 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400932 case SkBlendMode::kDstOver:
cdalton1fa45722015-06-02 10:43:39 -0700933 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
934 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -0500935 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == 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(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
940 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
941 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
942 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400943 case SkBlendMode::kSrcIn:
cdalton1fa45722015-06-02 10:43:39 -0700944 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
945 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -0500946 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700947 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
948 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
949 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
950 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
951 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
952 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
953 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400954 case SkBlendMode::kDstIn:
cdalton1fa45722015-06-02 10:43:39 -0700955 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
956 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700957 TEST_ASSERT((kSkipDraw_OptFlag |
958 kIgnoreColor_OptFlag |
cdalton6fd158e2015-05-27 15:08:33 -0700959 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
960 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
961 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
962 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
963 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
964 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
965 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
966 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400967 case SkBlendMode::kSrcOut:
cdalton1fa45722015-06-02 10:43:39 -0700968 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
969 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -0500970 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700971 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
972 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
973 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
974 TEST_ASSERT(kIDA_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::kDstOut:
cdalton1fa45722015-06-02 10:43:39 -0700979 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst);
980 TEST_ASSERT(0 == xpi.fBlendedColor.fKnownColor);
981 TEST_ASSERT(kRGBA_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -0500982 TEST_ASSERT(kIgnoreColor_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700983 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
984 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
985 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
986 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
987 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
988 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
989 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400990 case SkBlendMode::kSrcATop:
cdalton1fa45722015-06-02 10:43:39 -0700991 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
992 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -0500993 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700994 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
995 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
996 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
997 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
998 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
999 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
1000 break;
Mike Reed7d954ad2016-10-28 15:42:34 -04001001 case SkBlendMode::kDstATop:
cdalton1fa45722015-06-02 10:43:39 -07001002 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
1003 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -05001004 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -07001005 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
1006 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
1007 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
1008 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
1009 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
1010 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
1011 break;
Mike Reed7d954ad2016-10-28 15:42:34 -04001012 case SkBlendMode::kXor:
cdalton1fa45722015-06-02 10:43:39 -07001013 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
1014 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -05001015 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -07001016 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
1017 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
1018 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
1019 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
1020 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
1021 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
1022 break;
Mike Reed7d954ad2016-10-28 15:42:34 -04001023 case SkBlendMode::kPlus:
cdalton1fa45722015-06-02 10:43:39 -07001024 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
1025 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -05001026 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -07001027 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
1028 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
1029 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
1030 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
1031 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
1032 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
1033 break;
Mike Reed7d954ad2016-10-28 15:42:34 -04001034 case SkBlendMode::kModulate:
cdalton1fa45722015-06-02 10:43:39 -07001035 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
1036 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -05001037 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -07001038 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
1039 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
1040 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
1041 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
1042 TEST_ASSERT(kSC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
1043 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
1044 break;
Mike Reed7d954ad2016-10-28 15:42:34 -04001045 case SkBlendMode::kScreen:
cdalton1fa45722015-06-02 10:43:39 -07001046 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
1047 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -05001048 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -07001049 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
1050 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
1051 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
1052 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
1053 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
1054 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
1055 break;
1056 default:
1057 ERRORF(reporter, "Invalid xfermode.");
1058 break;
1059 }
1060 }
1061}
1062
egdaniel723b0502015-09-15 09:31:40 -07001063static void test_lcd_coverage_fallback_case(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomon92aee3d2016-12-21 09:20:25 -05001064 class TestLCDCoverageOp : public GrMeshDrawOp {
reed1b55a962015-09-17 20:16:13 -07001065 public:
Brian Salomon25a88092016-12-01 09:36:50 -05001066 DEFINE_OP_CLASS_ID
reed1b55a962015-09-17 20:16:13 -07001067
Brian Salomon92aee3d2016-12-21 09:20:25 -05001068 TestLCDCoverageOp() : INHERITED(ClassID()) {}
cdalton6fd158e2015-05-27 15:08:33 -07001069
Brian Salomon09d994e2016-12-21 11:14:46 -05001070 const char* name() const override { return "Test LCD Text Op"; }
Brian Salomon92aee3d2016-12-21 09:20:25 -05001071
1072 private:
1073 void getPipelineAnalysisInput(GrPipelineAnalysisDrawOpInput* input) const override {
1074 input->pipelineColorInput()->setKnownFourComponents(GrColorPackRGBA(123, 45, 67, 221));
1075 input->pipelineCoverageInput()->setUnknownFourComponents();
1076 input->pipelineCoverageInput()->setUsingLCDCoverage();
1077 }
1078
1079 void applyPipelineOptimizations(const GrPipelineOptimizations&) override {}
Brian Salomon25a88092016-12-01 09:36:50 -05001080 bool onCombineIfPossible(GrOp*, const GrCaps&) override { return false; }
Mike Kleinfc6c37b2016-09-27 09:34:10 -04001081 void onPrepareDraws(Target*) const override {}
cdalton6fd158e2015-05-27 15:08:33 -07001082
Brian Salomondad29232016-12-01 16:40:24 -05001083 typedef GrMeshDrawOp INHERITED;
Brian Salomon92aee3d2016-12-21 09:20:25 -05001084 } testLCDCoverageOp;
cdalton6fd158e2015-05-27 15:08:33 -07001085
Brian Salomon92aee3d2016-12-21 09:20:25 -05001086 GrPipelineAnalysis analysis;
1087 testLCDCoverageOp.initPipelineAnalysis(&analysis);
1088 GrProcOptInfo colorPOI = analysis.fColorPOI;
1089 GrProcOptInfo covPOI = analysis.fCoveragePOI;
cdalton6fd158e2015-05-27 15:08:33 -07001090
1091 SkASSERT(kRGBA_GrColorComponentFlags == colorPOI.validFlags());
Brian Salomonaab259e2017-01-17 10:44:34 -05001092 SkASSERT(covPOI.isLCDCoverage());
cdalton6fd158e2015-05-27 15:08:33 -07001093
Brian Salomona1633922017-01-09 11:46:10 -05001094 const GrXPFactory* xpf = GrPorterDuffXPFactory::Get(SkBlendMode::kSrcOver);
Brian Salomon92aee3d2016-12-21 09:20:25 -05001095 TEST_ASSERT(!xpf->willNeedDstTexture(caps, analysis));
cdalton6fd158e2015-05-27 15:08:33 -07001096
Brian Salomon92aee3d2016-12-21 09:20:25 -05001097 sk_sp<GrXferProcessor> xp(xpf->createXferProcessor(analysis, false, nullptr, caps));
cdalton6fd158e2015-05-27 15:08:33 -07001098 if (!xp) {
1099 ERRORF(reporter, "Failed to create an XP with LCD coverage.");
1100 return;
1101 }
1102
cdalton1fa45722015-06-02 10:43:39 -07001103 GrXPFactory::InvariantBlendedColor blendedColor;
1104 xpf->getInvariantBlendedColor(colorPOI, &blendedColor);
1105 TEST_ASSERT(blendedColor.fWillBlendWithDst);
1106 TEST_ASSERT(kNone_GrColorComponentFlags == blendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -07001107
1108 GrColor overrideColor;
Brian Salomon92aee3d2016-12-21 09:20:25 -05001109 xp->getOptimizations(analysis, false, &overrideColor, caps);
cdalton6fd158e2015-05-27 15:08:33 -07001110
1111 GrXferProcessor::BlendInfo blendInfo;
1112 xp->getBlendInfo(&blendInfo);
1113 TEST_ASSERT(blendInfo.fWriteColor);
1114}
1115
kkinnunen15302832015-12-01 04:35:26 -08001116DEF_GPUTEST(PorterDuffNoDualSourceBlending, reporter, /*factory*/) {
cdalton6fd158e2015-05-27 15:08:33 -07001117 GrContextOptions opts;
1118 opts.fSuppressDualSourceBlending = true;
bsalomon3724e572016-03-30 18:56:19 -07001119 sk_gpu_test::GrContextFactory mockFactory(opts);
bsalomon85b4b532016-04-05 11:06:27 -07001120 GrContext* ctx = mockFactory.get(sk_gpu_test::GrContextFactory::kNullGL_ContextType);
cdalton6fd158e2015-05-27 15:08:33 -07001121 if (!ctx) {
1122 SkFAIL("Failed to create null context without ARB_blend_func_extended.");
1123 return;
1124 }
1125
bsalomon76228632015-05-29 08:02:10 -07001126 const GrCaps& caps = *ctx->caps();
cdalton6fd158e2015-05-27 15:08:33 -07001127 if (caps.shaderCaps()->dualSourceBlendingSupport()) {
1128 SkFAIL("Null context failed to honor request for no ARB_blend_func_extended.");
1129 return;
1130 }
1131
bsalomon091f60c2015-11-10 11:54:56 -08001132 GrBackendObject backendTex =
bungeman6bd52842016-10-27 09:30:08 -07001133 ctx->getGpu()->createTestingOnlyBackendTexture(nullptr, 100, 100, kRGBA_8888_GrPixelConfig);
cdalton6fd158e2015-05-27 15:08:33 -07001134 GrBackendTextureDesc fakeDesc;
1135 fakeDesc.fConfig = kRGBA_8888_GrPixelConfig;
1136 fakeDesc.fWidth = fakeDesc.fHeight = 100;
bsalomon091f60c2015-11-10 11:54:56 -08001137 fakeDesc.fTextureHandle = backendTex;
cdalton6fd158e2015-05-27 15:08:33 -07001138 GrXferProcessor::DstTexture fakeDstTexture;
bungeman6bd52842016-10-27 09:30:08 -07001139 fakeDstTexture.setTexture(
1140 ctx->textureProvider()->wrapBackendTexture(fakeDesc, kBorrow_GrWrapOwnership));
cdalton6fd158e2015-05-27 15:08:33 -07001141
1142 static const GrColor testColors[] = {
1143 0,
1144 GrColorPackRGBA(0, 82, 0, 255),
1145 GrColorPackA4(255)
1146 };
1147 static const GrColorComponentFlags testColorFlags[] = {
1148 kNone_GrColorComponentFlags,
1149 kG_GrColorComponentFlag | kA_GrColorComponentFlag,
1150 kRGBA_GrColorComponentFlags
1151 };
1152 GR_STATIC_ASSERT(SK_ARRAY_COUNT(testColors) == SK_ARRAY_COUNT(testColorFlags));
1153
1154 for (size_t c = 0; c < SK_ARRAY_COUNT(testColors); c++) {
Brian Salomon92aee3d2016-12-21 09:20:25 -05001155 GrPipelineAnalysis analysis;
Brian Salomonaab259e2017-01-17 10:44:34 -05001156 analysis.fColorPOI.reset(testColors[c], testColorFlags[c]);
cdalton6fd158e2015-05-27 15:08:33 -07001157 for (int f = 0; f <= 1; f++) {
cdalton6fd158e2015-05-27 15:08:33 -07001158 if (!f) {
Brian Salomonaab259e2017-01-17 10:44:34 -05001159 analysis.fCoveragePOI.reset(0, kNone_GrColorComponentFlags);
cdalton6fd158e2015-05-27 15:08:33 -07001160 } else {
Brian Salomonaab259e2017-01-17 10:44:34 -05001161 analysis.fCoveragePOI.reset(GrColorPackA4(255), kRGBA_GrColorComponentFlags);
cdalton6fd158e2015-05-27 15:08:33 -07001162 }
Mike Reed7d954ad2016-10-28 15:42:34 -04001163 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
1164 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomona1633922017-01-09 11:46:10 -05001165 const GrXPFactory* xpf = GrPorterDuffXPFactory::Get(xfermode);
cdalton86ae0a92015-06-08 15:11:04 -07001166 GrXferProcessor::DstTexture* dstTexture =
Brian Salomon92aee3d2016-12-21 09:20:25 -05001167 xpf->willNeedDstTexture(caps, analysis) ? &fakeDstTexture : 0;
Hal Canary342b7ac2016-11-04 11:49:42 -04001168 sk_sp<GrXferProcessor> xp(
Brian Salomon92aee3d2016-12-21 09:20:25 -05001169 xpf->createXferProcessor(analysis, false, dstTexture, caps));
cdalton6fd158e2015-05-27 15:08:33 -07001170 if (!xp) {
1171 ERRORF(reporter, "Failed to create an XP without dual source blending.");
1172 return;
1173 }
1174 TEST_ASSERT(!xp->hasSecondaryOutput());
Brian Salomonbfd51832017-01-04 13:22:08 -05001175 GrColor ignoredOverrideColor;
1176 xp->getOptimizations(analysis, false, &ignoredOverrideColor, caps);
cdalton6fd158e2015-05-27 15:08:33 -07001177 TEST_ASSERT(!xp->hasSecondaryOutput());
1178 }
1179 }
1180 }
bsalomon091f60c2015-11-10 11:54:56 -08001181 ctx->getGpu()->deleteTestingOnlyBackendTexture(backendTex);
cdalton6fd158e2015-05-27 15:08:33 -07001182}
1183
1184#endif