blob: 3e74a592281d0942c30abb86fc86785121cdef81 [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) {
bungeman06ca8ec2016-06-09 08:01:03 -070070 sk_sp<GrXPFactory> xpf(GrPorterDuffXPFactory::Make(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);
74 fOptFlags = xp->getOptimizations(analysis, false, nullptr, caps);
Hal Canary342b7ac2016-11-04 11:49:42 -040075 GetXPOutputTypes(xp.get(), &fPrimaryOutputType, &fSecondaryOutputType);
cdalton6fd158e2015-05-27 15:08:33 -070076 xp->getBlendInfo(&fBlendInfo);
77 TEST_ASSERT(!xp->willReadDstColor());
78 TEST_ASSERT(xp->hasSecondaryOutput() == GrBlendCoeffRefsSrc2(fBlendInfo.fDstBlend));
79 }
80
cdalton1fa45722015-06-02 10:43:39 -070081 GrXPFactory::InvariantBlendedColor fBlendedColor;
cdalton6fd158e2015-05-27 15:08:33 -070082 int fOptFlags;
83 int fPrimaryOutputType;
84 int fSecondaryOutputType;
85 GrXferProcessor::BlendInfo fBlendInfo;
86 };
87
88 static void GetXPOutputTypes(const GrXferProcessor* xp, int* outPrimary, int* outSecondary) {
egdanielf2342722015-11-20 15:12:59 -080089 GrPorterDuffXPFactory::TestGetXPOutputTypes(xp, outPrimary, outSecondary);
cdalton6fd158e2015-05-27 15:08:33 -070090 }
91};
92
egdaniel723b0502015-09-15 09:31:40 -070093static void test_lcd_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomon92aee3d2016-12-21 09:20:25 -050094 GrPipelineAnalysis analysis;
95 analysis.fColorPOI.calcWithInitialValues(NULL, 0, 0, kNone_GrColorComponentFlags, false);
egdaniel723b0502015-09-15 09:31:40 -070096 // Setting 2nd to last value to false and last to true will force covPOI to LCD coverage.
Brian Salomon92aee3d2016-12-21 09:20:25 -050097 analysis.fCoveragePOI.calcWithInitialValues(NULL, 0, 0, kNone_GrColorComponentFlags, false,
98 true);
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());
103 SkASSERT(analysis.fCoveragePOI.isFourChannelOutput());
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;
286 analysis.fColorPOI.calcWithInitialValues(nullptr, 0, 0, kNone_GrColorComponentFlags, false);
287 analysis.fCoveragePOI.calcWithInitialValues(nullptr, 0, 0, kNone_GrColorComponentFlags, true);
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());
292 SkASSERT(!analysis.fCoveragePOI.isFourChannelOutput());
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;
476 analysis.fColorPOI.calcWithInitialValues(nullptr, 0, GrColorPackRGBA(229, 0, 154, 0),
477 kR_GrColorComponentFlag | kB_GrColorComponentFlag,
478 false);
479 analysis.fCoveragePOI.calcWithInitialValues(nullptr, 0, GrColorPackA4(255),
480 kRGBA_GrColorComponentFlags, true);
cdalton6fd158e2015-05-27 15:08:33 -0700481
Brian Salomon92aee3d2016-12-21 09:20:25 -0500482 SkASSERT(!analysis.fColorPOI.isOpaque());
483 SkASSERT(!analysis.fColorPOI.isSolidWhite());
484 SkASSERT(analysis.fCoveragePOI.isSolidWhite());
485 SkASSERT(!analysis.fCoveragePOI.isFourChannelOutput());
cdalton6fd158e2015-05-27 15:08:33 -0700486
Mike Reed7d954ad2016-10-28 15:42:34 -0400487 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
488 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon92aee3d2016-12-21 09:20:25 -0500489 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, analysis);
cdalton6fd158e2015-05-27 15:08:33 -0700490
491 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400492 case SkBlendMode::kClear:
cdalton1fa45722015-06-02 10:43:39 -0700493 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst);
494 TEST_ASSERT(0 == xpi.fBlendedColor.fKnownColor);
495 TEST_ASSERT(kRGBA_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -0500496 TEST_ASSERT(kIgnoreColor_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700497 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
498 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
499 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
500 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
501 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
502 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
503 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400504 case SkBlendMode::kSrc:
cdalton1fa45722015-06-02 10:43:39 -0700505 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst);
506 TEST_ASSERT(229 == GrColorUnpackR(xpi.fBlendedColor.fKnownColor));
507 TEST_ASSERT(154 == GrColorUnpackB(xpi.fBlendedColor.fKnownColor));
cdalton6fd158e2015-05-27 15:08:33 -0700508 TEST_ASSERT((kR_GrColorComponentFlag |
cdalton1fa45722015-06-02 10:43:39 -0700509 kB_GrColorComponentFlag) == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -0500510 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700511 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
512 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
513 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
514 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
515 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
516 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
517 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400518 case SkBlendMode::kDst:
cdalton1fa45722015-06-02 10:43:39 -0700519 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
520 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700521 TEST_ASSERT((kSkipDraw_OptFlag |
522 kIgnoreColor_OptFlag |
cdalton6fd158e2015-05-27 15:08:33 -0700523 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
524 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
525 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
526 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
527 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
528 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
529 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
530 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400531 case SkBlendMode::kSrcOver:
cdalton1fa45722015-06-02 10:43:39 -0700532 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
533 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -0500534 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700535 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
536 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
537 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
538 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
539 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
540 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
541 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400542 case SkBlendMode::kDstOver:
cdalton1fa45722015-06-02 10:43:39 -0700543 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
544 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -0500545 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700546 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
547 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
548 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
549 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
550 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
551 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
552 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400553 case SkBlendMode::kSrcIn:
cdalton1fa45722015-06-02 10:43:39 -0700554 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
555 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -0500556 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700557 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
558 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
559 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
560 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
561 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
562 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
563 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400564 case SkBlendMode::kDstIn:
cdalton1fa45722015-06-02 10:43:39 -0700565 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
566 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -0500567 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700568 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
569 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
570 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
571 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
572 TEST_ASSERT(kSA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
573 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
574 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400575 case SkBlendMode::kSrcOut:
cdalton1fa45722015-06-02 10:43:39 -0700576 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
577 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -0500578 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700579 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
580 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
581 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
582 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
583 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
584 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
585 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400586 case SkBlendMode::kDstOut:
cdalton1fa45722015-06-02 10:43:39 -0700587 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
588 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -0500589 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700590 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
591 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
592 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
593 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
594 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
595 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
596 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400597 case SkBlendMode::kSrcATop:
cdalton1fa45722015-06-02 10:43:39 -0700598 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
599 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -0500600 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700601 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
602 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
603 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
604 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
605 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
606 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
607 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400608 case SkBlendMode::kDstATop:
cdalton1fa45722015-06-02 10:43:39 -0700609 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
610 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -0500611 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700612 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
613 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
614 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
615 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
616 TEST_ASSERT(kSA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
617 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
618 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400619 case SkBlendMode::kXor:
cdalton1fa45722015-06-02 10:43:39 -0700620 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
621 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -0500622 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700623 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
624 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
625 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
626 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
627 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
628 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
629 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400630 case SkBlendMode::kPlus:
cdalton1fa45722015-06-02 10:43:39 -0700631 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
632 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -0500633 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700634 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
635 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
636 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
637 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
638 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
639 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
640 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400641 case SkBlendMode::kModulate:
cdalton1fa45722015-06-02 10:43:39 -0700642 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
643 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -0500644 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700645 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
646 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
647 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
648 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
649 TEST_ASSERT(kSC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
650 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
651 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400652 case SkBlendMode::kScreen:
cdalton1fa45722015-06-02 10:43:39 -0700653 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
654 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -0500655 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700656 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
657 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
658 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
659 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
660 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
661 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
662 break;
663 default:
664 ERRORF(reporter, "Invalid xfermode.");
665 break;
666 }
667 }
668}
669
670static void test_color_opaque_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomon92aee3d2016-12-21 09:20:25 -0500671 GrPipelineAnalysis analysis;
672 analysis.fColorPOI.calcWithInitialValues(nullptr, 0, GrColorPackA4(255),
673 kA_GrColorComponentFlag, false);
674 analysis.fCoveragePOI.calcWithInitialValues(nullptr, 0, 0, kNone_GrColorComponentFlags, true);
cdalton6fd158e2015-05-27 15:08:33 -0700675
Brian Salomon92aee3d2016-12-21 09:20:25 -0500676 SkASSERT(analysis.fColorPOI.isOpaque());
677 SkASSERT(!analysis.fColorPOI.isSolidWhite());
678 SkASSERT(!analysis.fCoveragePOI.isSolidWhite());
679 SkASSERT(!analysis.fCoveragePOI.isFourChannelOutput());
cdalton6fd158e2015-05-27 15:08:33 -0700680
Mike Reed7d954ad2016-10-28 15:42:34 -0400681 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
682 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon92aee3d2016-12-21 09:20:25 -0500683 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, analysis);
cdalton6fd158e2015-05-27 15:08:33 -0700684
685 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400686 case SkBlendMode::kClear:
cdalton1fa45722015-06-02 10:43:39 -0700687 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst);
688 TEST_ASSERT(0 == xpi.fBlendedColor.fKnownColor);
689 TEST_ASSERT(kRGBA_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700690 TEST_ASSERT((kIgnoreColor_OptFlag) == xpi.fOptFlags);
691 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
692 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
693 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
694 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
695 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
696 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
697 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400698 case SkBlendMode::kSrc:
cdalton1fa45722015-06-02 10:43:39 -0700699 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst);
700 TEST_ASSERT(255 == GrColorUnpackA(xpi.fBlendedColor.fKnownColor));
701 TEST_ASSERT(kA_GrColorComponentFlag == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700702 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
703 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
704 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
705 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
706 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
707 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
708 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
709 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400710 case SkBlendMode::kDst:
cdalton1fa45722015-06-02 10:43:39 -0700711 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
712 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700713 TEST_ASSERT((kSkipDraw_OptFlag |
714 kIgnoreColor_OptFlag |
cdalton6fd158e2015-05-27 15:08:33 -0700715 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
716 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
717 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
718 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
719 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
720 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
721 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
722 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400723 case SkBlendMode::kSrcOver:
cdalton1fa45722015-06-02 10:43:39 -0700724 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst);
725 TEST_ASSERT(255 == GrColorUnpackA(xpi.fBlendedColor.fKnownColor));
726 TEST_ASSERT(kA_GrColorComponentFlag == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700727 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
728 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
729 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
730 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
731 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
732 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
733 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
734 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400735 case SkBlendMode::kDstOver:
cdalton1fa45722015-06-02 10:43:39 -0700736 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
737 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700738 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
739 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
740 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
741 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
742 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
743 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
744 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
745 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400746 case SkBlendMode::kSrcIn:
cdalton1fa45722015-06-02 10:43:39 -0700747 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
748 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700749 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
750 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
751 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
752 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
753 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
754 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
755 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
756 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400757 case SkBlendMode::kDstIn:
cdalton1fa45722015-06-02 10:43:39 -0700758 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
759 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700760 TEST_ASSERT((kSkipDraw_OptFlag |
761 kIgnoreColor_OptFlag |
cdalton6fd158e2015-05-27 15:08:33 -0700762 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
763 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
764 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
765 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
766 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
767 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
768 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
769 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400770 case SkBlendMode::kSrcOut:
cdalton1fa45722015-06-02 10:43:39 -0700771 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
772 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700773 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
774 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
775 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
776 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
777 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
778 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
779 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
780 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400781 case SkBlendMode::kDstOut:
cdalton1fa45722015-06-02 10:43:39 -0700782 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst);
783 TEST_ASSERT(0 == xpi.fBlendedColor.fKnownColor);
784 TEST_ASSERT(kRGBA_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700785 TEST_ASSERT((kIgnoreColor_OptFlag) == xpi.fOptFlags);
786 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
787 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
788 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
789 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
790 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
791 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
792 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400793 case SkBlendMode::kSrcATop:
cdalton1fa45722015-06-02 10:43:39 -0700794 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
795 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700796 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
797 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
798 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
799 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
800 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
801 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
802 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
803 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400804 case SkBlendMode::kDstATop:
cdalton1fa45722015-06-02 10:43:39 -0700805 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
806 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700807 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
808 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
809 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
810 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
811 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
812 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
813 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
814 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400815 case SkBlendMode::kXor:
cdalton1fa45722015-06-02 10:43:39 -0700816 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
817 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700818 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
819 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
820 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
821 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
822 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
823 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
824 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
825 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400826 case SkBlendMode::kPlus:
cdalton1fa45722015-06-02 10:43:39 -0700827 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
828 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700829 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
830 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
831 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
832 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
833 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
834 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
835 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
836 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400837 case SkBlendMode::kModulate:
cdalton1fa45722015-06-02 10:43:39 -0700838 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
839 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
bsalomon7765a472015-07-08 11:26:37 -0700840 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700841 TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType);
842 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
843 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
844 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
845 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
846 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
847 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400848 case SkBlendMode::kScreen:
cdalton1fa45722015-06-02 10:43:39 -0700849 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
850 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700851 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
852 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
853 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
854 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
855 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
856 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
857 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
858 break;
859 default:
860 ERRORF(reporter, "Invalid xfermode.");
861 break;
862 }
863 }
864}
865
866static void test_color_opaque_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomon92aee3d2016-12-21 09:20:25 -0500867 GrPipelineAnalysis analysis;
868 analysis.fColorPOI.calcWithInitialValues(nullptr, 0, GrColorPackRGBA(0, 82, 0, 255),
869 kG_GrColorComponentFlag | kA_GrColorComponentFlag,
870 false);
871 analysis.fCoveragePOI.calcWithInitialValues(nullptr, 0, GrColorPackA4(255),
872 kRGBA_GrColorComponentFlags, true);
cdalton6fd158e2015-05-27 15:08:33 -0700873
Brian Salomon92aee3d2016-12-21 09:20:25 -0500874 SkASSERT(analysis.fColorPOI.isOpaque());
875 SkASSERT(!analysis.fColorPOI.isSolidWhite());
876 SkASSERT(analysis.fCoveragePOI.isSolidWhite());
877 SkASSERT(!analysis.fCoveragePOI.isFourChannelOutput());
cdalton6fd158e2015-05-27 15:08:33 -0700878
Mike Reed7d954ad2016-10-28 15:42:34 -0400879 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
880 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon92aee3d2016-12-21 09:20:25 -0500881 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, analysis);
cdalton6fd158e2015-05-27 15:08:33 -0700882
883 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400884 case SkBlendMode::kClear:
cdalton1fa45722015-06-02 10:43:39 -0700885 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst);
886 TEST_ASSERT(0 == xpi.fBlendedColor.fKnownColor);
887 TEST_ASSERT(kRGBA_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -0500888 TEST_ASSERT(kIgnoreColor_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700889 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
890 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
891 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
892 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
893 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
894 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
895 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400896 case SkBlendMode::kSrc:
cdalton1fa45722015-06-02 10:43:39 -0700897 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst);
898 TEST_ASSERT(82 == GrColorUnpackG(xpi.fBlendedColor.fKnownColor));
899 TEST_ASSERT(255 == GrColorUnpackA(xpi.fBlendedColor.fKnownColor));
cdalton6fd158e2015-05-27 15:08:33 -0700900 TEST_ASSERT((kG_GrColorComponentFlag |
cdalton1fa45722015-06-02 10:43:39 -0700901 kA_GrColorComponentFlag) == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -0500902 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700903 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
904 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
905 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
906 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
907 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
908 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
909 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400910 case SkBlendMode::kDst:
cdalton1fa45722015-06-02 10:43:39 -0700911 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
912 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700913 TEST_ASSERT((kSkipDraw_OptFlag |
914 kIgnoreColor_OptFlag |
cdalton6fd158e2015-05-27 15:08:33 -0700915 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
916 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
917 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
918 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
919 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
920 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
921 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
922 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400923 case SkBlendMode::kSrcOver:
cdalton1fa45722015-06-02 10:43:39 -0700924 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst);
925 TEST_ASSERT(82 == GrColorUnpackG(xpi.fBlendedColor.fKnownColor));
926 TEST_ASSERT(255 == GrColorUnpackA(xpi.fBlendedColor.fKnownColor));
cdalton6fd158e2015-05-27 15:08:33 -0700927 TEST_ASSERT((kG_GrColorComponentFlag |
cdalton1fa45722015-06-02 10:43:39 -0700928 kA_GrColorComponentFlag) == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -0500929 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700930 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
931 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
932 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
933 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
934 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
935 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
936 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400937 case SkBlendMode::kDstOver:
cdalton1fa45722015-06-02 10:43:39 -0700938 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
939 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -0500940 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700941 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
942 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
943 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
944 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
945 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
946 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
947 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400948 case SkBlendMode::kSrcIn:
cdalton1fa45722015-06-02 10:43:39 -0700949 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
950 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -0500951 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700952 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
953 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
954 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
955 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
956 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
957 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
958 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400959 case SkBlendMode::kDstIn:
cdalton1fa45722015-06-02 10:43:39 -0700960 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
961 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700962 TEST_ASSERT((kSkipDraw_OptFlag |
963 kIgnoreColor_OptFlag |
cdalton6fd158e2015-05-27 15:08:33 -0700964 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
965 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
966 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
967 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
968 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
969 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
970 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
971 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400972 case SkBlendMode::kSrcOut:
cdalton1fa45722015-06-02 10:43:39 -0700973 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
974 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -0500975 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700976 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
977 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
978 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
979 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
980 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
981 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
982 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400983 case SkBlendMode::kDstOut:
cdalton1fa45722015-06-02 10:43:39 -0700984 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst);
985 TEST_ASSERT(0 == xpi.fBlendedColor.fKnownColor);
986 TEST_ASSERT(kRGBA_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -0500987 TEST_ASSERT(kIgnoreColor_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700988 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
989 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
990 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
991 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
992 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
993 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
994 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400995 case SkBlendMode::kSrcATop:
cdalton1fa45722015-06-02 10:43:39 -0700996 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
997 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -0500998 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700999 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
1000 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
1001 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
1002 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
1003 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
1004 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
1005 break;
Mike Reed7d954ad2016-10-28 15:42:34 -04001006 case SkBlendMode::kDstATop:
cdalton1fa45722015-06-02 10:43:39 -07001007 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
1008 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -05001009 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -07001010 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
1011 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
1012 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
1013 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
1014 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
1015 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
1016 break;
Mike Reed7d954ad2016-10-28 15:42:34 -04001017 case SkBlendMode::kXor:
cdalton1fa45722015-06-02 10:43:39 -07001018 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
1019 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -05001020 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -07001021 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
1022 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
1023 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
1024 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
1025 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
1026 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
1027 break;
Mike Reed7d954ad2016-10-28 15:42:34 -04001028 case SkBlendMode::kPlus:
cdalton1fa45722015-06-02 10:43:39 -07001029 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
1030 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -05001031 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -07001032 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
1033 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
1034 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
1035 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
1036 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
1037 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
1038 break;
Mike Reed7d954ad2016-10-28 15:42:34 -04001039 case SkBlendMode::kModulate:
cdalton1fa45722015-06-02 10:43:39 -07001040 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
1041 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -05001042 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -07001043 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
1044 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
1045 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
1046 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
1047 TEST_ASSERT(kSC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
1048 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
1049 break;
Mike Reed7d954ad2016-10-28 15:42:34 -04001050 case SkBlendMode::kScreen:
cdalton1fa45722015-06-02 10:43:39 -07001051 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
1052 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
Brian Salomon8c852be2017-01-04 10:44:42 -05001053 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -07001054 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
1055 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
1056 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
1057 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
1058 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
1059 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
1060 break;
1061 default:
1062 ERRORF(reporter, "Invalid xfermode.");
1063 break;
1064 }
1065 }
1066}
1067
egdaniel723b0502015-09-15 09:31:40 -07001068static void test_lcd_coverage_fallback_case(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomon92aee3d2016-12-21 09:20:25 -05001069 class TestLCDCoverageOp : public GrMeshDrawOp {
reed1b55a962015-09-17 20:16:13 -07001070 public:
Brian Salomon25a88092016-12-01 09:36:50 -05001071 DEFINE_OP_CLASS_ID
reed1b55a962015-09-17 20:16:13 -07001072
Brian Salomon92aee3d2016-12-21 09:20:25 -05001073 TestLCDCoverageOp() : INHERITED(ClassID()) {}
cdalton6fd158e2015-05-27 15:08:33 -07001074
Brian Salomon09d994e2016-12-21 11:14:46 -05001075 const char* name() const override { return "Test LCD Text Op"; }
Brian Salomon92aee3d2016-12-21 09:20:25 -05001076
1077 private:
1078 void getPipelineAnalysisInput(GrPipelineAnalysisDrawOpInput* input) const override {
1079 input->pipelineColorInput()->setKnownFourComponents(GrColorPackRGBA(123, 45, 67, 221));
1080 input->pipelineCoverageInput()->setUnknownFourComponents();
1081 input->pipelineCoverageInput()->setUsingLCDCoverage();
1082 }
1083
1084 void applyPipelineOptimizations(const GrPipelineOptimizations&) override {}
Brian Salomon25a88092016-12-01 09:36:50 -05001085 bool onCombineIfPossible(GrOp*, const GrCaps&) override { return false; }
Mike Kleinfc6c37b2016-09-27 09:34:10 -04001086 void onPrepareDraws(Target*) const override {}
cdalton6fd158e2015-05-27 15:08:33 -07001087
Brian Salomondad29232016-12-01 16:40:24 -05001088 typedef GrMeshDrawOp INHERITED;
Brian Salomon92aee3d2016-12-21 09:20:25 -05001089 } testLCDCoverageOp;
cdalton6fd158e2015-05-27 15:08:33 -07001090
Brian Salomon92aee3d2016-12-21 09:20:25 -05001091 GrPipelineAnalysis analysis;
1092 testLCDCoverageOp.initPipelineAnalysis(&analysis);
1093 GrProcOptInfo colorPOI = analysis.fColorPOI;
1094 GrProcOptInfo covPOI = analysis.fCoveragePOI;
cdalton6fd158e2015-05-27 15:08:33 -07001095
1096 SkASSERT(kRGBA_GrColorComponentFlags == colorPOI.validFlags());
1097 SkASSERT(covPOI.isFourChannelOutput());
1098
Mike Reed7d954ad2016-10-28 15:42:34 -04001099 sk_sp<GrXPFactory> xpf(GrPorterDuffXPFactory::Make(SkBlendMode::kSrcOver));
Brian Salomon92aee3d2016-12-21 09:20:25 -05001100 TEST_ASSERT(!xpf->willNeedDstTexture(caps, analysis));
cdalton6fd158e2015-05-27 15:08:33 -07001101
Brian Salomon92aee3d2016-12-21 09:20:25 -05001102 sk_sp<GrXferProcessor> xp(xpf->createXferProcessor(analysis, false, nullptr, caps));
cdalton6fd158e2015-05-27 15:08:33 -07001103 if (!xp) {
1104 ERRORF(reporter, "Failed to create an XP with LCD coverage.");
1105 return;
1106 }
1107
cdalton1fa45722015-06-02 10:43:39 -07001108 GrXPFactory::InvariantBlendedColor blendedColor;
1109 xpf->getInvariantBlendedColor(colorPOI, &blendedColor);
1110 TEST_ASSERT(blendedColor.fWillBlendWithDst);
1111 TEST_ASSERT(kNone_GrColorComponentFlags == blendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -07001112
1113 GrColor overrideColor;
Brian Salomon92aee3d2016-12-21 09:20:25 -05001114 xp->getOptimizations(analysis, false, &overrideColor, caps);
cdalton6fd158e2015-05-27 15:08:33 -07001115
1116 GrXferProcessor::BlendInfo blendInfo;
1117 xp->getBlendInfo(&blendInfo);
1118 TEST_ASSERT(blendInfo.fWriteColor);
1119}
1120
kkinnunen15302832015-12-01 04:35:26 -08001121DEF_GPUTEST(PorterDuffNoDualSourceBlending, reporter, /*factory*/) {
cdalton6fd158e2015-05-27 15:08:33 -07001122 GrContextOptions opts;
1123 opts.fSuppressDualSourceBlending = true;
bsalomon3724e572016-03-30 18:56:19 -07001124 sk_gpu_test::GrContextFactory mockFactory(opts);
bsalomon85b4b532016-04-05 11:06:27 -07001125 GrContext* ctx = mockFactory.get(sk_gpu_test::GrContextFactory::kNullGL_ContextType);
cdalton6fd158e2015-05-27 15:08:33 -07001126 if (!ctx) {
1127 SkFAIL("Failed to create null context without ARB_blend_func_extended.");
1128 return;
1129 }
1130
bsalomon76228632015-05-29 08:02:10 -07001131 const GrCaps& caps = *ctx->caps();
cdalton6fd158e2015-05-27 15:08:33 -07001132 if (caps.shaderCaps()->dualSourceBlendingSupport()) {
1133 SkFAIL("Null context failed to honor request for no ARB_blend_func_extended.");
1134 return;
1135 }
1136
bsalomon091f60c2015-11-10 11:54:56 -08001137 GrBackendObject backendTex =
bungeman6bd52842016-10-27 09:30:08 -07001138 ctx->getGpu()->createTestingOnlyBackendTexture(nullptr, 100, 100, kRGBA_8888_GrPixelConfig);
cdalton6fd158e2015-05-27 15:08:33 -07001139 GrBackendTextureDesc fakeDesc;
1140 fakeDesc.fConfig = kRGBA_8888_GrPixelConfig;
1141 fakeDesc.fWidth = fakeDesc.fHeight = 100;
bsalomon091f60c2015-11-10 11:54:56 -08001142 fakeDesc.fTextureHandle = backendTex;
cdalton6fd158e2015-05-27 15:08:33 -07001143 GrXferProcessor::DstTexture fakeDstTexture;
bungeman6bd52842016-10-27 09:30:08 -07001144 fakeDstTexture.setTexture(
1145 ctx->textureProvider()->wrapBackendTexture(fakeDesc, kBorrow_GrWrapOwnership));
cdalton6fd158e2015-05-27 15:08:33 -07001146
1147 static const GrColor testColors[] = {
1148 0,
1149 GrColorPackRGBA(0, 82, 0, 255),
1150 GrColorPackA4(255)
1151 };
1152 static const GrColorComponentFlags testColorFlags[] = {
1153 kNone_GrColorComponentFlags,
1154 kG_GrColorComponentFlag | kA_GrColorComponentFlag,
1155 kRGBA_GrColorComponentFlags
1156 };
1157 GR_STATIC_ASSERT(SK_ARRAY_COUNT(testColors) == SK_ARRAY_COUNT(testColorFlags));
1158
1159 for (size_t c = 0; c < SK_ARRAY_COUNT(testColors); c++) {
Brian Salomon92aee3d2016-12-21 09:20:25 -05001160 GrPipelineAnalysis analysis;
1161 analysis.fColorPOI.calcWithInitialValues(nullptr, 0, testColors[c], testColorFlags[c],
1162 false);
cdalton6fd158e2015-05-27 15:08:33 -07001163 for (int f = 0; f <= 1; f++) {
cdalton6fd158e2015-05-27 15:08:33 -07001164 if (!f) {
Brian Salomon92aee3d2016-12-21 09:20:25 -05001165 analysis.fCoveragePOI.calcWithInitialValues(nullptr, 0, 0,
1166 kNone_GrColorComponentFlags, true);
cdalton6fd158e2015-05-27 15:08:33 -07001167 } else {
Brian Salomon92aee3d2016-12-21 09:20:25 -05001168 analysis.fCoveragePOI.calcWithInitialValues(nullptr, 0, GrColorPackA4(255),
1169 kRGBA_GrColorComponentFlags, true);
cdalton6fd158e2015-05-27 15:08:33 -07001170 }
Mike Reed7d954ad2016-10-28 15:42:34 -04001171 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
1172 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
bungeman06ca8ec2016-06-09 08:01:03 -07001173 sk_sp<GrXPFactory> xpf(GrPorterDuffXPFactory::Make(xfermode));
cdalton86ae0a92015-06-08 15:11:04 -07001174 GrXferProcessor::DstTexture* dstTexture =
Brian Salomon92aee3d2016-12-21 09:20:25 -05001175 xpf->willNeedDstTexture(caps, analysis) ? &fakeDstTexture : 0;
Hal Canary342b7ac2016-11-04 11:49:42 -04001176 sk_sp<GrXferProcessor> xp(
Brian Salomon92aee3d2016-12-21 09:20:25 -05001177 xpf->createXferProcessor(analysis, false, dstTexture, caps));
cdalton6fd158e2015-05-27 15:08:33 -07001178 if (!xp) {
1179 ERRORF(reporter, "Failed to create an XP without dual source blending.");
1180 return;
1181 }
1182 TEST_ASSERT(!xp->hasSecondaryOutput());
Brian Salomon92aee3d2016-12-21 09:20:25 -05001183 xp->getOptimizations(analysis, false, 0, caps);
cdalton6fd158e2015-05-27 15:08:33 -07001184 TEST_ASSERT(!xp->hasSecondaryOutput());
1185 }
1186 }
1187 }
bsalomon091f60c2015-11-10 11:54:56 -08001188 ctx->getGpu()->deleteTestingOnlyBackendTexture(backendTex);
cdalton6fd158e2015-05-27 15:08:33 -07001189}
1190
1191#endif