blob: c1d73ef251dad514d0c9c91a97c76e53de4dd3d4 [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 kIgnoreColor_OptFlag = GrXferProcessor::kIgnoreColor_OptFlag,
cdalton6fd158e2015-05-27 15:08:33 -070062 kCanTweakAlphaForCoverage_OptFlag = GrXferProcessor::kCanTweakAlphaForCoverage_OptFlag
63};
64
65class GrPorterDuffTest {
66public:
67 struct XPInfo {
Mike Reed7d954ad2016-10-28 15:42:34 -040068 XPInfo(skiatest::Reporter* reporter, SkBlendMode xfermode, const GrCaps& caps,
Brian Salomon5298dc82017-02-22 11:52:03 -050069 const GrProcessorSet::FragmentProcessorAnalysis& analysis) {
Brian Salomona1633922017-01-09 11:46:10 -050070 const GrXPFactory* xpf = GrPorterDuffXPFactory::Get(xfermode);
Brian Salomon5298dc82017-02-22 11:52:03 -050071 fReadsDst = GrXPFactory::WillReadDst(xpf, analysis);
Brian Salomon92aee3d2016-12-21 09:20:25 -050072 sk_sp<GrXferProcessor> xp(xpf->createXferProcessor(analysis, false, nullptr, caps));
Brian Salomon5298dc82017-02-22 11:52:03 -050073 TEST_ASSERT(!GrXPFactory::WillNeedDstTexture(xpf, caps, analysis));
Brian Salomonbfd51832017-01-04 13:22:08 -050074 GrColor ignoredOverrideColor;
75 fOptFlags = xp->getOptimizations(analysis, false, &ignoredOverrideColor, caps);
Hal Canary342b7ac2016-11-04 11:49:42 -040076 GetXPOutputTypes(xp.get(), &fPrimaryOutputType, &fSecondaryOutputType);
cdalton6fd158e2015-05-27 15:08:33 -070077 xp->getBlendInfo(&fBlendInfo);
78 TEST_ASSERT(!xp->willReadDstColor());
79 TEST_ASSERT(xp->hasSecondaryOutput() == GrBlendCoeffRefsSrc2(fBlendInfo.fDstBlend));
80 }
81
Brian Salomon9a514982017-02-14 10:28:22 -050082 bool fReadsDst;
cdalton6fd158e2015-05-27 15:08:33 -070083 int fOptFlags;
84 int fPrimaryOutputType;
85 int fSecondaryOutputType;
86 GrXferProcessor::BlendInfo fBlendInfo;
87 };
88
89 static void GetXPOutputTypes(const GrXferProcessor* xp, int* outPrimary, int* outSecondary) {
egdanielf2342722015-11-20 15:12:59 -080090 GrPorterDuffXPFactory::TestGetXPOutputTypes(xp, outPrimary, outSecondary);
cdalton6fd158e2015-05-27 15:08:33 -070091 }
92};
93
egdaniel723b0502015-09-15 09:31:40 -070094static void test_lcd_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomon5298dc82017-02-22 11:52:03 -050095 GrPipelineInput lcdInput;
96 lcdInput.setToLCDCoverage();
97 GrProcessorSet::FragmentProcessorAnalysis analysis(GrPipelineInput(), lcdInput, caps);
egdaniel723b0502015-09-15 09:31:40 -070098
Brian Salomon5298dc82017-02-22 11:52:03 -050099 SkASSERT(!analysis.isOutputColorOpaque());
100 SkASSERT(!analysis.hasKnownOutputColor());
101 SkASSERT(analysis.hasLCDCoverage());
egdaniel723b0502015-09-15 09:31:40 -0700102
Mike Reed7d954ad2016-10-28 15:42:34 -0400103 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
104 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon92aee3d2016-12-21 09:20:25 -0500105 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, analysis);
egdaniel723b0502015-09-15 09:31:40 -0700106 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400107 case SkBlendMode::kClear:
Brian Salomon9a514982017-02-14 10:28:22 -0500108 TEST_ASSERT(xpi.fReadsDst);
egdaniel723b0502015-09-15 09:31:40 -0700109 TEST_ASSERT((kIgnoreColor_OptFlag) == xpi.fOptFlags);
110 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
111 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
112 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
113 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
114 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
115 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
116 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400117 case SkBlendMode::kSrc:
Brian Salomon9a514982017-02-14 10:28:22 -0500118 TEST_ASSERT(xpi.fReadsDst);
egdaniel723b0502015-09-15 09:31:40 -0700119 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
120 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
121 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
122 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
123 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
124 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
125 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
126 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400127 case SkBlendMode::kDst:
Brian Salomon9a514982017-02-14 10:28:22 -0500128 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon02baee92017-02-24 10:37:15 -0500129 TEST_ASSERT((kIgnoreColor_OptFlag |
egdaniel723b0502015-09-15 09:31:40 -0700130 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
131 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
132 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
133 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
134 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
135 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
136 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
137 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400138 case SkBlendMode::kSrcOver:
Brian Salomon9a514982017-02-14 10:28:22 -0500139 TEST_ASSERT(xpi.fReadsDst);
egdaniel723b0502015-09-15 09:31:40 -0700140 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
141 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
142 TEST_ASSERT(kSAModulate_OutputType == xpi.fSecondaryOutputType);
143 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
144 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
145 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
146 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
147 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400148 case SkBlendMode::kDstOver:
Brian Salomon9a514982017-02-14 10:28:22 -0500149 TEST_ASSERT(xpi.fReadsDst);
egdaniel723b0502015-09-15 09:31:40 -0700150 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
151 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
152 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
153 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
154 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
155 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
156 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
157 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400158 case SkBlendMode::kSrcIn:
Brian Salomon9a514982017-02-14 10:28:22 -0500159 TEST_ASSERT(xpi.fReadsDst);
egdaniel723b0502015-09-15 09:31:40 -0700160 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
161 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
162 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
163 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
164 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
165 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
166 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
167 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400168 case SkBlendMode::kDstIn:
Brian Salomon9a514982017-02-14 10:28:22 -0500169 TEST_ASSERT(xpi.fReadsDst);
egdaniel723b0502015-09-15 09:31:40 -0700170 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
171 TEST_ASSERT(kISAModulate_OutputType == xpi.fPrimaryOutputType);
172 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
173 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
174 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
175 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
176 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
177 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400178 case SkBlendMode::kSrcOut:
Brian Salomon9a514982017-02-14 10:28:22 -0500179 TEST_ASSERT(xpi.fReadsDst);
egdaniel723b0502015-09-15 09:31:40 -0700180 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
181 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
182 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
183 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
184 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
185 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
186 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
187 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400188 case SkBlendMode::kDstOut:
Brian Salomon9a514982017-02-14 10:28:22 -0500189 TEST_ASSERT(xpi.fReadsDst);
egdaniel723b0502015-09-15 09:31:40 -0700190 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
191 TEST_ASSERT(kSAModulate_OutputType == xpi.fPrimaryOutputType);
192 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
193 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
194 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
195 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
196 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
197 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400198 case SkBlendMode::kSrcATop:
Brian Salomon9a514982017-02-14 10:28:22 -0500199 TEST_ASSERT(xpi.fReadsDst);
egdaniel723b0502015-09-15 09:31:40 -0700200 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
201 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
202 TEST_ASSERT(kSAModulate_OutputType == xpi.fSecondaryOutputType);
203 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
204 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
205 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
206 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
207 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400208 case SkBlendMode::kDstATop:
Brian Salomon9a514982017-02-14 10:28:22 -0500209 TEST_ASSERT(xpi.fReadsDst);
egdaniel723b0502015-09-15 09:31:40 -0700210 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
211 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
212 TEST_ASSERT(kISAModulate_OutputType == xpi.fSecondaryOutputType);
213 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
214 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
215 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
216 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
217 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400218 case SkBlendMode::kXor:
Brian Salomon9a514982017-02-14 10:28:22 -0500219 TEST_ASSERT(xpi.fReadsDst);
egdaniel723b0502015-09-15 09:31:40 -0700220 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
221 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
222 TEST_ASSERT(kSAModulate_OutputType == xpi.fSecondaryOutputType);
223 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
224 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
225 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
226 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
227 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400228 case SkBlendMode::kPlus:
Brian Salomon9a514982017-02-14 10:28:22 -0500229 TEST_ASSERT(xpi.fReadsDst);
egdaniel723b0502015-09-15 09:31:40 -0700230 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
231 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
232 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
233 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
234 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
235 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
236 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
237 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400238 case SkBlendMode::kModulate:
Brian Salomon9a514982017-02-14 10:28:22 -0500239 TEST_ASSERT(xpi.fReadsDst);
egdaniel723b0502015-09-15 09:31:40 -0700240 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
241 TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType);
242 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
243 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
244 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
245 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
246 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
247 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400248 case SkBlendMode::kScreen:
Brian Salomon9a514982017-02-14 10:28:22 -0500249 TEST_ASSERT(xpi.fReadsDst);
egdaniel723b0502015-09-15 09:31:40 -0700250 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
251 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
252 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
253 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
254 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
255 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
256 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
257 break;
258 default:
259 ERRORF(reporter, "Invalid xfermode.");
260 break;
261 }
262 }
263}
cdalton6fd158e2015-05-27 15:08:33 -0700264static void test_color_unknown_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomon5298dc82017-02-22 11:52:03 -0500265 GrProcessorSet::FragmentProcessorAnalysis analysis(GrPipelineInput(), GrPipelineInput(), caps);
cdalton6fd158e2015-05-27 15:08:33 -0700266
Brian Salomon5298dc82017-02-22 11:52:03 -0500267 SkASSERT(!analysis.isOutputColorOpaque());
268 SkASSERT(!analysis.hasKnownOutputColor());
269 SkASSERT(!analysis.hasLCDCoverage());
270 SkASSERT(analysis.hasCoverage());
cdalton6fd158e2015-05-27 15:08:33 -0700271
Mike Reed7d954ad2016-10-28 15:42:34 -0400272 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
273 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon92aee3d2016-12-21 09:20:25 -0500274 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, analysis);
cdalton6fd158e2015-05-27 15:08:33 -0700275 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400276 case SkBlendMode::kClear:
Brian Salomon9a514982017-02-14 10:28:22 -0500277 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700278 TEST_ASSERT((kIgnoreColor_OptFlag) == xpi.fOptFlags);
279 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
280 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
281 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
282 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
283 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
284 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
285 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400286 case SkBlendMode::kSrc:
Brian Salomon9a514982017-02-14 10:28:22 -0500287 TEST_ASSERT(xpi.fReadsDst);
bsalomon7765a472015-07-08 11:26:37 -0700288 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700289 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
290 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
291 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
292 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
293 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
294 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
295 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400296 case SkBlendMode::kDst:
Brian Salomon9a514982017-02-14 10:28:22 -0500297 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon02baee92017-02-24 10:37:15 -0500298 TEST_ASSERT((kIgnoreColor_OptFlag |
cdalton6fd158e2015-05-27 15:08:33 -0700299 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
300 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
301 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
302 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
303 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
304 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
305 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
306 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400307 case SkBlendMode::kSrcOver:
Brian Salomon9a514982017-02-14 10:28:22 -0500308 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700309 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
310 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
311 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
312 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
313 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
314 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
315 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
316 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400317 case SkBlendMode::kDstOver:
Brian Salomon9a514982017-02-14 10:28:22 -0500318 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700319 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
320 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
321 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
322 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
323 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
324 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
325 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
326 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400327 case SkBlendMode::kSrcIn:
Brian Salomon9a514982017-02-14 10:28:22 -0500328 TEST_ASSERT(xpi.fReadsDst);
bsalomon7765a472015-07-08 11:26:37 -0700329 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700330 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
331 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
332 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
333 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
334 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
335 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
336 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400337 case SkBlendMode::kDstIn:
Brian Salomon9a514982017-02-14 10:28:22 -0500338 TEST_ASSERT(xpi.fReadsDst);
bsalomon7765a472015-07-08 11:26:37 -0700339 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700340 TEST_ASSERT(kISAModulate_OutputType == xpi.fPrimaryOutputType);
341 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
342 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
343 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
344 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
345 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
346 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400347 case SkBlendMode::kSrcOut:
Brian Salomon9a514982017-02-14 10:28:22 -0500348 TEST_ASSERT(xpi.fReadsDst);
bsalomon7765a472015-07-08 11:26:37 -0700349 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700350 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
351 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
352 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
353 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
354 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
355 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
356 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400357 case SkBlendMode::kDstOut:
Brian Salomon9a514982017-02-14 10:28:22 -0500358 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700359 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
360 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
361 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
362 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
363 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
364 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
365 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
366 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400367 case SkBlendMode::kSrcATop:
Brian Salomon9a514982017-02-14 10:28:22 -0500368 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700369 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
370 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
371 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
372 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
373 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
374 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
375 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
376 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400377 case SkBlendMode::kDstATop:
Brian Salomon9a514982017-02-14 10:28:22 -0500378 TEST_ASSERT(xpi.fReadsDst);
bsalomon7765a472015-07-08 11:26:37 -0700379 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700380 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
381 TEST_ASSERT(kISAModulate_OutputType == xpi.fSecondaryOutputType);
382 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
383 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
384 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
385 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
386 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400387 case SkBlendMode::kXor:
Brian Salomon9a514982017-02-14 10:28:22 -0500388 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700389 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
390 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
391 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
392 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
393 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
394 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
395 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
396 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400397 case SkBlendMode::kPlus:
Brian Salomon9a514982017-02-14 10:28:22 -0500398 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700399 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
400 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
401 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
402 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
403 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
404 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
405 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
406 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400407 case SkBlendMode::kModulate:
Brian Salomon9a514982017-02-14 10:28:22 -0500408 TEST_ASSERT(xpi.fReadsDst);
bsalomon7765a472015-07-08 11:26:37 -0700409 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700410 TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType);
411 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
412 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
413 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
414 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
415 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
416 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400417 case SkBlendMode::kScreen:
Brian Salomon9a514982017-02-14 10:28:22 -0500418 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700419 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
420 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
421 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
422 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
423 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
424 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
425 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
426 break;
427 default:
428 ERRORF(reporter, "Invalid xfermode.");
429 break;
430 }
431 }
432}
433
434static void test_color_unknown_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomon5298dc82017-02-22 11:52:03 -0500435 GrProcessorSet::FragmentProcessorAnalysis analysis(GrColorPackRGBA(229, 0, 154, 240),
436 GrColorPackA4(255), caps);
cdalton6fd158e2015-05-27 15:08:33 -0700437
Brian Salomon5298dc82017-02-22 11:52:03 -0500438 SkASSERT(!analysis.isOutputColorOpaque());
439 SkASSERT(analysis.hasKnownOutputColor());
440 SkASSERT(!analysis.hasCoverage());
cdalton6fd158e2015-05-27 15:08:33 -0700441
Mike Reed7d954ad2016-10-28 15:42:34 -0400442 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
443 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon92aee3d2016-12-21 09:20:25 -0500444 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, analysis);
cdalton6fd158e2015-05-27 15:08:33 -0700445 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400446 case SkBlendMode::kClear:
Brian Salomon9a514982017-02-14 10:28:22 -0500447 TEST_ASSERT(!xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500448 TEST_ASSERT(kIgnoreColor_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700449 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
450 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
451 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
452 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
453 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
454 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
455 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400456 case SkBlendMode::kSrc:
Brian Salomon9a514982017-02-14 10:28:22 -0500457 TEST_ASSERT(!xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500458 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700459 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
460 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
461 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
462 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
463 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
464 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
465 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400466 case SkBlendMode::kDst:
Brian Salomon9a514982017-02-14 10:28:22 -0500467 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon02baee92017-02-24 10:37:15 -0500468 TEST_ASSERT((kIgnoreColor_OptFlag |
cdalton6fd158e2015-05-27 15:08:33 -0700469 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
470 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
471 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
472 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
473 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
474 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
475 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
476 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400477 case SkBlendMode::kSrcOver:
Brian Salomon9a514982017-02-14 10:28:22 -0500478 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500479 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700480 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
481 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
482 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
483 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
484 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
485 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
486 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400487 case SkBlendMode::kDstOver:
Brian Salomon9a514982017-02-14 10:28:22 -0500488 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500489 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700490 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
491 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
492 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
493 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
494 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
495 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
496 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400497 case SkBlendMode::kSrcIn:
Brian Salomon9a514982017-02-14 10:28:22 -0500498 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500499 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700500 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
501 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
502 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
503 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
504 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
505 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
506 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400507 case SkBlendMode::kDstIn:
Brian Salomon9a514982017-02-14 10:28:22 -0500508 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500509 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700510 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
511 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
512 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
513 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
514 TEST_ASSERT(kSA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
515 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
516 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400517 case SkBlendMode::kSrcOut:
Brian Salomon9a514982017-02-14 10:28:22 -0500518 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500519 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700520 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
521 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
522 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
523 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
524 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
525 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
526 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400527 case SkBlendMode::kDstOut:
Brian Salomon9a514982017-02-14 10:28:22 -0500528 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500529 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700530 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
531 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
532 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
533 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
534 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
535 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
536 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400537 case SkBlendMode::kSrcATop:
Brian Salomon9a514982017-02-14 10:28:22 -0500538 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500539 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700540 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
541 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
542 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
543 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
544 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
545 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
546 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400547 case SkBlendMode::kDstATop:
Brian Salomon9a514982017-02-14 10:28:22 -0500548 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500549 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700550 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
551 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
552 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
553 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
554 TEST_ASSERT(kSA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
555 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
556 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400557 case SkBlendMode::kXor:
Brian Salomon9a514982017-02-14 10:28:22 -0500558 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500559 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700560 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
561 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
562 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
563 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
564 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
565 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
566 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400567 case SkBlendMode::kPlus:
Brian Salomon9a514982017-02-14 10:28:22 -0500568 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500569 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700570 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
571 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
572 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
573 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
574 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
575 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
576 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400577 case SkBlendMode::kModulate:
Brian Salomon9a514982017-02-14 10:28:22 -0500578 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500579 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700580 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
581 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
582 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
583 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
584 TEST_ASSERT(kSC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
585 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
586 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400587 case SkBlendMode::kScreen:
Brian Salomon9a514982017-02-14 10:28:22 -0500588 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500589 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700590 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
591 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
592 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
593 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
594 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
595 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
596 break;
597 default:
598 ERRORF(reporter, "Invalid xfermode.");
599 break;
600 }
601 }
602}
603
604static void test_color_opaque_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomon5298dc82017-02-22 11:52:03 -0500605 GrProcessorSet::FragmentProcessorAnalysis analysis(GrPipelineInput::Opaque::kYes,
606 GrPipelineInput(), caps);
cdalton6fd158e2015-05-27 15:08:33 -0700607
Brian Salomon5298dc82017-02-22 11:52:03 -0500608 SkASSERT(analysis.isOutputColorOpaque());
609 SkASSERT(!analysis.hasKnownOutputColor());
610 SkASSERT(analysis.hasCoverage());
611 SkASSERT(!analysis.hasLCDCoverage());
cdalton6fd158e2015-05-27 15:08:33 -0700612
Mike Reed7d954ad2016-10-28 15:42:34 -0400613 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
614 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon92aee3d2016-12-21 09:20:25 -0500615 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, analysis);
cdalton6fd158e2015-05-27 15:08:33 -0700616 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400617 case SkBlendMode::kClear:
Brian Salomon9a514982017-02-14 10:28:22 -0500618 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700619 TEST_ASSERT((kIgnoreColor_OptFlag) == xpi.fOptFlags);
620 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
621 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
622 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
623 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
624 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
625 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
626 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400627 case SkBlendMode::kSrc:
Brian Salomon9a514982017-02-14 10:28:22 -0500628 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700629 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
630 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
631 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
632 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
633 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
634 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
635 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
636 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400637 case SkBlendMode::kDst:
Brian Salomon9a514982017-02-14 10:28:22 -0500638 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon02baee92017-02-24 10:37:15 -0500639 TEST_ASSERT((kIgnoreColor_OptFlag |
cdalton6fd158e2015-05-27 15:08:33 -0700640 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
641 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
642 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
643 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
644 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
645 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
646 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
647 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400648 case SkBlendMode::kSrcOver:
Brian Salomon9a514982017-02-14 10:28:22 -0500649 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700650 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
651 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
652 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
653 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
654 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
655 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
656 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
657 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400658 case SkBlendMode::kDstOver:
Brian Salomon9a514982017-02-14 10:28:22 -0500659 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700660 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
661 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
662 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
663 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
664 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
665 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
666 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
667 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400668 case SkBlendMode::kSrcIn:
Brian Salomon9a514982017-02-14 10:28:22 -0500669 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700670 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
671 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
672 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
673 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
674 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
675 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
676 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
677 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400678 case SkBlendMode::kDstIn:
Brian Salomon9a514982017-02-14 10:28:22 -0500679 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon02baee92017-02-24 10:37:15 -0500680 TEST_ASSERT((kIgnoreColor_OptFlag |
cdalton6fd158e2015-05-27 15:08:33 -0700681 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
682 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
683 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
684 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
685 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
686 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
687 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
688 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400689 case SkBlendMode::kSrcOut:
Brian Salomon9a514982017-02-14 10:28:22 -0500690 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700691 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
692 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
693 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
694 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
695 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
696 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
697 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
698 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400699 case SkBlendMode::kDstOut:
Brian Salomon9a514982017-02-14 10:28:22 -0500700 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700701 TEST_ASSERT((kIgnoreColor_OptFlag) == xpi.fOptFlags);
702 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
703 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
704 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
705 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
706 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
707 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
708 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400709 case SkBlendMode::kSrcATop:
Brian Salomon9a514982017-02-14 10:28:22 -0500710 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700711 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
712 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
713 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
714 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
715 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
716 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
717 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
718 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400719 case SkBlendMode::kDstATop:
Brian Salomon9a514982017-02-14 10:28:22 -0500720 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700721 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
722 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
723 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
724 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
725 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
726 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
727 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
728 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400729 case SkBlendMode::kXor:
Brian Salomon9a514982017-02-14 10:28:22 -0500730 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700731 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
732 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
733 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
734 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
735 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
736 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
737 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
738 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400739 case SkBlendMode::kPlus:
Brian Salomon9a514982017-02-14 10:28:22 -0500740 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700741 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
742 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
743 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
744 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
745 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
746 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
747 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
748 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400749 case SkBlendMode::kModulate:
Brian Salomon9a514982017-02-14 10:28:22 -0500750 TEST_ASSERT(xpi.fReadsDst);
bsalomon7765a472015-07-08 11:26:37 -0700751 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700752 TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType);
753 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
754 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
755 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
756 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
757 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
758 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400759 case SkBlendMode::kScreen:
Brian Salomon9a514982017-02-14 10:28:22 -0500760 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700761 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
762 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
763 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
764 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
765 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
766 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
767 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
768 break;
769 default:
770 ERRORF(reporter, "Invalid xfermode.");
771 break;
772 }
773 }
774}
775
776static void test_color_opaque_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomon5298dc82017-02-22 11:52:03 -0500777 GrProcessorSet::FragmentProcessorAnalysis analysis(GrPipelineInput::Opaque::kYes,
778 GrColorPackA4(255), caps);
cdalton6fd158e2015-05-27 15:08:33 -0700779
Brian Salomon5298dc82017-02-22 11:52:03 -0500780 SkASSERT(analysis.isOutputColorOpaque());
781 SkASSERT(!analysis.hasKnownOutputColor());
782 SkASSERT(!analysis.hasCoverage());
cdalton6fd158e2015-05-27 15:08:33 -0700783
Mike Reed7d954ad2016-10-28 15:42:34 -0400784 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
785 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon92aee3d2016-12-21 09:20:25 -0500786 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, analysis);
cdalton6fd158e2015-05-27 15:08:33 -0700787
788 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400789 case SkBlendMode::kClear:
Brian Salomon9a514982017-02-14 10:28:22 -0500790 TEST_ASSERT(!xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500791 TEST_ASSERT(kIgnoreColor_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700792 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
793 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
794 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
795 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
796 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
797 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
798 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400799 case SkBlendMode::kSrc:
Brian Salomon9a514982017-02-14 10:28:22 -0500800 TEST_ASSERT(!xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500801 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700802 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
803 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
804 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
805 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
806 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
807 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
808 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400809 case SkBlendMode::kDst:
Brian Salomon9a514982017-02-14 10:28:22 -0500810 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon02baee92017-02-24 10:37:15 -0500811 TEST_ASSERT((kIgnoreColor_OptFlag |
cdalton6fd158e2015-05-27 15:08:33 -0700812 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
813 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
814 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
815 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
816 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
817 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
818 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
819 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400820 case SkBlendMode::kSrcOver:
Brian Salomon9a514982017-02-14 10:28:22 -0500821 TEST_ASSERT(!xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500822 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700823 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
824 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
825 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
826 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
827 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
828 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
829 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400830 case SkBlendMode::kDstOver:
Brian Salomon9a514982017-02-14 10:28:22 -0500831 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500832 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700833 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
834 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
835 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
836 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
837 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
838 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
839 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400840 case SkBlendMode::kSrcIn:
Brian Salomon9a514982017-02-14 10:28:22 -0500841 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500842 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700843 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
844 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
845 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
846 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
847 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
848 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
849 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400850 case SkBlendMode::kDstIn:
Brian Salomon9a514982017-02-14 10:28:22 -0500851 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon02baee92017-02-24 10:37:15 -0500852 TEST_ASSERT((kIgnoreColor_OptFlag |
cdalton6fd158e2015-05-27 15:08:33 -0700853 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
854 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
855 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
856 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
857 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
858 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
859 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
860 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400861 case SkBlendMode::kSrcOut:
Brian Salomon9a514982017-02-14 10:28:22 -0500862 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500863 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700864 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
865 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
866 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
867 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
868 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
869 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
870 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400871 case SkBlendMode::kDstOut:
Brian Salomon9a514982017-02-14 10:28:22 -0500872 TEST_ASSERT(!xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500873 TEST_ASSERT(kIgnoreColor_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700874 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
875 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
876 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
877 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
878 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
879 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
880 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400881 case SkBlendMode::kSrcATop:
Brian Salomon9a514982017-02-14 10:28:22 -0500882 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500883 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700884 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
885 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
886 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
887 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
888 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
889 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
890 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400891 case SkBlendMode::kDstATop:
Brian Salomon9a514982017-02-14 10:28:22 -0500892 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500893 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700894 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
895 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
896 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
897 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
898 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
899 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
900 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400901 case SkBlendMode::kXor:
Brian Salomon9a514982017-02-14 10:28:22 -0500902 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500903 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700904 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
905 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
906 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
907 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
908 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
909 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
910 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400911 case SkBlendMode::kPlus:
Brian Salomon9a514982017-02-14 10:28:22 -0500912 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500913 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700914 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
915 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
916 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
917 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
918 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
919 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
920 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400921 case SkBlendMode::kModulate:
Brian Salomon9a514982017-02-14 10:28:22 -0500922 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500923 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700924 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
925 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
926 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
927 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
928 TEST_ASSERT(kSC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
929 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
930 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400931 case SkBlendMode::kScreen:
Brian Salomon9a514982017-02-14 10:28:22 -0500932 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500933 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700934 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
935 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
936 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
937 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
938 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
939 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
940 break;
941 default:
942 ERRORF(reporter, "Invalid xfermode.");
943 break;
944 }
945 }
946}
947
egdaniel723b0502015-09-15 09:31:40 -0700948static void test_lcd_coverage_fallback_case(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomon92aee3d2016-12-21 09:20:25 -0500949 class TestLCDCoverageOp : public GrMeshDrawOp {
reed1b55a962015-09-17 20:16:13 -0700950 public:
Brian Salomon25a88092016-12-01 09:36:50 -0500951 DEFINE_OP_CLASS_ID
reed1b55a962015-09-17 20:16:13 -0700952
Brian Salomon92aee3d2016-12-21 09:20:25 -0500953 TestLCDCoverageOp() : INHERITED(ClassID()) {}
cdalton6fd158e2015-05-27 15:08:33 -0700954
Brian Salomon09d994e2016-12-21 11:14:46 -0500955 const char* name() const override { return "Test LCD Text Op"; }
Brian Salomon92aee3d2016-12-21 09:20:25 -0500956
957 private:
Brian Salomon5298dc82017-02-22 11:52:03 -0500958 void getFragmentProcessorAnalysisInputs(
959 FragmentProcessorAnalysisInputs* input) const override {
960 input->colorInput()->setToConstant(GrColorPackRGBA(123, 45, 67, 221));
961 input->coverageInput()->setToLCDCoverage();
Brian Salomon92aee3d2016-12-21 09:20:25 -0500962 }
963
964 void applyPipelineOptimizations(const GrPipelineOptimizations&) override {}
Brian Salomon25a88092016-12-01 09:36:50 -0500965 bool onCombineIfPossible(GrOp*, const GrCaps&) override { return false; }
Mike Kleinfc6c37b2016-09-27 09:34:10 -0400966 void onPrepareDraws(Target*) const override {}
cdalton6fd158e2015-05-27 15:08:33 -0700967
Brian Salomondad29232016-12-01 16:40:24 -0500968 typedef GrMeshDrawOp INHERITED;
Brian Salomon92aee3d2016-12-21 09:20:25 -0500969 } testLCDCoverageOp;
cdalton6fd158e2015-05-27 15:08:33 -0700970
Brian Salomon5298dc82017-02-22 11:52:03 -0500971 GrProcessorSet::FragmentProcessorAnalysis analysis;
972 GrAppliedClip clip(SkRect::MakeLargest());
973 testLCDCoverageOp.analyzeProcessors(&analysis, GrProcessorSet(GrPaint()), clip, 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 Salomon5298dc82017-02-22 11:52:03 -0500987 TEST_ASSERT(GrXPFactory::WillReadDst(xpf, analysis));
cdalton6fd158e2015-05-27 15:08:33 -0700988
989 GrColor overrideColor;
Brian Salomon92aee3d2016-12-21 09:20:25 -0500990 xp->getOptimizations(analysis, false, &overrideColor, caps);
cdalton6fd158e2015-05-27 15:08:33 -0700991
992 GrXferProcessor::BlendInfo blendInfo;
993 xp->getBlendInfo(&blendInfo);
994 TEST_ASSERT(blendInfo.fWriteColor);
995}
996
kkinnunen15302832015-12-01 04:35:26 -0800997DEF_GPUTEST(PorterDuffNoDualSourceBlending, reporter, /*factory*/) {
cdalton6fd158e2015-05-27 15:08:33 -0700998 GrContextOptions opts;
999 opts.fSuppressDualSourceBlending = true;
bsalomon3724e572016-03-30 18:56:19 -07001000 sk_gpu_test::GrContextFactory mockFactory(opts);
bsalomon85b4b532016-04-05 11:06:27 -07001001 GrContext* ctx = mockFactory.get(sk_gpu_test::GrContextFactory::kNullGL_ContextType);
cdalton6fd158e2015-05-27 15:08:33 -07001002 if (!ctx) {
1003 SkFAIL("Failed to create null context without ARB_blend_func_extended.");
1004 return;
1005 }
1006
bsalomon76228632015-05-29 08:02:10 -07001007 const GrCaps& caps = *ctx->caps();
cdalton6fd158e2015-05-27 15:08:33 -07001008 if (caps.shaderCaps()->dualSourceBlendingSupport()) {
1009 SkFAIL("Null context failed to honor request for no ARB_blend_func_extended.");
1010 return;
1011 }
1012
bsalomon091f60c2015-11-10 11:54:56 -08001013 GrBackendObject backendTex =
bungeman6bd52842016-10-27 09:30:08 -07001014 ctx->getGpu()->createTestingOnlyBackendTexture(nullptr, 100, 100, kRGBA_8888_GrPixelConfig);
cdalton6fd158e2015-05-27 15:08:33 -07001015 GrBackendTextureDesc fakeDesc;
1016 fakeDesc.fConfig = kRGBA_8888_GrPixelConfig;
1017 fakeDesc.fWidth = fakeDesc.fHeight = 100;
bsalomon091f60c2015-11-10 11:54:56 -08001018 fakeDesc.fTextureHandle = backendTex;
cdalton6fd158e2015-05-27 15:08:33 -07001019 GrXferProcessor::DstTexture fakeDstTexture;
bungeman6bd52842016-10-27 09:30:08 -07001020 fakeDstTexture.setTexture(
Brian Osman32342f02017-03-04 08:12:46 -05001021 ctx->resourceProvider()->wrapBackendTexture(fakeDesc, kBorrow_GrWrapOwnership));
cdalton6fd158e2015-05-27 15:08:33 -07001022
Brian Salomonc6b71462017-02-14 11:33:01 -05001023 static const GrPipelineInput colorInputs[] = {GrPipelineInput(),
1024 GrPipelineInput(GrPipelineInput::Opaque::kYes),
1025 GrPipelineInput(GrColorPackRGBA(0, 82, 17, 100)),
1026 GrPipelineInput(GrColorPackRGBA(0, 82, 17, 255))};
cdalton6fd158e2015-05-27 15:08:33 -07001027
Brian Salomonc6b71462017-02-14 11:33:01 -05001028 for (const auto& colorInput : colorInputs) {
Brian Salomon5298dc82017-02-22 11:52:03 -05001029 GrProcessorSet::FragmentProcessorAnalysis analysis;
Brian Salomonc6b71462017-02-14 11:33:01 -05001030 for (bool fractionalCoverage : {true, false}) {
Brian Salomon5298dc82017-02-22 11:52:03 -05001031 if (fractionalCoverage) {
1032 analysis = GrProcessorSet::FragmentProcessorAnalysis(colorInput, GrPipelineInput(),
1033 caps);
1034 } else {
1035 analysis = GrProcessorSet::FragmentProcessorAnalysis(colorInput, GrColorPackA4(255),
1036 caps);
cdalton6fd158e2015-05-27 15:08:33 -07001037 }
Mike Reed7d954ad2016-10-28 15:42:34 -04001038 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
1039 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomona1633922017-01-09 11:46:10 -05001040 const GrXPFactory* xpf = GrPorterDuffXPFactory::Get(xfermode);
cdalton86ae0a92015-06-08 15:11:04 -07001041 GrXferProcessor::DstTexture* dstTexture =
Brian Salomon5298dc82017-02-22 11:52:03 -05001042 GrXPFactory::WillNeedDstTexture(xpf, caps, analysis) ? &fakeDstTexture : 0;
Hal Canary342b7ac2016-11-04 11:49:42 -04001043 sk_sp<GrXferProcessor> xp(
Brian Salomon92aee3d2016-12-21 09:20:25 -05001044 xpf->createXferProcessor(analysis, false, dstTexture, caps));
cdalton6fd158e2015-05-27 15:08:33 -07001045 if (!xp) {
1046 ERRORF(reporter, "Failed to create an XP without dual source blending.");
1047 return;
1048 }
1049 TEST_ASSERT(!xp->hasSecondaryOutput());
Brian Salomonbfd51832017-01-04 13:22:08 -05001050 GrColor ignoredOverrideColor;
1051 xp->getOptimizations(analysis, false, &ignoredOverrideColor, caps);
cdalton6fd158e2015-05-27 15:08:33 -07001052 TEST_ASSERT(!xp->hasSecondaryOutput());
1053 }
1054 }
1055 }
bsalomon091f60c2015-11-10 11:54:56 -08001056 ctx->getGpu()->deleteTestingOnlyBackendTexture(backendTex);
cdalton6fd158e2015-05-27 15:08:33 -07001057}
1058
1059#endif