blob: d87e2521410167dc9534a9b9d9df23ea837750bd [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
Brian Salomon5298dc82017-02-22 11:52:03 -050012#include "GrAppliedClip.h"
cdalton6fd158e2015-05-27 15:08:33 -070013#include "GrContextFactory.h"
14#include "GrContextOptions.h"
15#include "GrGpu.h"
16#include "GrResourceProvider.h"
17#include "GrXferProcessor.h"
18#include "effects/GrPorterDuffXferProcessor.h"
19#include "gl/GrGLCaps.h"
Brian Salomon89527432016-12-16 09:52:16 -050020#include "ops/GrMeshDrawOp.h"
cdalton6fd158e2015-05-27 15:08:33 -070021
22////////////////////////////////////////////////////////////////////////////////
23
24static void test_color_unknown_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps);
25static void test_color_unknown_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps);
26static void test_color_opaque_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps);
27static void test_color_opaque_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps);
28static void test_lcd_coverage(skiatest::Reporter* reporter, const GrCaps& caps);
egdaniel723b0502015-09-15 09:31:40 -070029static void test_lcd_coverage_fallback_case(skiatest::Reporter* reporter, const GrCaps& caps);
cdalton6fd158e2015-05-27 15:08:33 -070030
bsalomon758586c2016-04-06 14:02:39 -070031DEF_GPUTEST_FOR_NULLGL_CONTEXT(GrPorterDuff, reporter, ctxInfo) {
bsalomon8b7451a2016-05-11 06:33:06 -070032 const GrCaps& caps = *ctxInfo.grContext()->getGpu()->caps();
cdalton6fd158e2015-05-27 15:08:33 -070033 if (!caps.shaderCaps()->dualSourceBlendingSupport()) {
34 SkFAIL("Null context does not support dual source blending.");
35 return;
36 }
37
38 test_color_unknown_with_coverage(reporter, caps);
39 test_color_unknown_no_coverage(reporter, caps);
40 test_color_opaque_with_coverage(reporter, caps);
41 test_color_opaque_no_coverage(reporter, caps);
42 test_lcd_coverage(reporter, caps);
egdaniel723b0502015-09-15 09:31:40 -070043 test_lcd_coverage_fallback_case(reporter, caps);
cdalton6fd158e2015-05-27 15:08:33 -070044}
45
46////////////////////////////////////////////////////////////////////////////////
47
48#define TEST_ASSERT(...) REPORTER_ASSERT(reporter, __VA_ARGS__)
49
50enum {
51 kNone_OutputType,
52 kCoverage_OutputType,
53 kModulate_OutputType,
egdaniel723b0502015-09-15 09:31:40 -070054 kSAModulate_OutputType,
cdalton6fd158e2015-05-27 15:08:33 -070055 kISAModulate_OutputType,
56 kISCModulate_OutputType
57};
58
59enum {
bsalomon7765a472015-07-08 11:26:37 -070060 kNone_OptFlags = GrXferProcessor::kNone_OptFlags,
cdalton6fd158e2015-05-27 15:08:33 -070061 kSkipDraw_OptFlag = GrXferProcessor::kSkipDraw_OptFlag,
62 kIgnoreColor_OptFlag = GrXferProcessor::kIgnoreColor_OptFlag,
cdalton6fd158e2015-05-27 15:08:33 -070063 kCanTweakAlphaForCoverage_OptFlag = GrXferProcessor::kCanTweakAlphaForCoverage_OptFlag
64};
65
66class GrPorterDuffTest {
67public:
68 struct XPInfo {
Mike Reed7d954ad2016-10-28 15:42:34 -040069 XPInfo(skiatest::Reporter* reporter, SkBlendMode xfermode, const GrCaps& caps,
Brian Salomon5298dc82017-02-22 11:52:03 -050070 const GrProcessorSet::FragmentProcessorAnalysis& analysis) {
Brian Salomona1633922017-01-09 11:46:10 -050071 const GrXPFactory* xpf = GrPorterDuffXPFactory::Get(xfermode);
Brian Salomon5298dc82017-02-22 11:52:03 -050072 fReadsDst = GrXPFactory::WillReadDst(xpf, analysis);
Brian Salomon92aee3d2016-12-21 09:20:25 -050073 sk_sp<GrXferProcessor> xp(xpf->createXferProcessor(analysis, false, nullptr, caps));
Brian Salomon5298dc82017-02-22 11:52:03 -050074 TEST_ASSERT(!GrXPFactory::WillNeedDstTexture(xpf, caps, analysis));
Brian Salomonbfd51832017-01-04 13:22:08 -050075 GrColor ignoredOverrideColor;
76 fOptFlags = xp->getOptimizations(analysis, false, &ignoredOverrideColor, caps);
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 Salomon9a514982017-02-14 10:28:22 -050083 bool fReadsDst;
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 Salomon9a514982017-02-14 10:28:22 -0500109 TEST_ASSERT(xpi.fReadsDst);
egdaniel723b0502015-09-15 09:31:40 -0700110 TEST_ASSERT((kIgnoreColor_OptFlag) == xpi.fOptFlags);
111 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
112 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
113 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
114 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
115 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
116 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
117 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400118 case SkBlendMode::kSrc:
Brian Salomon9a514982017-02-14 10:28:22 -0500119 TEST_ASSERT(xpi.fReadsDst);
egdaniel723b0502015-09-15 09:31:40 -0700120 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
121 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
122 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
123 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
124 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
125 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
126 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
127 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400128 case SkBlendMode::kDst:
Brian Salomon9a514982017-02-14 10:28:22 -0500129 TEST_ASSERT(xpi.fReadsDst);
egdaniel723b0502015-09-15 09:31:40 -0700130 TEST_ASSERT((kSkipDraw_OptFlag |
131 kIgnoreColor_OptFlag |
egdaniel723b0502015-09-15 09:31:40 -0700132 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
133 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
134 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
135 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
136 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
137 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
138 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
139 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400140 case SkBlendMode::kSrcOver:
Brian Salomon9a514982017-02-14 10:28:22 -0500141 TEST_ASSERT(xpi.fReadsDst);
egdaniel723b0502015-09-15 09:31:40 -0700142 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
143 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
144 TEST_ASSERT(kSAModulate_OutputType == xpi.fSecondaryOutputType);
145 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
146 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
147 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
148 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
149 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400150 case SkBlendMode::kDstOver:
Brian Salomon9a514982017-02-14 10:28:22 -0500151 TEST_ASSERT(xpi.fReadsDst);
egdaniel723b0502015-09-15 09:31:40 -0700152 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
153 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
154 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
155 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
156 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
157 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
158 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
159 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400160 case SkBlendMode::kSrcIn:
Brian Salomon9a514982017-02-14 10:28:22 -0500161 TEST_ASSERT(xpi.fReadsDst);
egdaniel723b0502015-09-15 09:31:40 -0700162 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
163 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
164 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
165 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
166 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
167 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
168 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
169 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400170 case SkBlendMode::kDstIn:
Brian Salomon9a514982017-02-14 10:28:22 -0500171 TEST_ASSERT(xpi.fReadsDst);
egdaniel723b0502015-09-15 09:31:40 -0700172 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
173 TEST_ASSERT(kISAModulate_OutputType == xpi.fPrimaryOutputType);
174 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
175 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
176 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
177 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
178 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
179 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400180 case SkBlendMode::kSrcOut:
Brian Salomon9a514982017-02-14 10:28:22 -0500181 TEST_ASSERT(xpi.fReadsDst);
egdaniel723b0502015-09-15 09:31:40 -0700182 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
183 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
184 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
185 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
186 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
187 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
188 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
189 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400190 case SkBlendMode::kDstOut:
Brian Salomon9a514982017-02-14 10:28:22 -0500191 TEST_ASSERT(xpi.fReadsDst);
egdaniel723b0502015-09-15 09:31:40 -0700192 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
193 TEST_ASSERT(kSAModulate_OutputType == xpi.fPrimaryOutputType);
194 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
195 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
196 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
197 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
198 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
199 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400200 case SkBlendMode::kSrcATop:
Brian Salomon9a514982017-02-14 10:28:22 -0500201 TEST_ASSERT(xpi.fReadsDst);
egdaniel723b0502015-09-15 09:31:40 -0700202 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
203 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
204 TEST_ASSERT(kSAModulate_OutputType == xpi.fSecondaryOutputType);
205 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
206 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
207 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
208 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
209 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400210 case SkBlendMode::kDstATop:
Brian Salomon9a514982017-02-14 10:28:22 -0500211 TEST_ASSERT(xpi.fReadsDst);
egdaniel723b0502015-09-15 09:31:40 -0700212 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
213 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
214 TEST_ASSERT(kISAModulate_OutputType == xpi.fSecondaryOutputType);
215 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
216 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
217 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
218 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
219 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400220 case SkBlendMode::kXor:
Brian Salomon9a514982017-02-14 10:28:22 -0500221 TEST_ASSERT(xpi.fReadsDst);
egdaniel723b0502015-09-15 09:31:40 -0700222 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
223 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
224 TEST_ASSERT(kSAModulate_OutputType == xpi.fSecondaryOutputType);
225 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
226 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
227 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
228 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
229 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400230 case SkBlendMode::kPlus:
Brian Salomon9a514982017-02-14 10:28:22 -0500231 TEST_ASSERT(xpi.fReadsDst);
egdaniel723b0502015-09-15 09:31:40 -0700232 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
233 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
234 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
235 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
236 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
237 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
238 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
239 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400240 case SkBlendMode::kModulate:
Brian Salomon9a514982017-02-14 10:28:22 -0500241 TEST_ASSERT(xpi.fReadsDst);
egdaniel723b0502015-09-15 09:31:40 -0700242 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
243 TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType);
244 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
245 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
246 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
247 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
248 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
249 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400250 case SkBlendMode::kScreen:
Brian Salomon9a514982017-02-14 10:28:22 -0500251 TEST_ASSERT(xpi.fReadsDst);
egdaniel723b0502015-09-15 09:31:40 -0700252 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
253 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
254 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
255 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
256 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
257 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
258 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
259 break;
260 default:
261 ERRORF(reporter, "Invalid xfermode.");
262 break;
263 }
264 }
265}
cdalton6fd158e2015-05-27 15:08:33 -0700266static void test_color_unknown_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomon5298dc82017-02-22 11:52:03 -0500267 GrProcessorSet::FragmentProcessorAnalysis analysis(GrPipelineInput(), GrPipelineInput(), caps);
cdalton6fd158e2015-05-27 15:08:33 -0700268
Brian Salomon5298dc82017-02-22 11:52:03 -0500269 SkASSERT(!analysis.isOutputColorOpaque());
270 SkASSERT(!analysis.hasKnownOutputColor());
271 SkASSERT(!analysis.hasLCDCoverage());
272 SkASSERT(analysis.hasCoverage());
cdalton6fd158e2015-05-27 15:08:33 -0700273
Mike Reed7d954ad2016-10-28 15:42:34 -0400274 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
275 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon92aee3d2016-12-21 09:20:25 -0500276 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, analysis);
cdalton6fd158e2015-05-27 15:08:33 -0700277 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400278 case SkBlendMode::kClear:
Brian Salomon9a514982017-02-14 10:28:22 -0500279 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700280 TEST_ASSERT((kIgnoreColor_OptFlag) == xpi.fOptFlags);
281 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
282 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
283 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
284 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
285 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
286 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
287 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400288 case SkBlendMode::kSrc:
Brian Salomon9a514982017-02-14 10:28:22 -0500289 TEST_ASSERT(xpi.fReadsDst);
bsalomon7765a472015-07-08 11:26:37 -0700290 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700291 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
292 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
293 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
294 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
295 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
296 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
297 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400298 case SkBlendMode::kDst:
Brian Salomon9a514982017-02-14 10:28:22 -0500299 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700300 TEST_ASSERT((kSkipDraw_OptFlag |
301 kIgnoreColor_OptFlag |
cdalton6fd158e2015-05-27 15:08:33 -0700302 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
303 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
304 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
305 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
306 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
307 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
308 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
309 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400310 case SkBlendMode::kSrcOver:
Brian Salomon9a514982017-02-14 10:28:22 -0500311 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700312 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
313 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
314 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
315 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
316 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
317 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
318 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
319 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400320 case SkBlendMode::kDstOver:
Brian Salomon9a514982017-02-14 10:28:22 -0500321 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700322 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
323 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
324 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
325 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
326 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
327 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
328 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
329 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400330 case SkBlendMode::kSrcIn:
Brian Salomon9a514982017-02-14 10:28:22 -0500331 TEST_ASSERT(xpi.fReadsDst);
bsalomon7765a472015-07-08 11:26:37 -0700332 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700333 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
334 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
335 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
336 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
337 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
338 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
339 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400340 case SkBlendMode::kDstIn:
Brian Salomon9a514982017-02-14 10:28:22 -0500341 TEST_ASSERT(xpi.fReadsDst);
bsalomon7765a472015-07-08 11:26:37 -0700342 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700343 TEST_ASSERT(kISAModulate_OutputType == xpi.fPrimaryOutputType);
344 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
345 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
346 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
347 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
348 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
349 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400350 case SkBlendMode::kSrcOut:
Brian Salomon9a514982017-02-14 10:28:22 -0500351 TEST_ASSERT(xpi.fReadsDst);
bsalomon7765a472015-07-08 11:26:37 -0700352 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700353 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
354 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
355 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
356 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
357 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
358 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
359 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400360 case SkBlendMode::kDstOut:
Brian Salomon9a514982017-02-14 10:28:22 -0500361 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700362 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
363 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
364 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
365 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
366 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
367 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
368 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
369 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400370 case SkBlendMode::kSrcATop:
Brian Salomon9a514982017-02-14 10:28:22 -0500371 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700372 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
373 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
374 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
375 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
376 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
377 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
378 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
379 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400380 case SkBlendMode::kDstATop:
Brian Salomon9a514982017-02-14 10:28:22 -0500381 TEST_ASSERT(xpi.fReadsDst);
bsalomon7765a472015-07-08 11:26:37 -0700382 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700383 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
384 TEST_ASSERT(kISAModulate_OutputType == xpi.fSecondaryOutputType);
385 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
386 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
387 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
388 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
389 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400390 case SkBlendMode::kXor:
Brian Salomon9a514982017-02-14 10:28:22 -0500391 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700392 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
393 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
394 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
395 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
396 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
397 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
398 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
399 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400400 case SkBlendMode::kPlus:
Brian Salomon9a514982017-02-14 10:28:22 -0500401 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700402 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
403 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
404 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
405 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
406 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
407 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
408 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
409 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400410 case SkBlendMode::kModulate:
Brian Salomon9a514982017-02-14 10:28:22 -0500411 TEST_ASSERT(xpi.fReadsDst);
bsalomon7765a472015-07-08 11:26:37 -0700412 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700413 TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType);
414 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
415 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
416 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
417 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
418 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
419 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400420 case SkBlendMode::kScreen:
Brian Salomon9a514982017-02-14 10:28:22 -0500421 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700422 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
423 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
424 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
425 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
426 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
427 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
428 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
429 break;
430 default:
431 ERRORF(reporter, "Invalid xfermode.");
432 break;
433 }
434 }
435}
436
437static void test_color_unknown_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomon5298dc82017-02-22 11:52:03 -0500438 GrProcessorSet::FragmentProcessorAnalysis analysis(GrColorPackRGBA(229, 0, 154, 240),
439 GrColorPackA4(255), caps);
cdalton6fd158e2015-05-27 15:08:33 -0700440
Brian Salomon5298dc82017-02-22 11:52:03 -0500441 SkASSERT(!analysis.isOutputColorOpaque());
442 SkASSERT(analysis.hasKnownOutputColor());
443 SkASSERT(!analysis.hasCoverage());
cdalton6fd158e2015-05-27 15:08:33 -0700444
Mike Reed7d954ad2016-10-28 15:42:34 -0400445 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
446 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon92aee3d2016-12-21 09:20:25 -0500447 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, analysis);
cdalton6fd158e2015-05-27 15:08:33 -0700448 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400449 case SkBlendMode::kClear:
Brian Salomon9a514982017-02-14 10:28:22 -0500450 TEST_ASSERT(!xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500451 TEST_ASSERT(kIgnoreColor_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700452 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
453 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
454 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
455 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
456 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
457 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
458 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400459 case SkBlendMode::kSrc:
Brian Salomon9a514982017-02-14 10:28:22 -0500460 TEST_ASSERT(!xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500461 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700462 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
463 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
464 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
465 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
466 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
467 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
468 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400469 case SkBlendMode::kDst:
Brian Salomon9a514982017-02-14 10:28:22 -0500470 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700471 TEST_ASSERT((kSkipDraw_OptFlag |
472 kIgnoreColor_OptFlag |
cdalton6fd158e2015-05-27 15:08:33 -0700473 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
474 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
475 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
476 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
477 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
478 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
479 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
480 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400481 case SkBlendMode::kSrcOver:
Brian Salomon9a514982017-02-14 10:28:22 -0500482 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500483 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700484 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
485 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
486 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
487 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
488 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
489 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
490 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400491 case SkBlendMode::kDstOver:
Brian Salomon9a514982017-02-14 10:28:22 -0500492 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500493 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700494 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
495 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
496 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
497 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
498 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
499 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
500 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400501 case SkBlendMode::kSrcIn:
Brian Salomon9a514982017-02-14 10:28:22 -0500502 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500503 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700504 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
505 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
506 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
507 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
508 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
509 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
510 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400511 case SkBlendMode::kDstIn:
Brian Salomon9a514982017-02-14 10:28:22 -0500512 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500513 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700514 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
515 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
516 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
517 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
518 TEST_ASSERT(kSA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
519 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
520 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400521 case SkBlendMode::kSrcOut:
Brian Salomon9a514982017-02-14 10:28:22 -0500522 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500523 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700524 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
525 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
526 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
527 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
528 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
529 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
530 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400531 case SkBlendMode::kDstOut:
Brian Salomon9a514982017-02-14 10:28:22 -0500532 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500533 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700534 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
535 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
536 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
537 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
538 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
539 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
540 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400541 case SkBlendMode::kSrcATop:
Brian Salomon9a514982017-02-14 10:28:22 -0500542 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500543 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700544 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
545 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
546 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
547 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
548 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
549 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
550 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400551 case SkBlendMode::kDstATop:
Brian Salomon9a514982017-02-14 10:28:22 -0500552 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500553 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700554 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
555 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
556 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
557 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
558 TEST_ASSERT(kSA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
559 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
560 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400561 case SkBlendMode::kXor:
Brian Salomon9a514982017-02-14 10:28:22 -0500562 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500563 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700564 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
565 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
566 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
567 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
568 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
569 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
570 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400571 case SkBlendMode::kPlus:
Brian Salomon9a514982017-02-14 10:28:22 -0500572 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500573 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700574 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
575 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
576 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
577 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
578 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
579 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
580 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400581 case SkBlendMode::kModulate:
Brian Salomon9a514982017-02-14 10:28:22 -0500582 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500583 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700584 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
585 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
586 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
587 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
588 TEST_ASSERT(kSC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
589 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
590 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400591 case SkBlendMode::kScreen:
Brian Salomon9a514982017-02-14 10:28:22 -0500592 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500593 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700594 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
595 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
596 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
597 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
598 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
599 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
600 break;
601 default:
602 ERRORF(reporter, "Invalid xfermode.");
603 break;
604 }
605 }
606}
607
608static void test_color_opaque_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomon5298dc82017-02-22 11:52:03 -0500609 GrProcessorSet::FragmentProcessorAnalysis analysis(GrPipelineInput::Opaque::kYes,
610 GrPipelineInput(), caps);
cdalton6fd158e2015-05-27 15:08:33 -0700611
Brian Salomon5298dc82017-02-22 11:52:03 -0500612 SkASSERT(analysis.isOutputColorOpaque());
613 SkASSERT(!analysis.hasKnownOutputColor());
614 SkASSERT(analysis.hasCoverage());
615 SkASSERT(!analysis.hasLCDCoverage());
cdalton6fd158e2015-05-27 15:08:33 -0700616
Mike Reed7d954ad2016-10-28 15:42:34 -0400617 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
618 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon92aee3d2016-12-21 09:20:25 -0500619 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, analysis);
cdalton6fd158e2015-05-27 15:08:33 -0700620 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400621 case SkBlendMode::kClear:
Brian Salomon9a514982017-02-14 10:28:22 -0500622 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700623 TEST_ASSERT((kIgnoreColor_OptFlag) == xpi.fOptFlags);
624 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
625 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
626 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
627 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
628 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
629 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
630 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400631 case SkBlendMode::kSrc:
Brian Salomon9a514982017-02-14 10:28:22 -0500632 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700633 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
634 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(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
639 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
640 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400641 case SkBlendMode::kDst:
Brian Salomon9a514982017-02-14 10:28:22 -0500642 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700643 TEST_ASSERT((kSkipDraw_OptFlag |
644 kIgnoreColor_OptFlag |
cdalton6fd158e2015-05-27 15:08:33 -0700645 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
646 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
647 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
648 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
649 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
650 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
651 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
652 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400653 case SkBlendMode::kSrcOver:
Brian Salomon9a514982017-02-14 10:28:22 -0500654 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700655 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
656 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(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
661 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
662 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400663 case SkBlendMode::kDstOver:
Brian Salomon9a514982017-02-14 10:28:22 -0500664 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700665 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
666 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
667 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
668 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
669 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
670 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
671 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
672 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400673 case SkBlendMode::kSrcIn:
Brian Salomon9a514982017-02-14 10:28:22 -0500674 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700675 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
676 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
677 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
678 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
679 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
680 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
681 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
682 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400683 case SkBlendMode::kDstIn:
Brian Salomon9a514982017-02-14 10:28:22 -0500684 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700685 TEST_ASSERT((kSkipDraw_OptFlag |
686 kIgnoreColor_OptFlag |
cdalton6fd158e2015-05-27 15:08:33 -0700687 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
688 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
689 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
690 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
691 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
692 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
693 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
694 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400695 case SkBlendMode::kSrcOut:
Brian Salomon9a514982017-02-14 10:28:22 -0500696 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700697 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
698 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
699 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
700 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
701 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
702 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
703 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
704 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400705 case SkBlendMode::kDstOut:
Brian Salomon9a514982017-02-14 10:28:22 -0500706 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700707 TEST_ASSERT((kIgnoreColor_OptFlag) == xpi.fOptFlags);
708 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
709 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
710 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
711 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
712 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
713 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
714 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400715 case SkBlendMode::kSrcATop:
Brian Salomon9a514982017-02-14 10:28:22 -0500716 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700717 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
718 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
719 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
720 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
721 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
722 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
723 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
724 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400725 case SkBlendMode::kDstATop:
Brian Salomon9a514982017-02-14 10:28:22 -0500726 TEST_ASSERT(xpi.fReadsDst);
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(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
732 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
733 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
734 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400735 case SkBlendMode::kXor:
Brian Salomon9a514982017-02-14 10:28:22 -0500736 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700737 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
738 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
739 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
740 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
741 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
742 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
743 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
744 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400745 case SkBlendMode::kPlus:
Brian Salomon9a514982017-02-14 10:28:22 -0500746 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700747 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
748 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
749 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
750 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
751 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
752 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
753 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
754 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400755 case SkBlendMode::kModulate:
Brian Salomon9a514982017-02-14 10:28:22 -0500756 TEST_ASSERT(xpi.fReadsDst);
bsalomon7765a472015-07-08 11:26:37 -0700757 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700758 TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType);
759 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
760 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
761 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
762 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
763 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
764 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400765 case SkBlendMode::kScreen:
Brian Salomon9a514982017-02-14 10:28:22 -0500766 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700767 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
768 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
769 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
770 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
771 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
772 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
773 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
774 break;
775 default:
776 ERRORF(reporter, "Invalid xfermode.");
777 break;
778 }
779 }
780}
781
782static void test_color_opaque_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomon5298dc82017-02-22 11:52:03 -0500783 GrProcessorSet::FragmentProcessorAnalysis analysis(GrPipelineInput::Opaque::kYes,
784 GrColorPackA4(255), caps);
cdalton6fd158e2015-05-27 15:08:33 -0700785
Brian Salomon5298dc82017-02-22 11:52:03 -0500786 SkASSERT(analysis.isOutputColorOpaque());
787 SkASSERT(!analysis.hasKnownOutputColor());
788 SkASSERT(!analysis.hasCoverage());
cdalton6fd158e2015-05-27 15:08:33 -0700789
Mike Reed7d954ad2016-10-28 15:42:34 -0400790 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
791 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon92aee3d2016-12-21 09:20:25 -0500792 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, analysis);
cdalton6fd158e2015-05-27 15:08:33 -0700793
794 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400795 case SkBlendMode::kClear:
Brian Salomon9a514982017-02-14 10:28:22 -0500796 TEST_ASSERT(!xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500797 TEST_ASSERT(kIgnoreColor_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700798 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
799 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
800 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
801 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
802 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
803 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
804 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400805 case SkBlendMode::kSrc:
Brian Salomon9a514982017-02-14 10:28:22 -0500806 TEST_ASSERT(!xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500807 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700808 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
809 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
810 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
811 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
812 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
813 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
814 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400815 case SkBlendMode::kDst:
Brian Salomon9a514982017-02-14 10:28:22 -0500816 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700817 TEST_ASSERT((kSkipDraw_OptFlag |
818 kIgnoreColor_OptFlag |
cdalton6fd158e2015-05-27 15:08:33 -0700819 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
820 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
821 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
822 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
823 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
824 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
825 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
826 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400827 case SkBlendMode::kSrcOver:
Brian Salomon9a514982017-02-14 10:28:22 -0500828 TEST_ASSERT(!xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500829 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700830 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(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
835 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
836 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400837 case SkBlendMode::kDstOver:
Brian Salomon9a514982017-02-14 10:28:22 -0500838 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500839 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700840 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
841 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
842 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
843 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
844 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
845 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
846 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400847 case SkBlendMode::kSrcIn:
Brian Salomon9a514982017-02-14 10:28:22 -0500848 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500849 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700850 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
851 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
852 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
853 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
854 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
855 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
856 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400857 case SkBlendMode::kDstIn:
Brian Salomon9a514982017-02-14 10:28:22 -0500858 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700859 TEST_ASSERT((kSkipDraw_OptFlag |
860 kIgnoreColor_OptFlag |
cdalton6fd158e2015-05-27 15:08:33 -0700861 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
862 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
863 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
864 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
865 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
866 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
867 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
868 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400869 case SkBlendMode::kSrcOut:
Brian Salomon9a514982017-02-14 10:28:22 -0500870 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500871 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700872 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
873 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
874 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
875 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
876 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
877 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
878 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400879 case SkBlendMode::kDstOut:
Brian Salomon9a514982017-02-14 10:28:22 -0500880 TEST_ASSERT(!xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500881 TEST_ASSERT(kIgnoreColor_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700882 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
883 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
884 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
885 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
886 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
887 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
888 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400889 case SkBlendMode::kSrcATop:
Brian Salomon9a514982017-02-14 10:28:22 -0500890 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500891 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700892 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
893 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
894 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
895 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
896 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
897 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
898 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400899 case SkBlendMode::kDstATop:
Brian Salomon9a514982017-02-14 10:28:22 -0500900 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500901 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700902 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
903 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
904 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
905 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
906 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
907 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
908 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400909 case SkBlendMode::kXor:
Brian Salomon9a514982017-02-14 10:28:22 -0500910 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500911 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700912 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
913 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
914 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
915 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
916 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
917 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
918 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400919 case SkBlendMode::kPlus:
Brian Salomon9a514982017-02-14 10:28:22 -0500920 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500921 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700922 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
923 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
924 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
925 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
926 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
927 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
928 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400929 case SkBlendMode::kModulate:
Brian Salomon9a514982017-02-14 10:28:22 -0500930 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500931 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700932 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
933 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
934 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
935 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
936 TEST_ASSERT(kSC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
937 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
938 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400939 case SkBlendMode::kScreen:
Brian Salomon9a514982017-02-14 10:28:22 -0500940 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500941 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700942 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
943 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
944 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
945 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
946 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
947 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
948 break;
949 default:
950 ERRORF(reporter, "Invalid xfermode.");
951 break;
952 }
953 }
954}
955
egdaniel723b0502015-09-15 09:31:40 -0700956static void test_lcd_coverage_fallback_case(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomon92aee3d2016-12-21 09:20:25 -0500957 class TestLCDCoverageOp : public GrMeshDrawOp {
reed1b55a962015-09-17 20:16:13 -0700958 public:
Brian Salomon25a88092016-12-01 09:36:50 -0500959 DEFINE_OP_CLASS_ID
reed1b55a962015-09-17 20:16:13 -0700960
Brian Salomon92aee3d2016-12-21 09:20:25 -0500961 TestLCDCoverageOp() : INHERITED(ClassID()) {}
cdalton6fd158e2015-05-27 15:08:33 -0700962
Brian Salomon09d994e2016-12-21 11:14:46 -0500963 const char* name() const override { return "Test LCD Text Op"; }
Brian Salomon92aee3d2016-12-21 09:20:25 -0500964
965 private:
Brian Salomon5298dc82017-02-22 11:52:03 -0500966 void getFragmentProcessorAnalysisInputs(
967 FragmentProcessorAnalysisInputs* input) const override {
968 input->colorInput()->setToConstant(GrColorPackRGBA(123, 45, 67, 221));
969 input->coverageInput()->setToLCDCoverage();
Brian Salomon92aee3d2016-12-21 09:20:25 -0500970 }
971
972 void applyPipelineOptimizations(const GrPipelineOptimizations&) override {}
Brian Salomon25a88092016-12-01 09:36:50 -0500973 bool onCombineIfPossible(GrOp*, const GrCaps&) override { return false; }
Mike Kleinfc6c37b2016-09-27 09:34:10 -0400974 void onPrepareDraws(Target*) const override {}
cdalton6fd158e2015-05-27 15:08:33 -0700975
Brian Salomondad29232016-12-01 16:40:24 -0500976 typedef GrMeshDrawOp INHERITED;
Brian Salomon92aee3d2016-12-21 09:20:25 -0500977 } testLCDCoverageOp;
cdalton6fd158e2015-05-27 15:08:33 -0700978
Brian Salomon5298dc82017-02-22 11:52:03 -0500979 GrProcessorSet::FragmentProcessorAnalysis analysis;
980 GrAppliedClip clip(SkRect::MakeLargest());
981 testLCDCoverageOp.analyzeProcessors(&analysis, GrProcessorSet(GrPaint()), clip, caps);
cdalton6fd158e2015-05-27 15:08:33 -0700982
Brian Salomon5298dc82017-02-22 11:52:03 -0500983 SkASSERT(analysis.hasKnownOutputColor());
984 SkASSERT(analysis.hasLCDCoverage());
cdalton6fd158e2015-05-27 15:08:33 -0700985
Brian Salomona1633922017-01-09 11:46:10 -0500986 const GrXPFactory* xpf = GrPorterDuffXPFactory::Get(SkBlendMode::kSrcOver);
Brian Salomon5298dc82017-02-22 11:52:03 -0500987 TEST_ASSERT(!GrXPFactory::WillNeedDstTexture(xpf, caps, analysis));
cdalton6fd158e2015-05-27 15:08:33 -0700988
Brian Salomon92aee3d2016-12-21 09:20:25 -0500989 sk_sp<GrXferProcessor> xp(xpf->createXferProcessor(analysis, false, nullptr, caps));
cdalton6fd158e2015-05-27 15:08:33 -0700990 if (!xp) {
991 ERRORF(reporter, "Failed to create an XP with LCD coverage.");
992 return;
993 }
994
Brian Salomon5298dc82017-02-22 11:52:03 -0500995 TEST_ASSERT(GrXPFactory::WillReadDst(xpf, analysis));
cdalton6fd158e2015-05-27 15:08:33 -0700996
997 GrColor overrideColor;
Brian Salomon92aee3d2016-12-21 09:20:25 -0500998 xp->getOptimizations(analysis, false, &overrideColor, caps);
cdalton6fd158e2015-05-27 15:08:33 -0700999
1000 GrXferProcessor::BlendInfo blendInfo;
1001 xp->getBlendInfo(&blendInfo);
1002 TEST_ASSERT(blendInfo.fWriteColor);
1003}
1004
kkinnunen15302832015-12-01 04:35:26 -08001005DEF_GPUTEST(PorterDuffNoDualSourceBlending, reporter, /*factory*/) {
cdalton6fd158e2015-05-27 15:08:33 -07001006 GrContextOptions opts;
1007 opts.fSuppressDualSourceBlending = true;
bsalomon3724e572016-03-30 18:56:19 -07001008 sk_gpu_test::GrContextFactory mockFactory(opts);
bsalomon85b4b532016-04-05 11:06:27 -07001009 GrContext* ctx = mockFactory.get(sk_gpu_test::GrContextFactory::kNullGL_ContextType);
cdalton6fd158e2015-05-27 15:08:33 -07001010 if (!ctx) {
1011 SkFAIL("Failed to create null context without ARB_blend_func_extended.");
1012 return;
1013 }
1014
bsalomon76228632015-05-29 08:02:10 -07001015 const GrCaps& caps = *ctx->caps();
cdalton6fd158e2015-05-27 15:08:33 -07001016 if (caps.shaderCaps()->dualSourceBlendingSupport()) {
1017 SkFAIL("Null context failed to honor request for no ARB_blend_func_extended.");
1018 return;
1019 }
1020
bsalomon091f60c2015-11-10 11:54:56 -08001021 GrBackendObject backendTex =
bungeman6bd52842016-10-27 09:30:08 -07001022 ctx->getGpu()->createTestingOnlyBackendTexture(nullptr, 100, 100, kRGBA_8888_GrPixelConfig);
cdalton6fd158e2015-05-27 15:08:33 -07001023 GrBackendTextureDesc fakeDesc;
1024 fakeDesc.fConfig = kRGBA_8888_GrPixelConfig;
1025 fakeDesc.fWidth = fakeDesc.fHeight = 100;
bsalomon091f60c2015-11-10 11:54:56 -08001026 fakeDesc.fTextureHandle = backendTex;
cdalton6fd158e2015-05-27 15:08:33 -07001027 GrXferProcessor::DstTexture fakeDstTexture;
bungeman6bd52842016-10-27 09:30:08 -07001028 fakeDstTexture.setTexture(
1029 ctx->textureProvider()->wrapBackendTexture(fakeDesc, kBorrow_GrWrapOwnership));
cdalton6fd158e2015-05-27 15:08:33 -07001030
Brian Salomonc6b71462017-02-14 11:33:01 -05001031 static const GrPipelineInput colorInputs[] = {GrPipelineInput(),
1032 GrPipelineInput(GrPipelineInput::Opaque::kYes),
1033 GrPipelineInput(GrColorPackRGBA(0, 82, 17, 100)),
1034 GrPipelineInput(GrColorPackRGBA(0, 82, 17, 255))};
cdalton6fd158e2015-05-27 15:08:33 -07001035
Brian Salomonc6b71462017-02-14 11:33:01 -05001036 for (const auto& colorInput : colorInputs) {
Brian Salomon5298dc82017-02-22 11:52:03 -05001037 GrProcessorSet::FragmentProcessorAnalysis analysis;
Brian Salomonc6b71462017-02-14 11:33:01 -05001038 for (bool fractionalCoverage : {true, false}) {
Brian Salomon5298dc82017-02-22 11:52:03 -05001039 if (fractionalCoverage) {
1040 analysis = GrProcessorSet::FragmentProcessorAnalysis(colorInput, GrPipelineInput(),
1041 caps);
1042 } else {
1043 analysis = GrProcessorSet::FragmentProcessorAnalysis(colorInput, GrColorPackA4(255),
1044 caps);
cdalton6fd158e2015-05-27 15:08:33 -07001045 }
Mike Reed7d954ad2016-10-28 15:42:34 -04001046 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
1047 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomona1633922017-01-09 11:46:10 -05001048 const GrXPFactory* xpf = GrPorterDuffXPFactory::Get(xfermode);
cdalton86ae0a92015-06-08 15:11:04 -07001049 GrXferProcessor::DstTexture* dstTexture =
Brian Salomon5298dc82017-02-22 11:52:03 -05001050 GrXPFactory::WillNeedDstTexture(xpf, caps, analysis) ? &fakeDstTexture : 0;
Hal Canary342b7ac2016-11-04 11:49:42 -04001051 sk_sp<GrXferProcessor> xp(
Brian Salomon92aee3d2016-12-21 09:20:25 -05001052 xpf->createXferProcessor(analysis, false, dstTexture, caps));
cdalton6fd158e2015-05-27 15:08:33 -07001053 if (!xp) {
1054 ERRORF(reporter, "Failed to create an XP without dual source blending.");
1055 return;
1056 }
1057 TEST_ASSERT(!xp->hasSecondaryOutput());
Brian Salomonbfd51832017-01-04 13:22:08 -05001058 GrColor ignoredOverrideColor;
1059 xp->getOptimizations(analysis, false, &ignoredOverrideColor, caps);
cdalton6fd158e2015-05-27 15:08:33 -07001060 TEST_ASSERT(!xp->hasSecondaryOutput());
1061 }
1062 }
1063 }
bsalomon091f60c2015-11-10 11:54:56 -08001064 ctx->getGpu()->deleteTestingOnlyBackendTexture(backendTex);
cdalton6fd158e2015-05-27 15:08:33 -07001065}
1066
1067#endif