blob: 3132feeff85aa30dfc466937afeff8a44bbdd2d4 [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;
96 analysis.fColorPOI.calcWithInitialValues(NULL, 0, 0, kNone_GrColorComponentFlags, false);
egdaniel723b0502015-09-15 09:31:40 -070097 // Setting 2nd to last value to false and last to true will force covPOI to LCD coverage.
Brian Salomon92aee3d2016-12-21 09:20:25 -050098 analysis.fCoveragePOI.calcWithInitialValues(NULL, 0, 0, kNone_GrColorComponentFlags, false,
99 true);
egdaniel723b0502015-09-15 09:31:40 -0700100
Brian Salomon92aee3d2016-12-21 09:20:25 -0500101 SkASSERT(!analysis.fColorPOI.isOpaque());
102 SkASSERT(!analysis.fColorPOI.isSolidWhite());
103 SkASSERT(!analysis.fCoveragePOI.isSolidWhite());
104 SkASSERT(analysis.fCoveragePOI.isFourChannelOutput());
egdaniel723b0502015-09-15 09:31:40 -0700105
Mike Reed7d954ad2016-10-28 15:42:34 -0400106 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
107 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon92aee3d2016-12-21 09:20:25 -0500108 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, analysis);
egdaniel723b0502015-09-15 09:31:40 -0700109
110 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400111 case SkBlendMode::kClear:
egdaniel723b0502015-09-15 09:31:40 -0700112 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst);
113 TEST_ASSERT(0 == xpi.fBlendedColor.fKnownColor);
114 TEST_ASSERT(kRGBA_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
115 TEST_ASSERT((kIgnoreColor_OptFlag) == xpi.fOptFlags);
116 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
117 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
118 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
119 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
120 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
121 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
122 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400123 case SkBlendMode::kSrc:
egdaniel723b0502015-09-15 09:31:40 -0700124 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst);
125 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
126 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
127 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
128 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
129 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
130 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
131 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
132 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
133 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400134 case SkBlendMode::kDst:
egdaniel723b0502015-09-15 09:31:40 -0700135 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
136 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
137 TEST_ASSERT((kSkipDraw_OptFlag |
138 kIgnoreColor_OptFlag |
egdaniel723b0502015-09-15 09:31:40 -0700139 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
140 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
141 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
142 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
143 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
144 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
145 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
146 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400147 case SkBlendMode::kSrcOver:
egdaniel723b0502015-09-15 09:31:40 -0700148 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
149 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
150 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
151 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
152 TEST_ASSERT(kSAModulate_OutputType == xpi.fSecondaryOutputType);
153 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
154 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
155 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
156 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
157 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400158 case SkBlendMode::kDstOver:
egdaniel723b0502015-09-15 09:31:40 -0700159 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
160 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
161 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
162 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
163 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
164 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
165 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
166 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
167 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
168 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400169 case SkBlendMode::kSrcIn:
egdaniel723b0502015-09-15 09:31:40 -0700170 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
171 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
172 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
173 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
174 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
175 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
176 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
177 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
178 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
179 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400180 case SkBlendMode::kDstIn:
egdaniel723b0502015-09-15 09:31:40 -0700181 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
182 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
183 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
184 TEST_ASSERT(kISAModulate_OutputType == xpi.fPrimaryOutputType);
185 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
186 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
187 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
188 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
189 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
190 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400191 case SkBlendMode::kSrcOut:
egdaniel723b0502015-09-15 09:31:40 -0700192 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
193 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
194 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
195 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
196 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
197 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
198 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
199 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
200 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
201 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400202 case SkBlendMode::kDstOut:
egdaniel723b0502015-09-15 09:31:40 -0700203 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
204 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
205 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
206 TEST_ASSERT(kSAModulate_OutputType == xpi.fPrimaryOutputType);
207 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
208 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
209 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
210 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
211 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
212 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400213 case SkBlendMode::kSrcATop:
egdaniel723b0502015-09-15 09:31:40 -0700214 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
215 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
216 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
217 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
218 TEST_ASSERT(kSAModulate_OutputType == xpi.fSecondaryOutputType);
219 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
220 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
221 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
222 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
223 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400224 case SkBlendMode::kDstATop:
egdaniel723b0502015-09-15 09:31:40 -0700225 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
226 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
227 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
228 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
229 TEST_ASSERT(kISAModulate_OutputType == xpi.fSecondaryOutputType);
230 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
231 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
232 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
233 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
234 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400235 case SkBlendMode::kXor:
egdaniel723b0502015-09-15 09:31:40 -0700236 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
237 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
238 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
239 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
240 TEST_ASSERT(kSAModulate_OutputType == xpi.fSecondaryOutputType);
241 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
242 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
243 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
244 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
245 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400246 case SkBlendMode::kPlus:
egdaniel723b0502015-09-15 09:31:40 -0700247 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
248 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
249 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
250 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
251 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
252 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
253 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
254 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
255 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
256 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400257 case SkBlendMode::kModulate:
egdaniel723b0502015-09-15 09:31:40 -0700258 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
259 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
260 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
261 TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType);
262 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
263 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
264 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
265 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
266 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
267 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400268 case SkBlendMode::kScreen:
egdaniel723b0502015-09-15 09:31:40 -0700269 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
270 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
271 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
272 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
273 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
274 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
275 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
276 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
277 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
278 break;
279 default:
280 ERRORF(reporter, "Invalid xfermode.");
281 break;
282 }
283 }
284}
cdalton6fd158e2015-05-27 15:08:33 -0700285static void test_color_unknown_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomon92aee3d2016-12-21 09:20:25 -0500286 GrPipelineAnalysis analysis;
287 analysis.fColorPOI.calcWithInitialValues(nullptr, 0, 0, kNone_GrColorComponentFlags, false);
288 analysis.fCoveragePOI.calcWithInitialValues(nullptr, 0, 0, kNone_GrColorComponentFlags, true);
cdalton6fd158e2015-05-27 15:08:33 -0700289
Brian Salomon92aee3d2016-12-21 09:20:25 -0500290 SkASSERT(!analysis.fColorPOI.isOpaque());
291 SkASSERT(!analysis.fColorPOI.isSolidWhite());
292 SkASSERT(!analysis.fCoveragePOI.isSolidWhite());
293 SkASSERT(!analysis.fCoveragePOI.isFourChannelOutput());
cdalton6fd158e2015-05-27 15:08:33 -0700294
Mike Reed7d954ad2016-10-28 15:42:34 -0400295 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
296 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon92aee3d2016-12-21 09:20:25 -0500297 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, analysis);
egdaniel723b0502015-09-15 09:31:40 -0700298
cdalton6fd158e2015-05-27 15:08:33 -0700299 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400300 case SkBlendMode::kClear:
cdalton1fa45722015-06-02 10:43:39 -0700301 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst);
302 TEST_ASSERT(0 == xpi.fBlendedColor.fKnownColor);
303 TEST_ASSERT(kRGBA_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700304 TEST_ASSERT((kIgnoreColor_OptFlag) == xpi.fOptFlags);
305 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
306 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
307 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
308 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
309 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
310 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
311 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400312 case SkBlendMode::kSrc:
cdalton1fa45722015-06-02 10:43:39 -0700313 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst);
314 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
bsalomon7765a472015-07-08 11:26:37 -0700315 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700316 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
317 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
318 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
319 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
320 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
321 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
322 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400323 case SkBlendMode::kDst:
cdalton1fa45722015-06-02 10:43:39 -0700324 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
325 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700326 TEST_ASSERT((kSkipDraw_OptFlag |
327 kIgnoreColor_OptFlag |
cdalton6fd158e2015-05-27 15:08:33 -0700328 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
329 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
330 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
331 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
332 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
333 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
334 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
335 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400336 case SkBlendMode::kSrcOver:
cdalton1fa45722015-06-02 10:43:39 -0700337 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
338 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700339 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
340 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
341 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
342 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
343 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
344 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
345 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
346 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400347 case SkBlendMode::kDstOver:
cdalton1fa45722015-06-02 10:43:39 -0700348 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
349 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700350 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
351 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
352 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
353 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
354 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
355 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
356 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
357 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400358 case SkBlendMode::kSrcIn:
cdalton1fa45722015-06-02 10:43:39 -0700359 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
360 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
bsalomon7765a472015-07-08 11:26:37 -0700361 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700362 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
363 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
364 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
365 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
366 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
367 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
368 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400369 case SkBlendMode::kDstIn:
cdalton1fa45722015-06-02 10:43:39 -0700370 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
371 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
bsalomon7765a472015-07-08 11:26:37 -0700372 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700373 TEST_ASSERT(kISAModulate_OutputType == xpi.fPrimaryOutputType);
374 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
375 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
376 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
377 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
378 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
379 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400380 case SkBlendMode::kSrcOut:
cdalton1fa45722015-06-02 10:43:39 -0700381 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
382 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
bsalomon7765a472015-07-08 11:26:37 -0700383 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700384 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
385 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
386 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
387 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
388 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
389 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
390 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400391 case SkBlendMode::kDstOut:
cdalton1fa45722015-06-02 10:43:39 -0700392 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
393 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700394 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
395 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
396 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
397 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
398 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
399 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
400 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
401 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400402 case SkBlendMode::kSrcATop:
cdalton1fa45722015-06-02 10:43:39 -0700403 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
404 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700405 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
406 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
407 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
408 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
409 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
410 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
411 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
412 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400413 case SkBlendMode::kDstATop:
cdalton1fa45722015-06-02 10:43:39 -0700414 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
415 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
bsalomon7765a472015-07-08 11:26:37 -0700416 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700417 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
418 TEST_ASSERT(kISAModulate_OutputType == xpi.fSecondaryOutputType);
419 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
420 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
421 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
422 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
423 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400424 case SkBlendMode::kXor:
cdalton1fa45722015-06-02 10:43:39 -0700425 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
426 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700427 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
428 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
429 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
430 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
431 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
432 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
433 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
434 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400435 case SkBlendMode::kPlus:
cdalton1fa45722015-06-02 10:43:39 -0700436 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
437 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700438 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
439 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
440 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
441 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
442 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
443 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
444 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
445 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400446 case SkBlendMode::kModulate:
cdalton1fa45722015-06-02 10:43:39 -0700447 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
448 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
bsalomon7765a472015-07-08 11:26:37 -0700449 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700450 TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType);
451 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
452 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
453 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
454 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
455 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
456 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400457 case SkBlendMode::kScreen:
cdalton1fa45722015-06-02 10:43:39 -0700458 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
459 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700460 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
461 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
462 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
463 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
464 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
465 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
466 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
467 break;
468 default:
469 ERRORF(reporter, "Invalid xfermode.");
470 break;
471 }
472 }
473}
474
475static void test_color_unknown_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomon92aee3d2016-12-21 09:20:25 -0500476 GrPipelineAnalysis analysis;
477 analysis.fColorPOI.calcWithInitialValues(nullptr, 0, GrColorPackRGBA(229, 0, 154, 0),
478 kR_GrColorComponentFlag | kB_GrColorComponentFlag,
479 false);
480 analysis.fCoveragePOI.calcWithInitialValues(nullptr, 0, GrColorPackA4(255),
481 kRGBA_GrColorComponentFlags, true);
cdalton6fd158e2015-05-27 15:08:33 -0700482
Brian Salomon92aee3d2016-12-21 09:20:25 -0500483 SkASSERT(!analysis.fColorPOI.isOpaque());
484 SkASSERT(!analysis.fColorPOI.isSolidWhite());
485 SkASSERT(analysis.fCoveragePOI.isSolidWhite());
486 SkASSERT(!analysis.fCoveragePOI.isFourChannelOutput());
cdalton6fd158e2015-05-27 15:08:33 -0700487
Mike Reed7d954ad2016-10-28 15:42:34 -0400488 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
489 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon92aee3d2016-12-21 09:20:25 -0500490 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, analysis);
cdalton6fd158e2015-05-27 15:08:33 -0700491
492 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400493 case SkBlendMode::kClear:
cdalton1fa45722015-06-02 10:43:39 -0700494 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst);
495 TEST_ASSERT(0 == xpi.fBlendedColor.fKnownColor);
496 TEST_ASSERT(kRGBA_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -0500497 TEST_ASSERT(kIgnoreColor_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700498 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
499 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
500 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
501 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
502 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
503 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
504 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400505 case SkBlendMode::kSrc:
cdalton1fa45722015-06-02 10:43:39 -0700506 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst);
507 TEST_ASSERT(229 == GrColorUnpackR(xpi.fBlendedColor.fKnownColor));
508 TEST_ASSERT(154 == GrColorUnpackB(xpi.fBlendedColor.fKnownColor));
cdalton6fd158e2015-05-27 15:08:33 -0700509 TEST_ASSERT((kR_GrColorComponentFlag |
cdalton1fa45722015-06-02 10:43:39 -0700510 kB_GrColorComponentFlag) == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -0500511 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700512 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
513 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
514 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
515 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
516 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
517 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
518 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400519 case SkBlendMode::kDst:
cdalton1fa45722015-06-02 10:43:39 -0700520 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
521 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700522 TEST_ASSERT((kSkipDraw_OptFlag |
523 kIgnoreColor_OptFlag |
cdalton6fd158e2015-05-27 15:08:33 -0700524 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
525 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
526 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
527 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
528 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
529 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
530 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
531 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400532 case SkBlendMode::kSrcOver:
cdalton1fa45722015-06-02 10:43:39 -0700533 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
534 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
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(kOne_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::kDstOver:
cdalton1fa45722015-06-02 10:43:39 -0700544 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
545 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -0500546 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700547 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
548 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
549 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
550 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
551 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
552 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
553 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400554 case SkBlendMode::kSrcIn:
cdalton1fa45722015-06-02 10:43:39 -0700555 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
556 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -0500557 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700558 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
559 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
560 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
561 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
562 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
563 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
564 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400565 case SkBlendMode::kDstIn:
cdalton1fa45722015-06-02 10:43:39 -0700566 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
567 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -0500568 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700569 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
570 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
571 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
572 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
573 TEST_ASSERT(kSA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
574 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
575 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400576 case SkBlendMode::kSrcOut:
cdalton1fa45722015-06-02 10:43:39 -0700577 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
578 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -0500579 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700580 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
581 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
582 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
583 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
584 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
585 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
586 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400587 case SkBlendMode::kDstOut:
cdalton1fa45722015-06-02 10:43:39 -0700588 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
589 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -0500590 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700591 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
592 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
593 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
594 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
595 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
596 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
597 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400598 case SkBlendMode::kSrcATop:
cdalton1fa45722015-06-02 10:43:39 -0700599 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
600 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -0500601 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700602 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
603 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
604 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
605 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
606 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
607 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
608 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400609 case SkBlendMode::kDstATop:
cdalton1fa45722015-06-02 10:43:39 -0700610 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
611 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -0500612 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700613 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
614 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
615 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
616 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
617 TEST_ASSERT(kSA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
618 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
619 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400620 case SkBlendMode::kXor:
cdalton1fa45722015-06-02 10:43:39 -0700621 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
622 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -0500623 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700624 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
625 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
626 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
627 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
628 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
629 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
630 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400631 case SkBlendMode::kPlus:
cdalton1fa45722015-06-02 10:43:39 -0700632 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
633 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -0500634 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700635 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
636 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
637 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
638 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
639 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
640 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
641 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400642 case SkBlendMode::kModulate:
cdalton1fa45722015-06-02 10:43:39 -0700643 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
644 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -0500645 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700646 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
647 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
648 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
649 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
650 TEST_ASSERT(kSC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
651 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
652 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400653 case SkBlendMode::kScreen:
cdalton1fa45722015-06-02 10:43:39 -0700654 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
655 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -0500656 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700657 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
658 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
659 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
660 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
661 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
662 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
663 break;
664 default:
665 ERRORF(reporter, "Invalid xfermode.");
666 break;
667 }
668 }
669}
670
671static void test_color_opaque_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomon92aee3d2016-12-21 09:20:25 -0500672 GrPipelineAnalysis analysis;
673 analysis.fColorPOI.calcWithInitialValues(nullptr, 0, GrColorPackA4(255),
674 kA_GrColorComponentFlag, false);
675 analysis.fCoveragePOI.calcWithInitialValues(nullptr, 0, 0, kNone_GrColorComponentFlags, true);
cdalton6fd158e2015-05-27 15:08:33 -0700676
Brian Salomon92aee3d2016-12-21 09:20:25 -0500677 SkASSERT(analysis.fColorPOI.isOpaque());
678 SkASSERT(!analysis.fColorPOI.isSolidWhite());
679 SkASSERT(!analysis.fCoveragePOI.isSolidWhite());
680 SkASSERT(!analysis.fCoveragePOI.isFourChannelOutput());
cdalton6fd158e2015-05-27 15:08:33 -0700681
Mike Reed7d954ad2016-10-28 15:42:34 -0400682 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
683 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon92aee3d2016-12-21 09:20:25 -0500684 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, analysis);
cdalton6fd158e2015-05-27 15:08:33 -0700685
686 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400687 case SkBlendMode::kClear:
cdalton1fa45722015-06-02 10:43:39 -0700688 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst);
689 TEST_ASSERT(0 == xpi.fBlendedColor.fKnownColor);
690 TEST_ASSERT(kRGBA_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700691 TEST_ASSERT((kIgnoreColor_OptFlag) == xpi.fOptFlags);
692 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
693 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
694 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
695 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
696 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
697 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
698 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400699 case SkBlendMode::kSrc:
cdalton1fa45722015-06-02 10:43:39 -0700700 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst);
701 TEST_ASSERT(255 == GrColorUnpackA(xpi.fBlendedColor.fKnownColor));
702 TEST_ASSERT(kA_GrColorComponentFlag == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700703 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
704 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
705 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
706 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
707 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
708 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
709 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
710 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400711 case SkBlendMode::kDst:
cdalton1fa45722015-06-02 10:43:39 -0700712 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
713 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700714 TEST_ASSERT((kSkipDraw_OptFlag |
715 kIgnoreColor_OptFlag |
cdalton6fd158e2015-05-27 15:08:33 -0700716 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
717 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
718 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
719 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
720 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
721 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
722 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
723 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400724 case SkBlendMode::kSrcOver:
cdalton1fa45722015-06-02 10:43:39 -0700725 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst);
726 TEST_ASSERT(255 == GrColorUnpackA(xpi.fBlendedColor.fKnownColor));
727 TEST_ASSERT(kA_GrColorComponentFlag == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700728 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
729 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
730 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
731 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
732 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
733 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
734 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
735 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400736 case SkBlendMode::kDstOver:
cdalton1fa45722015-06-02 10:43:39 -0700737 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
738 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
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(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
745 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
746 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400747 case SkBlendMode::kSrcIn:
cdalton1fa45722015-06-02 10:43:39 -0700748 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
749 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700750 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
751 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
752 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
753 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
754 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
755 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
756 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
757 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400758 case SkBlendMode::kDstIn:
cdalton1fa45722015-06-02 10:43:39 -0700759 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
760 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700761 TEST_ASSERT((kSkipDraw_OptFlag |
762 kIgnoreColor_OptFlag |
cdalton6fd158e2015-05-27 15:08:33 -0700763 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
764 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
765 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
766 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
767 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
768 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
769 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
770 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400771 case SkBlendMode::kSrcOut:
cdalton1fa45722015-06-02 10:43:39 -0700772 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
773 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700774 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
775 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
776 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
777 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
778 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
779 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
780 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
781 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400782 case SkBlendMode::kDstOut:
cdalton1fa45722015-06-02 10:43:39 -0700783 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst);
784 TEST_ASSERT(0 == xpi.fBlendedColor.fKnownColor);
785 TEST_ASSERT(kRGBA_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700786 TEST_ASSERT((kIgnoreColor_OptFlag) == xpi.fOptFlags);
787 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
788 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
789 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
790 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
791 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
792 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
793 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400794 case SkBlendMode::kSrcATop:
cdalton1fa45722015-06-02 10:43:39 -0700795 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
796 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700797 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
798 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
799 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
800 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
801 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
802 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
803 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
804 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400805 case SkBlendMode::kDstATop:
cdalton1fa45722015-06-02 10:43:39 -0700806 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
807 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700808 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
809 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
810 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
811 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
812 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
813 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
814 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
815 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400816 case SkBlendMode::kXor:
cdalton1fa45722015-06-02 10:43:39 -0700817 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
818 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700819 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
820 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
821 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
822 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
823 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
824 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
825 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
826 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400827 case SkBlendMode::kPlus:
cdalton1fa45722015-06-02 10:43:39 -0700828 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
829 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700830 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
831 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
832 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
833 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
834 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
835 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
836 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
837 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400838 case SkBlendMode::kModulate:
cdalton1fa45722015-06-02 10:43:39 -0700839 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
840 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
bsalomon7765a472015-07-08 11:26:37 -0700841 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700842 TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType);
843 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
844 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
845 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
846 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
847 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
848 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400849 case SkBlendMode::kScreen:
cdalton1fa45722015-06-02 10:43:39 -0700850 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
851 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700852 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
853 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
854 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
855 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
856 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
857 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
858 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
859 break;
860 default:
861 ERRORF(reporter, "Invalid xfermode.");
862 break;
863 }
864 }
865}
866
867static void test_color_opaque_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomon92aee3d2016-12-21 09:20:25 -0500868 GrPipelineAnalysis analysis;
869 analysis.fColorPOI.calcWithInitialValues(nullptr, 0, GrColorPackRGBA(0, 82, 0, 255),
870 kG_GrColorComponentFlag | kA_GrColorComponentFlag,
871 false);
872 analysis.fCoveragePOI.calcWithInitialValues(nullptr, 0, GrColorPackA4(255),
873 kRGBA_GrColorComponentFlags, true);
cdalton6fd158e2015-05-27 15:08:33 -0700874
Brian Salomon92aee3d2016-12-21 09:20:25 -0500875 SkASSERT(analysis.fColorPOI.isOpaque());
876 SkASSERT(!analysis.fColorPOI.isSolidWhite());
877 SkASSERT(analysis.fCoveragePOI.isSolidWhite());
878 SkASSERT(!analysis.fCoveragePOI.isFourChannelOutput());
cdalton6fd158e2015-05-27 15:08:33 -0700879
Mike Reed7d954ad2016-10-28 15:42:34 -0400880 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
881 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon92aee3d2016-12-21 09:20:25 -0500882 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, analysis);
cdalton6fd158e2015-05-27 15:08:33 -0700883
884 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400885 case SkBlendMode::kClear:
cdalton1fa45722015-06-02 10:43:39 -0700886 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst);
887 TEST_ASSERT(0 == xpi.fBlendedColor.fKnownColor);
888 TEST_ASSERT(kRGBA_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -0500889 TEST_ASSERT(kIgnoreColor_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700890 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
891 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
892 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
893 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
894 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
895 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
896 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400897 case SkBlendMode::kSrc:
cdalton1fa45722015-06-02 10:43:39 -0700898 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst);
899 TEST_ASSERT(82 == GrColorUnpackG(xpi.fBlendedColor.fKnownColor));
900 TEST_ASSERT(255 == GrColorUnpackA(xpi.fBlendedColor.fKnownColor));
cdalton6fd158e2015-05-27 15:08:33 -0700901 TEST_ASSERT((kG_GrColorComponentFlag |
cdalton1fa45722015-06-02 10:43:39 -0700902 kA_GrColorComponentFlag) == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -0500903 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700904 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
905 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
906 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
907 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
908 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
909 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
910 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400911 case SkBlendMode::kDst:
cdalton1fa45722015-06-02 10:43:39 -0700912 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
913 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700914 TEST_ASSERT((kSkipDraw_OptFlag |
915 kIgnoreColor_OptFlag |
cdalton6fd158e2015-05-27 15:08:33 -0700916 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
917 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
918 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
919 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
920 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
921 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
922 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
923 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400924 case SkBlendMode::kSrcOver:
cdalton1fa45722015-06-02 10:43:39 -0700925 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst);
926 TEST_ASSERT(82 == GrColorUnpackG(xpi.fBlendedColor.fKnownColor));
927 TEST_ASSERT(255 == GrColorUnpackA(xpi.fBlendedColor.fKnownColor));
cdalton6fd158e2015-05-27 15:08:33 -0700928 TEST_ASSERT((kG_GrColorComponentFlag |
cdalton1fa45722015-06-02 10:43:39 -0700929 kA_GrColorComponentFlag) == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -0500930 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700931 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
932 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
933 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
934 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
935 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
936 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
937 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400938 case SkBlendMode::kDstOver:
cdalton1fa45722015-06-02 10:43:39 -0700939 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
940 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -0500941 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700942 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
943 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
944 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
945 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
946 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
947 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
948 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400949 case SkBlendMode::kSrcIn:
cdalton1fa45722015-06-02 10:43:39 -0700950 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
951 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -0500952 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700953 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
954 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
955 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
956 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
957 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
958 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
959 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400960 case SkBlendMode::kDstIn:
cdalton1fa45722015-06-02 10:43:39 -0700961 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
962 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700963 TEST_ASSERT((kSkipDraw_OptFlag |
964 kIgnoreColor_OptFlag |
cdalton6fd158e2015-05-27 15:08:33 -0700965 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
966 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
967 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
968 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
969 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
970 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
971 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
972 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400973 case SkBlendMode::kSrcOut:
cdalton1fa45722015-06-02 10:43:39 -0700974 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
975 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -0500976 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700977 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
978 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
979 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
980 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
981 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
982 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
983 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400984 case SkBlendMode::kDstOut:
cdalton1fa45722015-06-02 10:43:39 -0700985 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst);
986 TEST_ASSERT(0 == xpi.fBlendedColor.fKnownColor);
987 TEST_ASSERT(kRGBA_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -0500988 TEST_ASSERT(kIgnoreColor_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700989 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
990 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
991 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
992 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
993 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
994 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
995 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400996 case SkBlendMode::kSrcATop:
cdalton1fa45722015-06-02 10:43:39 -0700997 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
998 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -0500999 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -07001000 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
1001 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
1002 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
1003 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
1004 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
1005 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
1006 break;
Mike Reed7d954ad2016-10-28 15:42:34 -04001007 case SkBlendMode::kDstATop:
cdalton1fa45722015-06-02 10:43:39 -07001008 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
1009 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -05001010 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -07001011 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
1012 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
1013 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
1014 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
1015 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
1016 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
1017 break;
Mike Reed7d954ad2016-10-28 15:42:34 -04001018 case SkBlendMode::kXor:
cdalton1fa45722015-06-02 10:43:39 -07001019 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
1020 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -05001021 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -07001022 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
1023 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
1024 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
1025 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
1026 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
1027 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
1028 break;
Mike Reed7d954ad2016-10-28 15:42:34 -04001029 case SkBlendMode::kPlus:
cdalton1fa45722015-06-02 10:43:39 -07001030 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
1031 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -05001032 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -07001033 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
1034 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
1035 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
1036 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
1037 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
1038 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
1039 break;
Mike Reed7d954ad2016-10-28 15:42:34 -04001040 case SkBlendMode::kModulate:
cdalton1fa45722015-06-02 10:43:39 -07001041 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
1042 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -05001043 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -07001044 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
1045 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
1046 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
1047 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
1048 TEST_ASSERT(kSC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
1049 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
1050 break;
Mike Reed7d954ad2016-10-28 15:42:34 -04001051 case SkBlendMode::kScreen:
cdalton1fa45722015-06-02 10:43:39 -07001052 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
1053 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -05001054 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -07001055 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
1056 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
1057 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
1058 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
1059 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
1060 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
1061 break;
1062 default:
1063 ERRORF(reporter, "Invalid xfermode.");
1064 break;
1065 }
1066 }
1067}
1068
egdaniel723b0502015-09-15 09:31:40 -07001069static void test_lcd_coverage_fallback_case(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomon92aee3d2016-12-21 09:20:25 -05001070 class TestLCDCoverageOp : public GrMeshDrawOp {
reed1b55a962015-09-17 20:16:13 -07001071 public:
Brian Salomon25a88092016-12-01 09:36:50 -05001072 DEFINE_OP_CLASS_ID
reed1b55a962015-09-17 20:16:13 -07001073
Brian Salomon92aee3d2016-12-21 09:20:25 -05001074 TestLCDCoverageOp() : INHERITED(ClassID()) {}
cdalton6fd158e2015-05-27 15:08:33 -07001075
Brian Salomon09d994e2016-12-21 11:14:46 -05001076 const char* name() const override { return "Test LCD Text Op"; }
Brian Salomon92aee3d2016-12-21 09:20:25 -05001077
1078 private:
1079 void getPipelineAnalysisInput(GrPipelineAnalysisDrawOpInput* input) const override {
1080 input->pipelineColorInput()->setKnownFourComponents(GrColorPackRGBA(123, 45, 67, 221));
1081 input->pipelineCoverageInput()->setUnknownFourComponents();
1082 input->pipelineCoverageInput()->setUsingLCDCoverage();
1083 }
1084
1085 void applyPipelineOptimizations(const GrPipelineOptimizations&) override {}
Brian Salomon25a88092016-12-01 09:36:50 -05001086 bool onCombineIfPossible(GrOp*, const GrCaps&) override { return false; }
Mike Kleinfc6c37b2016-09-27 09:34:10 -04001087 void onPrepareDraws(Target*) const override {}
cdalton6fd158e2015-05-27 15:08:33 -07001088
Brian Salomondad29232016-12-01 16:40:24 -05001089 typedef GrMeshDrawOp INHERITED;
Brian Salomon92aee3d2016-12-21 09:20:25 -05001090 } testLCDCoverageOp;
cdalton6fd158e2015-05-27 15:08:33 -07001091
Brian Salomon92aee3d2016-12-21 09:20:25 -05001092 GrPipelineAnalysis analysis;
1093 testLCDCoverageOp.initPipelineAnalysis(&analysis);
1094 GrProcOptInfo colorPOI = analysis.fColorPOI;
1095 GrProcOptInfo covPOI = analysis.fCoveragePOI;
cdalton6fd158e2015-05-27 15:08:33 -07001096
1097 SkASSERT(kRGBA_GrColorComponentFlags == colorPOI.validFlags());
1098 SkASSERT(covPOI.isFourChannelOutput());
1099
Brian Salomona1633922017-01-09 11:46:10 -05001100 const GrXPFactory* xpf = GrPorterDuffXPFactory::Get(SkBlendMode::kSrcOver);
Brian Salomon92aee3d2016-12-21 09:20:25 -05001101 TEST_ASSERT(!xpf->willNeedDstTexture(caps, analysis));
cdalton6fd158e2015-05-27 15:08:33 -07001102
Brian Salomon92aee3d2016-12-21 09:20:25 -05001103 sk_sp<GrXferProcessor> xp(xpf->createXferProcessor(analysis, false, nullptr, caps));
cdalton6fd158e2015-05-27 15:08:33 -07001104 if (!xp) {
1105 ERRORF(reporter, "Failed to create an XP with LCD coverage.");
1106 return;
1107 }
1108
cdalton1fa45722015-06-02 10:43:39 -07001109 GrXPFactory::InvariantBlendedColor blendedColor;
1110 xpf->getInvariantBlendedColor(colorPOI, &blendedColor);
1111 TEST_ASSERT(blendedColor.fWillBlendWithDst);
1112 TEST_ASSERT(kNone_GrColorComponentFlags == blendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -07001113
1114 GrColor overrideColor;
Brian Salomon92aee3d2016-12-21 09:20:25 -05001115 xp->getOptimizations(analysis, false, &overrideColor, caps);
cdalton6fd158e2015-05-27 15:08:33 -07001116
1117 GrXferProcessor::BlendInfo blendInfo;
1118 xp->getBlendInfo(&blendInfo);
1119 TEST_ASSERT(blendInfo.fWriteColor);
1120}
1121
kkinnunen15302832015-12-01 04:35:26 -08001122DEF_GPUTEST(PorterDuffNoDualSourceBlending, reporter, /*factory*/) {
cdalton6fd158e2015-05-27 15:08:33 -07001123 GrContextOptions opts;
1124 opts.fSuppressDualSourceBlending = true;
bsalomon3724e572016-03-30 18:56:19 -07001125 sk_gpu_test::GrContextFactory mockFactory(opts);
bsalomon85b4b532016-04-05 11:06:27 -07001126 GrContext* ctx = mockFactory.get(sk_gpu_test::GrContextFactory::kNullGL_ContextType);
cdalton6fd158e2015-05-27 15:08:33 -07001127 if (!ctx) {
1128 SkFAIL("Failed to create null context without ARB_blend_func_extended.");
1129 return;
1130 }
1131
bsalomon76228632015-05-29 08:02:10 -07001132 const GrCaps& caps = *ctx->caps();
cdalton6fd158e2015-05-27 15:08:33 -07001133 if (caps.shaderCaps()->dualSourceBlendingSupport()) {
1134 SkFAIL("Null context failed to honor request for no ARB_blend_func_extended.");
1135 return;
1136 }
1137
bsalomon091f60c2015-11-10 11:54:56 -08001138 GrBackendObject backendTex =
bungeman6bd52842016-10-27 09:30:08 -07001139 ctx->getGpu()->createTestingOnlyBackendTexture(nullptr, 100, 100, kRGBA_8888_GrPixelConfig);
cdalton6fd158e2015-05-27 15:08:33 -07001140 GrBackendTextureDesc fakeDesc;
1141 fakeDesc.fConfig = kRGBA_8888_GrPixelConfig;
1142 fakeDesc.fWidth = fakeDesc.fHeight = 100;
bsalomon091f60c2015-11-10 11:54:56 -08001143 fakeDesc.fTextureHandle = backendTex;
cdalton6fd158e2015-05-27 15:08:33 -07001144 GrXferProcessor::DstTexture fakeDstTexture;
bungeman6bd52842016-10-27 09:30:08 -07001145 fakeDstTexture.setTexture(
1146 ctx->textureProvider()->wrapBackendTexture(fakeDesc, kBorrow_GrWrapOwnership));
cdalton6fd158e2015-05-27 15:08:33 -07001147
1148 static const GrColor testColors[] = {
1149 0,
1150 GrColorPackRGBA(0, 82, 0, 255),
1151 GrColorPackA4(255)
1152 };
1153 static const GrColorComponentFlags testColorFlags[] = {
1154 kNone_GrColorComponentFlags,
1155 kG_GrColorComponentFlag | kA_GrColorComponentFlag,
1156 kRGBA_GrColorComponentFlags
1157 };
1158 GR_STATIC_ASSERT(SK_ARRAY_COUNT(testColors) == SK_ARRAY_COUNT(testColorFlags));
1159
1160 for (size_t c = 0; c < SK_ARRAY_COUNT(testColors); c++) {
Brian Salomon92aee3d2016-12-21 09:20:25 -05001161 GrPipelineAnalysis analysis;
1162 analysis.fColorPOI.calcWithInitialValues(nullptr, 0, testColors[c], testColorFlags[c],
1163 false);
cdalton6fd158e2015-05-27 15:08:33 -07001164 for (int f = 0; f <= 1; f++) {
cdalton6fd158e2015-05-27 15:08:33 -07001165 if (!f) {
Brian Salomon92aee3d2016-12-21 09:20:25 -05001166 analysis.fCoveragePOI.calcWithInitialValues(nullptr, 0, 0,
1167 kNone_GrColorComponentFlags, true);
cdalton6fd158e2015-05-27 15:08:33 -07001168 } else {
Brian Salomon92aee3d2016-12-21 09:20:25 -05001169 analysis.fCoveragePOI.calcWithInitialValues(nullptr, 0, GrColorPackA4(255),
1170 kRGBA_GrColorComponentFlags, true);
cdalton6fd158e2015-05-27 15:08:33 -07001171 }
Mike Reed7d954ad2016-10-28 15:42:34 -04001172 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
1173 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomona1633922017-01-09 11:46:10 -05001174 const GrXPFactory* xpf = GrPorterDuffXPFactory::Get(xfermode);
cdalton86ae0a92015-06-08 15:11:04 -07001175 GrXferProcessor::DstTexture* dstTexture =
Brian Salomon92aee3d2016-12-21 09:20:25 -05001176 xpf->willNeedDstTexture(caps, analysis) ? &fakeDstTexture : 0;
Hal Canary342b7ac2016-11-04 11:49:42 -04001177 sk_sp<GrXferProcessor> xp(
Brian Salomon92aee3d2016-12-21 09:20:25 -05001178 xpf->createXferProcessor(analysis, false, dstTexture, caps));
cdalton6fd158e2015-05-27 15:08:33 -07001179 if (!xp) {
1180 ERRORF(reporter, "Failed to create an XP without dual source blending.");
1181 return;
1182 }
1183 TEST_ASSERT(!xp->hasSecondaryOutput());
Brian Salomonbfd51832017-01-04 13:22:08 -05001184 GrColor ignoredOverrideColor;
1185 xp->getOptimizations(analysis, false, &ignoredOverrideColor, caps);
cdalton6fd158e2015-05-27 15:08:33 -07001186 TEST_ASSERT(!xp->hasSecondaryOutput());
1187 }
1188 }
1189 }
bsalomon091f60c2015-11-10 11:54:56 -08001190 ctx->getGpu()->deleteTestingOnlyBackendTexture(backendTex);
cdalton6fd158e2015-05-27 15:08:33 -07001191}
1192
1193#endif