blob: de1843813af682ae28f864e17f83d714a5e14251 [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 kIgnoreColor_OptFlag = GrXferProcessor::kIgnoreColor_OptFlag,
cdalton6fd158e2015-05-27 15:08:33 -070061 kCanTweakAlphaForCoverage_OptFlag = GrXferProcessor::kCanTweakAlphaForCoverage_OptFlag
62};
63
64class GrPorterDuffTest {
65public:
66 struct XPInfo {
Mike Reed7d954ad2016-10-28 15:42:34 -040067 XPInfo(skiatest::Reporter* reporter, SkBlendMode xfermode, const GrCaps& caps,
Brian Salomon5298dc82017-02-22 11:52:03 -050068 const GrProcessorSet::FragmentProcessorAnalysis& analysis) {
Brian Salomona1633922017-01-09 11:46:10 -050069 const GrXPFactory* xpf = GrPorterDuffXPFactory::Get(xfermode);
Brian Salomon54d212e2017-03-21 14:22:38 -040070 // The GrXPFactory query assumes no coverage.
71 fCanCombineOverlappedStencilAndCover =
72 !analysis.hasCoverage() && GrXPFactory::CanCombineOverlappedStencilAndCover(
73 xpf, analysis.isOutputColorOpaque());
Brian Salomon92aee3d2016-12-21 09:20:25 -050074 sk_sp<GrXferProcessor> xp(xpf->createXferProcessor(analysis, false, nullptr, caps));
Brian Salomon5298dc82017-02-22 11:52:03 -050075 TEST_ASSERT(!GrXPFactory::WillNeedDstTexture(xpf, caps, analysis));
Brian Salomon1c10fdd2017-03-03 14:30:15 -050076 fOptFlags = xp->getOptimizations(analysis);
Hal Canary342b7ac2016-11-04 11:49:42 -040077 GetXPOutputTypes(xp.get(), &fPrimaryOutputType, &fSecondaryOutputType);
cdalton6fd158e2015-05-27 15:08:33 -070078 xp->getBlendInfo(&fBlendInfo);
79 TEST_ASSERT(!xp->willReadDstColor());
80 TEST_ASSERT(xp->hasSecondaryOutput() == GrBlendCoeffRefsSrc2(fBlendInfo.fDstBlend));
81 }
82
Brian Salomon54d212e2017-03-21 14:22:38 -040083 bool fCanCombineOverlappedStencilAndCover;
cdalton6fd158e2015-05-27 15:08:33 -070084 int fOptFlags;
85 int fPrimaryOutputType;
86 int fSecondaryOutputType;
87 GrXferProcessor::BlendInfo fBlendInfo;
88 };
89
90 static void GetXPOutputTypes(const GrXferProcessor* xp, int* outPrimary, int* outSecondary) {
egdanielf2342722015-11-20 15:12:59 -080091 GrPorterDuffXPFactory::TestGetXPOutputTypes(xp, outPrimary, outSecondary);
cdalton6fd158e2015-05-27 15:08:33 -070092 }
93};
94
egdaniel723b0502015-09-15 09:31:40 -070095static void test_lcd_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomon5298dc82017-02-22 11:52:03 -050096 GrPipelineInput lcdInput;
97 lcdInput.setToLCDCoverage();
98 GrProcessorSet::FragmentProcessorAnalysis analysis(GrPipelineInput(), lcdInput, caps);
egdaniel723b0502015-09-15 09:31:40 -070099
Brian Salomon5298dc82017-02-22 11:52:03 -0500100 SkASSERT(!analysis.isOutputColorOpaque());
101 SkASSERT(!analysis.hasKnownOutputColor());
102 SkASSERT(analysis.hasLCDCoverage());
egdaniel723b0502015-09-15 09:31:40 -0700103
Mike Reed7d954ad2016-10-28 15:42:34 -0400104 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
105 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon92aee3d2016-12-21 09:20:25 -0500106 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, analysis);
egdaniel723b0502015-09-15 09:31:40 -0700107 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400108 case SkBlendMode::kClear:
Brian Salomon54d212e2017-03-21 14:22:38 -0400109 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
egdaniel723b0502015-09-15 09:31:40 -0700110 TEST_ASSERT((kIgnoreColor_OptFlag) == xpi.fOptFlags);
111 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
112 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
113 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
114 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
115 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
116 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
117 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400118 case SkBlendMode::kSrc:
Brian Salomon54d212e2017-03-21 14:22:38 -0400119 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
egdaniel723b0502015-09-15 09:31:40 -0700120 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
121 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
122 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
123 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
124 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
125 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
126 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
127 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400128 case SkBlendMode::kDst:
Brian Salomon54d212e2017-03-21 14:22:38 -0400129 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon02baee92017-02-24 10:37:15 -0500130 TEST_ASSERT((kIgnoreColor_OptFlag |
egdaniel723b0502015-09-15 09:31:40 -0700131 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
132 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
133 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
134 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
135 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
136 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
137 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
138 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400139 case SkBlendMode::kSrcOver:
Brian Salomon54d212e2017-03-21 14:22:38 -0400140 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
egdaniel723b0502015-09-15 09:31:40 -0700141 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
142 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
143 TEST_ASSERT(kSAModulate_OutputType == xpi.fSecondaryOutputType);
144 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
145 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
146 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
147 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
148 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400149 case SkBlendMode::kDstOver:
Brian Salomon54d212e2017-03-21 14:22:38 -0400150 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
egdaniel723b0502015-09-15 09:31:40 -0700151 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
152 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
153 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
154 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
155 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
156 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
157 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
158 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400159 case SkBlendMode::kSrcIn:
Brian Salomon54d212e2017-03-21 14:22:38 -0400160 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
egdaniel723b0502015-09-15 09:31:40 -0700161 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
162 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
163 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
164 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
165 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
166 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
167 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
168 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400169 case SkBlendMode::kDstIn:
Brian Salomon54d212e2017-03-21 14:22:38 -0400170 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
egdaniel723b0502015-09-15 09:31:40 -0700171 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
172 TEST_ASSERT(kISAModulate_OutputType == xpi.fPrimaryOutputType);
173 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
174 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
175 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
176 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
177 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
178 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400179 case SkBlendMode::kSrcOut:
Brian Salomon54d212e2017-03-21 14:22:38 -0400180 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
egdaniel723b0502015-09-15 09:31:40 -0700181 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
182 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
183 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
184 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
185 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
186 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
187 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
188 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400189 case SkBlendMode::kDstOut:
Brian Salomon54d212e2017-03-21 14:22:38 -0400190 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
egdaniel723b0502015-09-15 09:31:40 -0700191 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
192 TEST_ASSERT(kSAModulate_OutputType == xpi.fPrimaryOutputType);
193 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
194 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
195 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
196 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
197 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
198 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400199 case SkBlendMode::kSrcATop:
Brian Salomon54d212e2017-03-21 14:22:38 -0400200 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
egdaniel723b0502015-09-15 09:31:40 -0700201 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
202 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
203 TEST_ASSERT(kSAModulate_OutputType == xpi.fSecondaryOutputType);
204 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
205 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
206 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
207 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
208 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400209 case SkBlendMode::kDstATop:
Brian Salomon54d212e2017-03-21 14:22:38 -0400210 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
egdaniel723b0502015-09-15 09:31:40 -0700211 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
212 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
213 TEST_ASSERT(kISAModulate_OutputType == xpi.fSecondaryOutputType);
214 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
215 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
216 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
217 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
218 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400219 case SkBlendMode::kXor:
Brian Salomon54d212e2017-03-21 14:22:38 -0400220 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
egdaniel723b0502015-09-15 09:31:40 -0700221 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
222 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
223 TEST_ASSERT(kSAModulate_OutputType == xpi.fSecondaryOutputType);
224 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
225 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
226 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
227 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
228 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400229 case SkBlendMode::kPlus:
Brian Salomon54d212e2017-03-21 14:22:38 -0400230 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
egdaniel723b0502015-09-15 09:31:40 -0700231 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
232 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
233 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
234 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
235 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
236 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
237 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
238 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400239 case SkBlendMode::kModulate:
Brian Salomon54d212e2017-03-21 14:22:38 -0400240 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
egdaniel723b0502015-09-15 09:31:40 -0700241 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
242 TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType);
243 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
244 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
245 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
246 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
247 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
248 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400249 case SkBlendMode::kScreen:
Brian Salomon54d212e2017-03-21 14:22:38 -0400250 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
egdaniel723b0502015-09-15 09:31:40 -0700251 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
252 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
253 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
254 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
255 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
256 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
257 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
258 break;
259 default:
260 ERRORF(reporter, "Invalid xfermode.");
261 break;
262 }
263 }
264}
cdalton6fd158e2015-05-27 15:08:33 -0700265static void test_color_unknown_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomon5298dc82017-02-22 11:52:03 -0500266 GrProcessorSet::FragmentProcessorAnalysis analysis(GrPipelineInput(), GrPipelineInput(), caps);
cdalton6fd158e2015-05-27 15:08:33 -0700267
Brian Salomon5298dc82017-02-22 11:52:03 -0500268 SkASSERT(!analysis.isOutputColorOpaque());
269 SkASSERT(!analysis.hasKnownOutputColor());
270 SkASSERT(!analysis.hasLCDCoverage());
271 SkASSERT(analysis.hasCoverage());
cdalton6fd158e2015-05-27 15:08:33 -0700272
Mike Reed7d954ad2016-10-28 15:42:34 -0400273 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
274 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon92aee3d2016-12-21 09:20:25 -0500275 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, analysis);
cdalton6fd158e2015-05-27 15:08:33 -0700276 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400277 case SkBlendMode::kClear:
Brian Salomon54d212e2017-03-21 14:22:38 -0400278 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
cdalton6fd158e2015-05-27 15:08:33 -0700279 TEST_ASSERT((kIgnoreColor_OptFlag) == xpi.fOptFlags);
280 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
281 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
282 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
283 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
284 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
285 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
286 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400287 case SkBlendMode::kSrc:
Brian Salomon54d212e2017-03-21 14:22:38 -0400288 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
bsalomon7765a472015-07-08 11:26:37 -0700289 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700290 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
291 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
292 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
293 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
294 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
295 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
296 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400297 case SkBlendMode::kDst:
Brian Salomon54d212e2017-03-21 14:22:38 -0400298 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon02baee92017-02-24 10:37:15 -0500299 TEST_ASSERT((kIgnoreColor_OptFlag |
cdalton6fd158e2015-05-27 15:08:33 -0700300 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
301 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
302 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
303 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
304 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
305 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
306 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
307 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400308 case SkBlendMode::kSrcOver:
Brian Salomon54d212e2017-03-21 14:22:38 -0400309 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
cdalton6fd158e2015-05-27 15:08:33 -0700310 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
311 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
312 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
313 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
314 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
315 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
316 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
317 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400318 case SkBlendMode::kDstOver:
Brian Salomon54d212e2017-03-21 14:22:38 -0400319 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
cdalton6fd158e2015-05-27 15:08:33 -0700320 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
321 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
322 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
323 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
324 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
325 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
326 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
327 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400328 case SkBlendMode::kSrcIn:
Brian Salomon54d212e2017-03-21 14:22:38 -0400329 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
bsalomon7765a472015-07-08 11:26:37 -0700330 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700331 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
332 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
333 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
334 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
335 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
336 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
337 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400338 case SkBlendMode::kDstIn:
Brian Salomon54d212e2017-03-21 14:22:38 -0400339 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
bsalomon7765a472015-07-08 11:26:37 -0700340 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700341 TEST_ASSERT(kISAModulate_OutputType == xpi.fPrimaryOutputType);
342 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
343 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
344 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
345 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
346 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
347 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400348 case SkBlendMode::kSrcOut:
Brian Salomon54d212e2017-03-21 14:22:38 -0400349 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
bsalomon7765a472015-07-08 11:26:37 -0700350 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700351 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
352 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
353 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
354 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
355 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
356 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
357 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400358 case SkBlendMode::kDstOut:
Brian Salomon54d212e2017-03-21 14:22:38 -0400359 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
cdalton6fd158e2015-05-27 15:08:33 -0700360 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
361 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
362 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
363 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
364 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
365 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
366 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
367 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400368 case SkBlendMode::kSrcATop:
Brian Salomon54d212e2017-03-21 14:22:38 -0400369 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
cdalton6fd158e2015-05-27 15:08:33 -0700370 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
371 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
372 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
373 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
374 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
375 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
376 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
377 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400378 case SkBlendMode::kDstATop:
Brian Salomon54d212e2017-03-21 14:22:38 -0400379 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
bsalomon7765a472015-07-08 11:26:37 -0700380 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700381 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
382 TEST_ASSERT(kISAModulate_OutputType == xpi.fSecondaryOutputType);
383 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
384 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
385 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
386 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
387 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400388 case SkBlendMode::kXor:
Brian Salomon54d212e2017-03-21 14:22:38 -0400389 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
cdalton6fd158e2015-05-27 15:08:33 -0700390 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
391 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
392 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
393 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
394 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
395 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
396 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
397 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400398 case SkBlendMode::kPlus:
Brian Salomon54d212e2017-03-21 14:22:38 -0400399 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
cdalton6fd158e2015-05-27 15:08:33 -0700400 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
401 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
402 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
403 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
404 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
405 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
406 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
407 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400408 case SkBlendMode::kModulate:
Brian Salomon54d212e2017-03-21 14:22:38 -0400409 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
bsalomon7765a472015-07-08 11:26:37 -0700410 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700411 TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType);
412 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
413 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
414 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
415 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
416 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
417 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400418 case SkBlendMode::kScreen:
Brian Salomon54d212e2017-03-21 14:22:38 -0400419 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
cdalton6fd158e2015-05-27 15:08:33 -0700420 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
421 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
422 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
423 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
424 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
425 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
426 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
427 break;
428 default:
429 ERRORF(reporter, "Invalid xfermode.");
430 break;
431 }
432 }
433}
434
435static void test_color_unknown_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomon5298dc82017-02-22 11:52:03 -0500436 GrProcessorSet::FragmentProcessorAnalysis analysis(GrColorPackRGBA(229, 0, 154, 240),
437 GrColorPackA4(255), caps);
cdalton6fd158e2015-05-27 15:08:33 -0700438
Brian Salomon5298dc82017-02-22 11:52:03 -0500439 SkASSERT(!analysis.isOutputColorOpaque());
440 SkASSERT(analysis.hasKnownOutputColor());
441 SkASSERT(!analysis.hasCoverage());
cdalton6fd158e2015-05-27 15:08:33 -0700442
Mike Reed7d954ad2016-10-28 15:42:34 -0400443 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
444 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon92aee3d2016-12-21 09:20:25 -0500445 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, analysis);
cdalton6fd158e2015-05-27 15:08:33 -0700446 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400447 case SkBlendMode::kClear:
Brian Salomon54d212e2017-03-21 14:22:38 -0400448 TEST_ASSERT(xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon8c852be2017-01-04 10:44:42 -0500449 TEST_ASSERT(kIgnoreColor_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700450 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
451 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
452 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
453 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
454 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
455 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
456 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400457 case SkBlendMode::kSrc:
Brian Salomon54d212e2017-03-21 14:22:38 -0400458 TEST_ASSERT(xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon8c852be2017-01-04 10:44:42 -0500459 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700460 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(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
465 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
466 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400467 case SkBlendMode::kDst:
Brian Salomon54d212e2017-03-21 14:22:38 -0400468 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon02baee92017-02-24 10:37:15 -0500469 TEST_ASSERT((kIgnoreColor_OptFlag |
cdalton6fd158e2015-05-27 15:08:33 -0700470 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
471 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
472 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
473 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
474 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
475 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
476 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
477 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400478 case SkBlendMode::kSrcOver:
Brian Salomon54d212e2017-03-21 14:22:38 -0400479 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon8c852be2017-01-04 10:44:42 -0500480 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700481 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
482 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
483 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
484 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
485 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
486 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
487 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400488 case SkBlendMode::kDstOver:
Brian Salomon54d212e2017-03-21 14:22:38 -0400489 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon8c852be2017-01-04 10:44:42 -0500490 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700491 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
492 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
493 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
494 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
495 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
496 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
497 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400498 case SkBlendMode::kSrcIn:
Brian Salomon54d212e2017-03-21 14:22:38 -0400499 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon8c852be2017-01-04 10:44:42 -0500500 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700501 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
502 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
503 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
504 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
505 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
506 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
507 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400508 case SkBlendMode::kDstIn:
Brian Salomon54d212e2017-03-21 14:22:38 -0400509 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
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(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
515 TEST_ASSERT(kSA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
516 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
517 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400518 case SkBlendMode::kSrcOut:
Brian Salomon54d212e2017-03-21 14:22:38 -0400519 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon8c852be2017-01-04 10:44:42 -0500520 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700521 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
522 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
523 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
524 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
525 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
526 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
527 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400528 case SkBlendMode::kDstOut:
Brian Salomon54d212e2017-03-21 14:22:38 -0400529 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon8c852be2017-01-04 10:44:42 -0500530 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700531 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
532 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
533 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
534 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
535 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
536 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
537 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400538 case SkBlendMode::kSrcATop:
Brian Salomon54d212e2017-03-21 14:22:38 -0400539 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon8c852be2017-01-04 10:44:42 -0500540 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700541 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
542 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
543 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
544 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
545 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
546 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
547 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400548 case SkBlendMode::kDstATop:
Brian Salomon54d212e2017-03-21 14:22:38 -0400549 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon8c852be2017-01-04 10:44:42 -0500550 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700551 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
552 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
553 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
554 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
555 TEST_ASSERT(kSA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
556 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
557 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400558 case SkBlendMode::kXor:
Brian Salomon54d212e2017-03-21 14:22:38 -0400559 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon8c852be2017-01-04 10:44:42 -0500560 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700561 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
562 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
563 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
564 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
565 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
566 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
567 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400568 case SkBlendMode::kPlus:
Brian Salomon54d212e2017-03-21 14:22:38 -0400569 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon8c852be2017-01-04 10:44:42 -0500570 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700571 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
572 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
573 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
574 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
575 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
576 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
577 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400578 case SkBlendMode::kModulate:
Brian Salomon54d212e2017-03-21 14:22:38 -0400579 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon8c852be2017-01-04 10:44:42 -0500580 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700581 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
582 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
583 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
584 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
585 TEST_ASSERT(kSC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
586 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
587 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400588 case SkBlendMode::kScreen:
Brian Salomon54d212e2017-03-21 14:22:38 -0400589 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
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(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
595 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
596 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
597 break;
598 default:
599 ERRORF(reporter, "Invalid xfermode.");
600 break;
601 }
602 }
603}
604
605static void test_color_opaque_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomon5298dc82017-02-22 11:52:03 -0500606 GrProcessorSet::FragmentProcessorAnalysis analysis(GrPipelineInput::Opaque::kYes,
607 GrPipelineInput(), caps);
cdalton6fd158e2015-05-27 15:08:33 -0700608
Brian Salomon5298dc82017-02-22 11:52:03 -0500609 SkASSERT(analysis.isOutputColorOpaque());
610 SkASSERT(!analysis.hasKnownOutputColor());
611 SkASSERT(analysis.hasCoverage());
612 SkASSERT(!analysis.hasLCDCoverage());
cdalton6fd158e2015-05-27 15:08:33 -0700613
Mike Reed7d954ad2016-10-28 15:42:34 -0400614 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
615 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon92aee3d2016-12-21 09:20:25 -0500616 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, analysis);
cdalton6fd158e2015-05-27 15:08:33 -0700617 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400618 case SkBlendMode::kClear:
Brian Salomon54d212e2017-03-21 14:22:38 -0400619 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
cdalton6fd158e2015-05-27 15:08:33 -0700620 TEST_ASSERT((kIgnoreColor_OptFlag) == xpi.fOptFlags);
621 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
622 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
623 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
624 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
625 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
626 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
627 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400628 case SkBlendMode::kSrc:
Brian Salomon54d212e2017-03-21 14:22:38 -0400629 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
cdalton6fd158e2015-05-27 15:08:33 -0700630 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
631 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
632 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
633 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
634 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
635 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
636 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
637 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400638 case SkBlendMode::kDst:
Brian Salomon54d212e2017-03-21 14:22:38 -0400639 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon02baee92017-02-24 10:37:15 -0500640 TEST_ASSERT((kIgnoreColor_OptFlag |
cdalton6fd158e2015-05-27 15:08:33 -0700641 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
642 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
643 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
644 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
645 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
646 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
647 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
648 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400649 case SkBlendMode::kSrcOver:
Brian Salomon54d212e2017-03-21 14:22:38 -0400650 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
cdalton6fd158e2015-05-27 15:08:33 -0700651 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
652 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
653 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
654 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
655 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
656 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
657 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
658 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400659 case SkBlendMode::kDstOver:
Brian Salomon54d212e2017-03-21 14:22:38 -0400660 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
cdalton6fd158e2015-05-27 15:08:33 -0700661 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
662 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
663 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
664 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
665 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
666 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
667 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
668 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400669 case SkBlendMode::kSrcIn:
Brian Salomon54d212e2017-03-21 14:22:38 -0400670 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
cdalton6fd158e2015-05-27 15:08:33 -0700671 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
672 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
673 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
674 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
675 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
676 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
677 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
678 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400679 case SkBlendMode::kDstIn:
Brian Salomon54d212e2017-03-21 14:22:38 -0400680 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon02baee92017-02-24 10:37:15 -0500681 TEST_ASSERT((kIgnoreColor_OptFlag |
cdalton6fd158e2015-05-27 15:08:33 -0700682 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
683 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
684 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
685 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
686 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
687 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
688 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
689 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400690 case SkBlendMode::kSrcOut:
Brian Salomon54d212e2017-03-21 14:22:38 -0400691 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
cdalton6fd158e2015-05-27 15:08:33 -0700692 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
693 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
694 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
695 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
696 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
697 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
698 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
699 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400700 case SkBlendMode::kDstOut:
Brian Salomon54d212e2017-03-21 14:22:38 -0400701 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
cdalton6fd158e2015-05-27 15:08:33 -0700702 TEST_ASSERT((kIgnoreColor_OptFlag) == xpi.fOptFlags);
703 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
704 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
705 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
706 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
707 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
708 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
709 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400710 case SkBlendMode::kSrcATop:
Brian Salomon54d212e2017-03-21 14:22:38 -0400711 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
cdalton6fd158e2015-05-27 15:08:33 -0700712 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
713 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
714 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
715 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
716 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
717 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
718 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
719 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400720 case SkBlendMode::kDstATop:
Brian Salomon54d212e2017-03-21 14:22:38 -0400721 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
cdalton6fd158e2015-05-27 15:08:33 -0700722 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
723 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
724 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
725 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
726 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
727 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
728 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
729 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400730 case SkBlendMode::kXor:
Brian Salomon54d212e2017-03-21 14:22:38 -0400731 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
cdalton6fd158e2015-05-27 15:08:33 -0700732 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
733 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
734 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
735 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
736 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
737 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
738 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
739 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400740 case SkBlendMode::kPlus:
Brian Salomon54d212e2017-03-21 14:22:38 -0400741 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
cdalton6fd158e2015-05-27 15:08:33 -0700742 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
743 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
744 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
745 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
746 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
747 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
748 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
749 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400750 case SkBlendMode::kModulate:
Brian Salomon54d212e2017-03-21 14:22:38 -0400751 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
bsalomon7765a472015-07-08 11:26:37 -0700752 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700753 TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType);
754 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
755 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
756 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
757 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
758 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
759 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400760 case SkBlendMode::kScreen:
Brian Salomon54d212e2017-03-21 14:22:38 -0400761 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
cdalton6fd158e2015-05-27 15:08:33 -0700762 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
763 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
764 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
765 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
766 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
767 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
768 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
769 break;
770 default:
771 ERRORF(reporter, "Invalid xfermode.");
772 break;
773 }
774 }
775}
776
777static void test_color_opaque_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomon5298dc82017-02-22 11:52:03 -0500778 GrProcessorSet::FragmentProcessorAnalysis analysis(GrPipelineInput::Opaque::kYes,
779 GrColorPackA4(255), caps);
cdalton6fd158e2015-05-27 15:08:33 -0700780
Brian Salomon5298dc82017-02-22 11:52:03 -0500781 SkASSERT(analysis.isOutputColorOpaque());
782 SkASSERT(!analysis.hasKnownOutputColor());
783 SkASSERT(!analysis.hasCoverage());
cdalton6fd158e2015-05-27 15:08:33 -0700784
Mike Reed7d954ad2016-10-28 15:42:34 -0400785 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
786 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon92aee3d2016-12-21 09:20:25 -0500787 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, analysis);
cdalton6fd158e2015-05-27 15:08:33 -0700788
789 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400790 case SkBlendMode::kClear:
Brian Salomon54d212e2017-03-21 14:22:38 -0400791 TEST_ASSERT(xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon8c852be2017-01-04 10:44:42 -0500792 TEST_ASSERT(kIgnoreColor_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700793 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
794 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
795 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
796 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
797 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
798 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
799 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400800 case SkBlendMode::kSrc:
Brian Salomon54d212e2017-03-21 14:22:38 -0400801 TEST_ASSERT(xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon8c852be2017-01-04 10:44:42 -0500802 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700803 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
804 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
805 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
806 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
807 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
808 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
809 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400810 case SkBlendMode::kDst:
Brian Salomon54d212e2017-03-21 14:22:38 -0400811 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon02baee92017-02-24 10:37:15 -0500812 TEST_ASSERT((kIgnoreColor_OptFlag |
cdalton6fd158e2015-05-27 15:08:33 -0700813 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
814 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
815 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
816 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
817 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
818 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
819 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
820 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400821 case SkBlendMode::kSrcOver:
Brian Salomon54d212e2017-03-21 14:22:38 -0400822 TEST_ASSERT(xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon8c852be2017-01-04 10:44:42 -0500823 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700824 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
825 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
826 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
827 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
828 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
829 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
830 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400831 case SkBlendMode::kDstOver:
Brian Salomon54d212e2017-03-21 14:22:38 -0400832 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon8c852be2017-01-04 10:44:42 -0500833 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700834 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
835 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
836 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
837 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
838 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
839 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
840 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400841 case SkBlendMode::kSrcIn:
Brian Salomon54d212e2017-03-21 14:22:38 -0400842 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon8c852be2017-01-04 10:44:42 -0500843 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700844 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
845 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
846 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
847 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
848 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
849 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
850 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400851 case SkBlendMode::kDstIn:
Brian Salomon54d212e2017-03-21 14:22:38 -0400852 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon02baee92017-02-24 10:37:15 -0500853 TEST_ASSERT((kIgnoreColor_OptFlag |
cdalton6fd158e2015-05-27 15:08:33 -0700854 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
855 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
856 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
857 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
858 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
859 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
860 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
861 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400862 case SkBlendMode::kSrcOut:
Brian Salomon54d212e2017-03-21 14:22:38 -0400863 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon8c852be2017-01-04 10:44:42 -0500864 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700865 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
866 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
867 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
868 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
869 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
870 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
871 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400872 case SkBlendMode::kDstOut:
Brian Salomon54d212e2017-03-21 14:22:38 -0400873 TEST_ASSERT(xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon8c852be2017-01-04 10:44:42 -0500874 TEST_ASSERT(kIgnoreColor_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700875 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
876 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
877 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
878 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
879 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
880 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
881 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400882 case SkBlendMode::kSrcATop:
Brian Salomon54d212e2017-03-21 14:22:38 -0400883 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon8c852be2017-01-04 10:44:42 -0500884 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700885 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
886 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
887 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
888 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
889 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
890 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
891 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400892 case SkBlendMode::kDstATop:
Brian Salomon54d212e2017-03-21 14:22:38 -0400893 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon8c852be2017-01-04 10:44:42 -0500894 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700895 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
896 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
897 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
898 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
899 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
900 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
901 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400902 case SkBlendMode::kXor:
Brian Salomon54d212e2017-03-21 14:22:38 -0400903 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon8c852be2017-01-04 10:44:42 -0500904 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700905 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
906 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
907 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
908 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
909 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
910 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
911 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400912 case SkBlendMode::kPlus:
Brian Salomon54d212e2017-03-21 14:22:38 -0400913 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon8c852be2017-01-04 10:44:42 -0500914 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700915 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
916 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
917 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
918 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
919 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
920 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
921 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400922 case SkBlendMode::kModulate:
Brian Salomon54d212e2017-03-21 14:22:38 -0400923 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon8c852be2017-01-04 10:44:42 -0500924 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700925 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
926 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
927 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
928 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
929 TEST_ASSERT(kSC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
930 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
931 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400932 case SkBlendMode::kScreen:
Brian Salomon54d212e2017-03-21 14:22:38 -0400933 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon8c852be2017-01-04 10:44:42 -0500934 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700935 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
936 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
937 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
938 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
939 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
940 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
941 break;
942 default:
943 ERRORF(reporter, "Invalid xfermode.");
944 break;
945 }
946 }
947}
948
egdaniel723b0502015-09-15 09:31:40 -0700949static void test_lcd_coverage_fallback_case(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomon92aee3d2016-12-21 09:20:25 -0500950 class TestLCDCoverageOp : public GrMeshDrawOp {
reed1b55a962015-09-17 20:16:13 -0700951 public:
Brian Salomon25a88092016-12-01 09:36:50 -0500952 DEFINE_OP_CLASS_ID
reed1b55a962015-09-17 20:16:13 -0700953
Brian Salomon92aee3d2016-12-21 09:20:25 -0500954 TestLCDCoverageOp() : INHERITED(ClassID()) {}
cdalton6fd158e2015-05-27 15:08:33 -0700955
Brian Salomon09d994e2016-12-21 11:14:46 -0500956 const char* name() const override { return "Test LCD Text Op"; }
Brian Salomon92aee3d2016-12-21 09:20:25 -0500957
958 private:
Brian Salomon5298dc82017-02-22 11:52:03 -0500959 void getFragmentProcessorAnalysisInputs(
960 FragmentProcessorAnalysisInputs* input) const override {
961 input->colorInput()->setToConstant(GrColorPackRGBA(123, 45, 67, 221));
962 input->coverageInput()->setToLCDCoverage();
Brian Salomon92aee3d2016-12-21 09:20:25 -0500963 }
964
965 void applyPipelineOptimizations(const GrPipelineOptimizations&) override {}
Brian Salomon54d212e2017-03-21 14:22:38 -0400966 bool onCombineIfPossible(GrOp*, const GrCaps&) override { return false; }
Mike Kleinfc6c37b2016-09-27 09:34:10 -0400967 void onPrepareDraws(Target*) const override {}
cdalton6fd158e2015-05-27 15:08:33 -0700968
Brian Salomondad29232016-12-01 16:40:24 -0500969 typedef GrMeshDrawOp INHERITED;
Brian Salomon92aee3d2016-12-21 09:20:25 -0500970 } testLCDCoverageOp;
cdalton6fd158e2015-05-27 15:08:33 -0700971
Brian Salomon5298dc82017-02-22 11:52:03 -0500972 GrProcessorSet::FragmentProcessorAnalysis analysis;
Brian Salomon54d212e2017-03-21 14:22:38 -0400973 testLCDCoverageOp.analyzeProcessors(&analysis, GrProcessorSet(GrPaint()), nullptr, caps);
cdalton6fd158e2015-05-27 15:08:33 -0700974
Brian Salomon5298dc82017-02-22 11:52:03 -0500975 SkASSERT(analysis.hasKnownOutputColor());
976 SkASSERT(analysis.hasLCDCoverage());
cdalton6fd158e2015-05-27 15:08:33 -0700977
Brian Salomona1633922017-01-09 11:46:10 -0500978 const GrXPFactory* xpf = GrPorterDuffXPFactory::Get(SkBlendMode::kSrcOver);
Brian Salomon5298dc82017-02-22 11:52:03 -0500979 TEST_ASSERT(!GrXPFactory::WillNeedDstTexture(xpf, caps, analysis));
cdalton6fd158e2015-05-27 15:08:33 -0700980
Brian Salomon92aee3d2016-12-21 09:20:25 -0500981 sk_sp<GrXferProcessor> xp(xpf->createXferProcessor(analysis, false, nullptr, caps));
cdalton6fd158e2015-05-27 15:08:33 -0700982 if (!xp) {
983 ERRORF(reporter, "Failed to create an XP with LCD coverage.");
984 return;
985 }
986
Brian Salomon1c10fdd2017-03-03 14:30:15 -0500987 xp->getOptimizations(analysis);
cdalton6fd158e2015-05-27 15:08:33 -0700988
989 GrXferProcessor::BlendInfo blendInfo;
990 xp->getBlendInfo(&blendInfo);
991 TEST_ASSERT(blendInfo.fWriteColor);
992}
993
kkinnunen15302832015-12-01 04:35:26 -0800994DEF_GPUTEST(PorterDuffNoDualSourceBlending, reporter, /*factory*/) {
cdalton6fd158e2015-05-27 15:08:33 -0700995 GrContextOptions opts;
996 opts.fSuppressDualSourceBlending = true;
bsalomon3724e572016-03-30 18:56:19 -0700997 sk_gpu_test::GrContextFactory mockFactory(opts);
bsalomon85b4b532016-04-05 11:06:27 -0700998 GrContext* ctx = mockFactory.get(sk_gpu_test::GrContextFactory::kNullGL_ContextType);
cdalton6fd158e2015-05-27 15:08:33 -0700999 if (!ctx) {
1000 SkFAIL("Failed to create null context without ARB_blend_func_extended.");
1001 return;
1002 }
1003
bsalomon76228632015-05-29 08:02:10 -07001004 const GrCaps& caps = *ctx->caps();
cdalton6fd158e2015-05-27 15:08:33 -07001005 if (caps.shaderCaps()->dualSourceBlendingSupport()) {
1006 SkFAIL("Null context failed to honor request for no ARB_blend_func_extended.");
1007 return;
1008 }
1009
bsalomon091f60c2015-11-10 11:54:56 -08001010 GrBackendObject backendTex =
bungeman6bd52842016-10-27 09:30:08 -07001011 ctx->getGpu()->createTestingOnlyBackendTexture(nullptr, 100, 100, kRGBA_8888_GrPixelConfig);
cdalton6fd158e2015-05-27 15:08:33 -07001012 GrBackendTextureDesc fakeDesc;
1013 fakeDesc.fConfig = kRGBA_8888_GrPixelConfig;
1014 fakeDesc.fWidth = fakeDesc.fHeight = 100;
bsalomon091f60c2015-11-10 11:54:56 -08001015 fakeDesc.fTextureHandle = backendTex;
cdalton6fd158e2015-05-27 15:08:33 -07001016 GrXferProcessor::DstTexture fakeDstTexture;
bungeman6bd52842016-10-27 09:30:08 -07001017 fakeDstTexture.setTexture(
Brian Osman32342f02017-03-04 08:12:46 -05001018 ctx->resourceProvider()->wrapBackendTexture(fakeDesc, kBorrow_GrWrapOwnership));
cdalton6fd158e2015-05-27 15:08:33 -07001019
Brian Salomonc6b71462017-02-14 11:33:01 -05001020 static const GrPipelineInput colorInputs[] = {GrPipelineInput(),
1021 GrPipelineInput(GrPipelineInput::Opaque::kYes),
1022 GrPipelineInput(GrColorPackRGBA(0, 82, 17, 100)),
1023 GrPipelineInput(GrColorPackRGBA(0, 82, 17, 255))};
cdalton6fd158e2015-05-27 15:08:33 -07001024
Brian Salomonc6b71462017-02-14 11:33:01 -05001025 for (const auto& colorInput : colorInputs) {
Brian Salomon5298dc82017-02-22 11:52:03 -05001026 GrProcessorSet::FragmentProcessorAnalysis analysis;
Brian Salomonc6b71462017-02-14 11:33:01 -05001027 for (bool fractionalCoverage : {true, false}) {
Brian Salomon5298dc82017-02-22 11:52:03 -05001028 if (fractionalCoverage) {
1029 analysis = GrProcessorSet::FragmentProcessorAnalysis(colorInput, GrPipelineInput(),
1030 caps);
1031 } else {
1032 analysis = GrProcessorSet::FragmentProcessorAnalysis(colorInput, GrColorPackA4(255),
1033 caps);
cdalton6fd158e2015-05-27 15:08:33 -07001034 }
Mike Reed7d954ad2016-10-28 15:42:34 -04001035 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
1036 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomona1633922017-01-09 11:46:10 -05001037 const GrXPFactory* xpf = GrPorterDuffXPFactory::Get(xfermode);
cdalton86ae0a92015-06-08 15:11:04 -07001038 GrXferProcessor::DstTexture* dstTexture =
Brian Salomon5298dc82017-02-22 11:52:03 -05001039 GrXPFactory::WillNeedDstTexture(xpf, caps, analysis) ? &fakeDstTexture : 0;
Hal Canary342b7ac2016-11-04 11:49:42 -04001040 sk_sp<GrXferProcessor> xp(
Brian Salomon92aee3d2016-12-21 09:20:25 -05001041 xpf->createXferProcessor(analysis, false, dstTexture, caps));
cdalton6fd158e2015-05-27 15:08:33 -07001042 if (!xp) {
1043 ERRORF(reporter, "Failed to create an XP without dual source blending.");
1044 return;
1045 }
1046 TEST_ASSERT(!xp->hasSecondaryOutput());
Brian Salomon1c10fdd2017-03-03 14:30:15 -05001047 xp->getOptimizations(analysis);
cdalton6fd158e2015-05-27 15:08:33 -07001048 TEST_ASSERT(!xp->hasSecondaryOutput());
1049 }
1050 }
1051 }
bsalomon091f60c2015-11-10 11:54:56 -08001052 ctx->getGpu()->deleteTestingOnlyBackendTexture(backendTex);
cdalton6fd158e2015-05-27 15:08:33 -07001053}
1054
1055#endif