blob: 89067cfe69feae0c7aa75b13f2b60bb1d625d76a [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 Salomon1c10fdd2017-03-03 14:30:15 -050074 fOptFlags = xp->getOptimizations(analysis);
Hal Canary342b7ac2016-11-04 11:49:42 -040075 GetXPOutputTypes(xp.get(), &fPrimaryOutputType, &fSecondaryOutputType);
cdalton6fd158e2015-05-27 15:08:33 -070076 xp->getBlendInfo(&fBlendInfo);
77 TEST_ASSERT(!xp->willReadDstColor());
78 TEST_ASSERT(xp->hasSecondaryOutput() == GrBlendCoeffRefsSrc2(fBlendInfo.fDstBlend));
79 }
80
Brian Salomon9a514982017-02-14 10:28:22 -050081 bool fReadsDst;
cdalton6fd158e2015-05-27 15:08:33 -070082 int fOptFlags;
83 int fPrimaryOutputType;
84 int fSecondaryOutputType;
85 GrXferProcessor::BlendInfo fBlendInfo;
86 };
87
88 static void GetXPOutputTypes(const GrXferProcessor* xp, int* outPrimary, int* outSecondary) {
egdanielf2342722015-11-20 15:12:59 -080089 GrPorterDuffXPFactory::TestGetXPOutputTypes(xp, outPrimary, outSecondary);
cdalton6fd158e2015-05-27 15:08:33 -070090 }
91};
92
egdaniel723b0502015-09-15 09:31:40 -070093static void test_lcd_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomon5298dc82017-02-22 11:52:03 -050094 GrPipelineInput lcdInput;
95 lcdInput.setToLCDCoverage();
96 GrProcessorSet::FragmentProcessorAnalysis analysis(GrPipelineInput(), lcdInput, caps);
egdaniel723b0502015-09-15 09:31:40 -070097
Brian Salomon5298dc82017-02-22 11:52:03 -050098 SkASSERT(!analysis.isOutputColorOpaque());
99 SkASSERT(!analysis.hasKnownOutputColor());
100 SkASSERT(analysis.hasLCDCoverage());
egdaniel723b0502015-09-15 09:31:40 -0700101
Mike Reed7d954ad2016-10-28 15:42:34 -0400102 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
103 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon92aee3d2016-12-21 09:20:25 -0500104 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, analysis);
egdaniel723b0502015-09-15 09:31:40 -0700105 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400106 case SkBlendMode::kClear:
Brian Salomon9a514982017-02-14 10:28:22 -0500107 TEST_ASSERT(xpi.fReadsDst);
egdaniel723b0502015-09-15 09:31:40 -0700108 TEST_ASSERT((kIgnoreColor_OptFlag) == xpi.fOptFlags);
109 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
110 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
111 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
112 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
113 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
114 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
115 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400116 case SkBlendMode::kSrc:
Brian Salomon9a514982017-02-14 10:28:22 -0500117 TEST_ASSERT(xpi.fReadsDst);
egdaniel723b0502015-09-15 09:31:40 -0700118 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
119 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
120 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
121 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
122 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
123 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
124 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
125 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400126 case SkBlendMode::kDst:
Brian Salomon9a514982017-02-14 10:28:22 -0500127 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon02baee92017-02-24 10:37:15 -0500128 TEST_ASSERT((kIgnoreColor_OptFlag |
egdaniel723b0502015-09-15 09:31:40 -0700129 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
130 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
131 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
132 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
133 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
134 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
135 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
136 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400137 case SkBlendMode::kSrcOver:
Brian Salomon9a514982017-02-14 10:28:22 -0500138 TEST_ASSERT(xpi.fReadsDst);
egdaniel723b0502015-09-15 09:31:40 -0700139 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
140 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
141 TEST_ASSERT(kSAModulate_OutputType == xpi.fSecondaryOutputType);
142 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
143 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
144 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
145 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
146 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400147 case SkBlendMode::kDstOver:
Brian Salomon9a514982017-02-14 10:28:22 -0500148 TEST_ASSERT(xpi.fReadsDst);
egdaniel723b0502015-09-15 09:31:40 -0700149 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
150 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
151 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
152 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
153 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
154 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
155 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
156 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400157 case SkBlendMode::kSrcIn:
Brian Salomon9a514982017-02-14 10:28:22 -0500158 TEST_ASSERT(xpi.fReadsDst);
egdaniel723b0502015-09-15 09:31:40 -0700159 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
160 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
161 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
162 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
163 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
164 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
165 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
166 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400167 case SkBlendMode::kDstIn:
Brian Salomon9a514982017-02-14 10:28:22 -0500168 TEST_ASSERT(xpi.fReadsDst);
egdaniel723b0502015-09-15 09:31:40 -0700169 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
170 TEST_ASSERT(kISAModulate_OutputType == xpi.fPrimaryOutputType);
171 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
172 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
173 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
174 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
175 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
176 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400177 case SkBlendMode::kSrcOut:
Brian Salomon9a514982017-02-14 10:28:22 -0500178 TEST_ASSERT(xpi.fReadsDst);
egdaniel723b0502015-09-15 09:31:40 -0700179 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
180 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
181 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
182 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
183 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
184 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
185 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
186 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400187 case SkBlendMode::kDstOut:
Brian Salomon9a514982017-02-14 10:28:22 -0500188 TEST_ASSERT(xpi.fReadsDst);
egdaniel723b0502015-09-15 09:31:40 -0700189 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
190 TEST_ASSERT(kSAModulate_OutputType == xpi.fPrimaryOutputType);
191 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
192 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
193 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
194 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
195 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
196 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400197 case SkBlendMode::kSrcATop:
Brian Salomon9a514982017-02-14 10:28:22 -0500198 TEST_ASSERT(xpi.fReadsDst);
egdaniel723b0502015-09-15 09:31:40 -0700199 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
200 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
201 TEST_ASSERT(kSAModulate_OutputType == xpi.fSecondaryOutputType);
202 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
203 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
204 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
205 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
206 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400207 case SkBlendMode::kDstATop:
Brian Salomon9a514982017-02-14 10:28:22 -0500208 TEST_ASSERT(xpi.fReadsDst);
egdaniel723b0502015-09-15 09:31:40 -0700209 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
210 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
211 TEST_ASSERT(kISAModulate_OutputType == xpi.fSecondaryOutputType);
212 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
213 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
214 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
215 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
216 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400217 case SkBlendMode::kXor:
Brian Salomon9a514982017-02-14 10:28:22 -0500218 TEST_ASSERT(xpi.fReadsDst);
egdaniel723b0502015-09-15 09:31:40 -0700219 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
220 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
221 TEST_ASSERT(kSAModulate_OutputType == xpi.fSecondaryOutputType);
222 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
223 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
224 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
225 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
226 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400227 case SkBlendMode::kPlus:
Brian Salomon9a514982017-02-14 10:28:22 -0500228 TEST_ASSERT(xpi.fReadsDst);
egdaniel723b0502015-09-15 09:31:40 -0700229 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
230 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
231 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
232 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
233 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
234 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
235 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
236 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400237 case SkBlendMode::kModulate:
Brian Salomon9a514982017-02-14 10:28:22 -0500238 TEST_ASSERT(xpi.fReadsDst);
egdaniel723b0502015-09-15 09:31:40 -0700239 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
240 TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType);
241 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
242 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
243 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
244 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
245 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
246 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400247 case SkBlendMode::kScreen:
Brian Salomon9a514982017-02-14 10:28:22 -0500248 TEST_ASSERT(xpi.fReadsDst);
egdaniel723b0502015-09-15 09:31:40 -0700249 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
250 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
251 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
252 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
253 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
254 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
255 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
256 break;
257 default:
258 ERRORF(reporter, "Invalid xfermode.");
259 break;
260 }
261 }
262}
cdalton6fd158e2015-05-27 15:08:33 -0700263static void test_color_unknown_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomon5298dc82017-02-22 11:52:03 -0500264 GrProcessorSet::FragmentProcessorAnalysis analysis(GrPipelineInput(), GrPipelineInput(), caps);
cdalton6fd158e2015-05-27 15:08:33 -0700265
Brian Salomon5298dc82017-02-22 11:52:03 -0500266 SkASSERT(!analysis.isOutputColorOpaque());
267 SkASSERT(!analysis.hasKnownOutputColor());
268 SkASSERT(!analysis.hasLCDCoverage());
269 SkASSERT(analysis.hasCoverage());
cdalton6fd158e2015-05-27 15:08:33 -0700270
Mike Reed7d954ad2016-10-28 15:42:34 -0400271 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
272 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon92aee3d2016-12-21 09:20:25 -0500273 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, analysis);
cdalton6fd158e2015-05-27 15:08:33 -0700274 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400275 case SkBlendMode::kClear:
Brian Salomon9a514982017-02-14 10:28:22 -0500276 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700277 TEST_ASSERT((kIgnoreColor_OptFlag) == xpi.fOptFlags);
278 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
279 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
280 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
281 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
282 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
283 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
284 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400285 case SkBlendMode::kSrc:
Brian Salomon9a514982017-02-14 10:28:22 -0500286 TEST_ASSERT(xpi.fReadsDst);
bsalomon7765a472015-07-08 11:26:37 -0700287 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700288 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
289 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
290 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
291 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
292 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
293 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
294 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400295 case SkBlendMode::kDst:
Brian Salomon9a514982017-02-14 10:28:22 -0500296 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon02baee92017-02-24 10:37:15 -0500297 TEST_ASSERT((kIgnoreColor_OptFlag |
cdalton6fd158e2015-05-27 15:08:33 -0700298 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
299 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
300 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
301 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
302 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
303 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
304 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
305 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400306 case SkBlendMode::kSrcOver:
Brian Salomon9a514982017-02-14 10:28:22 -0500307 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700308 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
309 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
310 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
311 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
312 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
313 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
314 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
315 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400316 case SkBlendMode::kDstOver:
Brian Salomon9a514982017-02-14 10:28:22 -0500317 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700318 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
319 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
320 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
321 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
322 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
323 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
324 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
325 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400326 case SkBlendMode::kSrcIn:
Brian Salomon9a514982017-02-14 10:28:22 -0500327 TEST_ASSERT(xpi.fReadsDst);
bsalomon7765a472015-07-08 11:26:37 -0700328 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700329 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
330 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
331 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
332 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
333 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
334 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
335 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400336 case SkBlendMode::kDstIn:
Brian Salomon9a514982017-02-14 10:28:22 -0500337 TEST_ASSERT(xpi.fReadsDst);
bsalomon7765a472015-07-08 11:26:37 -0700338 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700339 TEST_ASSERT(kISAModulate_OutputType == xpi.fPrimaryOutputType);
340 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
341 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
342 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
343 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
344 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
345 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400346 case SkBlendMode::kSrcOut:
Brian Salomon9a514982017-02-14 10:28:22 -0500347 TEST_ASSERT(xpi.fReadsDst);
bsalomon7765a472015-07-08 11:26:37 -0700348 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700349 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
350 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
351 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
352 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
353 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
354 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
355 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400356 case SkBlendMode::kDstOut:
Brian Salomon9a514982017-02-14 10:28:22 -0500357 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700358 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
359 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
360 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
361 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
362 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
363 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
364 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
365 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400366 case SkBlendMode::kSrcATop:
Brian Salomon9a514982017-02-14 10:28:22 -0500367 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700368 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
369 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
370 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
371 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
372 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
373 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
374 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
375 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400376 case SkBlendMode::kDstATop:
Brian Salomon9a514982017-02-14 10:28:22 -0500377 TEST_ASSERT(xpi.fReadsDst);
bsalomon7765a472015-07-08 11:26:37 -0700378 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700379 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
380 TEST_ASSERT(kISAModulate_OutputType == xpi.fSecondaryOutputType);
381 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
382 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
383 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
384 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
385 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400386 case SkBlendMode::kXor:
Brian Salomon9a514982017-02-14 10:28:22 -0500387 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700388 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
389 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
390 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
391 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
392 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
393 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
394 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
395 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400396 case SkBlendMode::kPlus:
Brian Salomon9a514982017-02-14 10:28:22 -0500397 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700398 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
399 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
400 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
401 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
402 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
403 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
404 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
405 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400406 case SkBlendMode::kModulate:
Brian Salomon9a514982017-02-14 10:28:22 -0500407 TEST_ASSERT(xpi.fReadsDst);
bsalomon7765a472015-07-08 11:26:37 -0700408 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700409 TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType);
410 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
411 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
412 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
413 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
414 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
415 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400416 case SkBlendMode::kScreen:
Brian Salomon9a514982017-02-14 10:28:22 -0500417 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700418 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
419 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
420 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
421 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
422 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
423 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
424 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
425 break;
426 default:
427 ERRORF(reporter, "Invalid xfermode.");
428 break;
429 }
430 }
431}
432
433static void test_color_unknown_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomon5298dc82017-02-22 11:52:03 -0500434 GrProcessorSet::FragmentProcessorAnalysis analysis(GrColorPackRGBA(229, 0, 154, 240),
435 GrColorPackA4(255), caps);
cdalton6fd158e2015-05-27 15:08:33 -0700436
Brian Salomon5298dc82017-02-22 11:52:03 -0500437 SkASSERT(!analysis.isOutputColorOpaque());
438 SkASSERT(analysis.hasKnownOutputColor());
439 SkASSERT(!analysis.hasCoverage());
cdalton6fd158e2015-05-27 15:08:33 -0700440
Mike Reed7d954ad2016-10-28 15:42:34 -0400441 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
442 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon92aee3d2016-12-21 09:20:25 -0500443 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, analysis);
cdalton6fd158e2015-05-27 15:08:33 -0700444 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400445 case SkBlendMode::kClear:
Brian Salomon9a514982017-02-14 10:28:22 -0500446 TEST_ASSERT(!xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500447 TEST_ASSERT(kIgnoreColor_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700448 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
449 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
450 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
451 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
452 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
453 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
454 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400455 case SkBlendMode::kSrc:
Brian Salomon9a514982017-02-14 10:28:22 -0500456 TEST_ASSERT(!xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500457 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700458 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
459 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
460 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
461 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
462 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
463 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
464 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400465 case SkBlendMode::kDst:
Brian Salomon9a514982017-02-14 10:28:22 -0500466 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon02baee92017-02-24 10:37:15 -0500467 TEST_ASSERT((kIgnoreColor_OptFlag |
cdalton6fd158e2015-05-27 15:08:33 -0700468 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
469 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
470 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
471 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
472 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
473 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
474 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
475 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400476 case SkBlendMode::kSrcOver:
Brian Salomon9a514982017-02-14 10:28:22 -0500477 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500478 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700479 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
480 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
481 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
482 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
483 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
484 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
485 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400486 case SkBlendMode::kDstOver:
Brian Salomon9a514982017-02-14 10:28:22 -0500487 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500488 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700489 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
490 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
491 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
492 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
493 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
494 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
495 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400496 case SkBlendMode::kSrcIn:
Brian Salomon9a514982017-02-14 10:28:22 -0500497 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500498 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700499 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
500 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
501 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
502 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
503 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
504 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
505 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400506 case SkBlendMode::kDstIn:
Brian Salomon9a514982017-02-14 10:28:22 -0500507 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500508 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700509 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
510 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
511 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
512 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
513 TEST_ASSERT(kSA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
514 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
515 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400516 case SkBlendMode::kSrcOut:
Brian Salomon9a514982017-02-14 10:28:22 -0500517 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500518 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700519 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
520 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
521 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
522 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
523 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
524 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
525 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400526 case SkBlendMode::kDstOut:
Brian Salomon9a514982017-02-14 10:28:22 -0500527 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500528 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700529 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
530 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
531 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
532 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
533 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
534 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
535 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400536 case SkBlendMode::kSrcATop:
Brian Salomon9a514982017-02-14 10:28:22 -0500537 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500538 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700539 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
540 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
541 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
542 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
543 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
544 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
545 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400546 case SkBlendMode::kDstATop:
Brian Salomon9a514982017-02-14 10:28:22 -0500547 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500548 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700549 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
550 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
551 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
552 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
553 TEST_ASSERT(kSA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
554 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
555 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400556 case SkBlendMode::kXor:
Brian Salomon9a514982017-02-14 10:28:22 -0500557 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500558 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700559 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
560 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
561 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
562 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
563 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
564 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
565 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400566 case SkBlendMode::kPlus:
Brian Salomon9a514982017-02-14 10:28:22 -0500567 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500568 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700569 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
570 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
571 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
572 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
573 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
574 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
575 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400576 case SkBlendMode::kModulate:
Brian Salomon9a514982017-02-14 10:28:22 -0500577 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500578 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700579 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
580 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
581 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
582 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
583 TEST_ASSERT(kSC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
584 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
585 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400586 case SkBlendMode::kScreen:
Brian Salomon9a514982017-02-14 10:28:22 -0500587 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500588 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700589 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
590 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
591 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
592 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
593 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
594 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
595 break;
596 default:
597 ERRORF(reporter, "Invalid xfermode.");
598 break;
599 }
600 }
601}
602
603static void test_color_opaque_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomon5298dc82017-02-22 11:52:03 -0500604 GrProcessorSet::FragmentProcessorAnalysis analysis(GrPipelineInput::Opaque::kYes,
605 GrPipelineInput(), caps);
cdalton6fd158e2015-05-27 15:08:33 -0700606
Brian Salomon5298dc82017-02-22 11:52:03 -0500607 SkASSERT(analysis.isOutputColorOpaque());
608 SkASSERT(!analysis.hasKnownOutputColor());
609 SkASSERT(analysis.hasCoverage());
610 SkASSERT(!analysis.hasLCDCoverage());
cdalton6fd158e2015-05-27 15:08:33 -0700611
Mike Reed7d954ad2016-10-28 15:42:34 -0400612 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
613 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon92aee3d2016-12-21 09:20:25 -0500614 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, analysis);
cdalton6fd158e2015-05-27 15:08:33 -0700615 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400616 case SkBlendMode::kClear:
Brian Salomon9a514982017-02-14 10:28:22 -0500617 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700618 TEST_ASSERT((kIgnoreColor_OptFlag) == xpi.fOptFlags);
619 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
620 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
621 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
622 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
623 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
624 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
625 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400626 case SkBlendMode::kSrc:
Brian Salomon9a514982017-02-14 10:28:22 -0500627 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700628 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
629 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
630 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
631 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
632 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
633 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
634 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
635 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400636 case SkBlendMode::kDst:
Brian Salomon9a514982017-02-14 10:28:22 -0500637 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon02baee92017-02-24 10:37:15 -0500638 TEST_ASSERT((kIgnoreColor_OptFlag |
cdalton6fd158e2015-05-27 15:08:33 -0700639 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
640 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
641 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
642 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
643 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
644 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
645 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
646 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400647 case SkBlendMode::kSrcOver:
Brian Salomon9a514982017-02-14 10:28:22 -0500648 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700649 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
650 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
651 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
652 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
653 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
654 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
655 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
656 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400657 case SkBlendMode::kDstOver:
Brian Salomon9a514982017-02-14 10:28:22 -0500658 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700659 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
660 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
661 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
662 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
663 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
664 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
665 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
666 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400667 case SkBlendMode::kSrcIn:
Brian Salomon9a514982017-02-14 10:28:22 -0500668 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700669 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
670 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
671 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
672 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
673 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
674 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
675 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
676 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400677 case SkBlendMode::kDstIn:
Brian Salomon9a514982017-02-14 10:28:22 -0500678 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon02baee92017-02-24 10:37:15 -0500679 TEST_ASSERT((kIgnoreColor_OptFlag |
cdalton6fd158e2015-05-27 15:08:33 -0700680 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
681 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
682 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
683 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
684 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
685 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
686 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
687 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400688 case SkBlendMode::kSrcOut:
Brian Salomon9a514982017-02-14 10:28:22 -0500689 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700690 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
691 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
692 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
693 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
694 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
695 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
696 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
697 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400698 case SkBlendMode::kDstOut:
Brian Salomon9a514982017-02-14 10:28:22 -0500699 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700700 TEST_ASSERT((kIgnoreColor_OptFlag) == xpi.fOptFlags);
701 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
702 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
703 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
704 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
705 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
706 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
707 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400708 case SkBlendMode::kSrcATop:
Brian Salomon9a514982017-02-14 10:28:22 -0500709 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700710 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
711 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
712 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
713 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
714 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
715 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
716 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
717 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400718 case SkBlendMode::kDstATop:
Brian Salomon9a514982017-02-14 10:28:22 -0500719 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700720 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
721 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
722 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
723 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
724 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
725 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
726 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
727 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400728 case SkBlendMode::kXor:
Brian Salomon9a514982017-02-14 10:28:22 -0500729 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700730 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
731 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
732 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
733 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
734 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
735 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
736 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
737 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400738 case SkBlendMode::kPlus:
Brian Salomon9a514982017-02-14 10:28:22 -0500739 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700740 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
741 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
742 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
743 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
744 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
745 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
746 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
747 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400748 case SkBlendMode::kModulate:
Brian Salomon9a514982017-02-14 10:28:22 -0500749 TEST_ASSERT(xpi.fReadsDst);
bsalomon7765a472015-07-08 11:26:37 -0700750 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700751 TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType);
752 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
753 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
754 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
755 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
756 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
757 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400758 case SkBlendMode::kScreen:
Brian Salomon9a514982017-02-14 10:28:22 -0500759 TEST_ASSERT(xpi.fReadsDst);
cdalton6fd158e2015-05-27 15:08:33 -0700760 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
761 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
762 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
763 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
764 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
765 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
766 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
767 break;
768 default:
769 ERRORF(reporter, "Invalid xfermode.");
770 break;
771 }
772 }
773}
774
775static void test_color_opaque_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomon5298dc82017-02-22 11:52:03 -0500776 GrProcessorSet::FragmentProcessorAnalysis analysis(GrPipelineInput::Opaque::kYes,
777 GrColorPackA4(255), caps);
cdalton6fd158e2015-05-27 15:08:33 -0700778
Brian Salomon5298dc82017-02-22 11:52:03 -0500779 SkASSERT(analysis.isOutputColorOpaque());
780 SkASSERT(!analysis.hasKnownOutputColor());
781 SkASSERT(!analysis.hasCoverage());
cdalton6fd158e2015-05-27 15:08:33 -0700782
Mike Reed7d954ad2016-10-28 15:42:34 -0400783 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
784 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon92aee3d2016-12-21 09:20:25 -0500785 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, analysis);
cdalton6fd158e2015-05-27 15:08:33 -0700786
787 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400788 case SkBlendMode::kClear:
Brian Salomon9a514982017-02-14 10:28:22 -0500789 TEST_ASSERT(!xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500790 TEST_ASSERT(kIgnoreColor_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700791 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
792 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
793 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
794 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
795 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
796 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
797 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400798 case SkBlendMode::kSrc:
Brian Salomon9a514982017-02-14 10:28:22 -0500799 TEST_ASSERT(!xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500800 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700801 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
802 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
803 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
804 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
805 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
806 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
807 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400808 case SkBlendMode::kDst:
Brian Salomon9a514982017-02-14 10:28:22 -0500809 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon02baee92017-02-24 10:37:15 -0500810 TEST_ASSERT((kIgnoreColor_OptFlag |
cdalton6fd158e2015-05-27 15:08:33 -0700811 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
812 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
813 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
814 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
815 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
816 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
817 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
818 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400819 case SkBlendMode::kSrcOver:
Brian Salomon9a514982017-02-14 10:28:22 -0500820 TEST_ASSERT(!xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500821 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700822 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
823 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
824 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
825 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
826 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
827 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
828 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400829 case SkBlendMode::kDstOver:
Brian Salomon9a514982017-02-14 10:28:22 -0500830 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500831 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700832 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
833 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
834 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
835 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
836 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
837 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
838 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400839 case SkBlendMode::kSrcIn:
Brian Salomon9a514982017-02-14 10:28:22 -0500840 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500841 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700842 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
843 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
844 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
845 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
846 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
847 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
848 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400849 case SkBlendMode::kDstIn:
Brian Salomon9a514982017-02-14 10:28:22 -0500850 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon02baee92017-02-24 10:37:15 -0500851 TEST_ASSERT((kIgnoreColor_OptFlag |
cdalton6fd158e2015-05-27 15:08:33 -0700852 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
853 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
854 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
855 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
856 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
857 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
858 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
859 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400860 case SkBlendMode::kSrcOut:
Brian Salomon9a514982017-02-14 10:28:22 -0500861 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500862 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700863 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
864 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
865 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
866 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
867 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
868 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
869 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400870 case SkBlendMode::kDstOut:
Brian Salomon9a514982017-02-14 10:28:22 -0500871 TEST_ASSERT(!xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500872 TEST_ASSERT(kIgnoreColor_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700873 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
874 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
875 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
876 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
877 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
878 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
879 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400880 case SkBlendMode::kSrcATop:
Brian Salomon9a514982017-02-14 10:28:22 -0500881 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500882 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700883 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
884 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
885 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
886 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
887 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
888 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
889 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400890 case SkBlendMode::kDstATop:
Brian Salomon9a514982017-02-14 10:28:22 -0500891 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500892 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700893 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
894 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
895 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
896 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
897 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
898 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
899 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400900 case SkBlendMode::kXor:
Brian Salomon9a514982017-02-14 10:28:22 -0500901 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500902 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700903 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
904 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
905 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
906 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
907 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
908 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
909 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400910 case SkBlendMode::kPlus:
Brian Salomon9a514982017-02-14 10:28:22 -0500911 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500912 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700913 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
914 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
915 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
916 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
917 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
918 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
919 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400920 case SkBlendMode::kModulate:
Brian Salomon9a514982017-02-14 10:28:22 -0500921 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500922 TEST_ASSERT(kNone_OptFlags == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700923 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
924 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
925 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
926 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
927 TEST_ASSERT(kSC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
928 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
929 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400930 case SkBlendMode::kScreen:
Brian Salomon9a514982017-02-14 10:28:22 -0500931 TEST_ASSERT(xpi.fReadsDst);
Brian Salomon8c852be2017-01-04 10:44:42 -0500932 TEST_ASSERT(kCanTweakAlphaForCoverage_OptFlag == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700933 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
934 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
935 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
936 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
937 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
938 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
939 break;
940 default:
941 ERRORF(reporter, "Invalid xfermode.");
942 break;
943 }
944 }
945}
946
egdaniel723b0502015-09-15 09:31:40 -0700947static void test_lcd_coverage_fallback_case(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomon92aee3d2016-12-21 09:20:25 -0500948 class TestLCDCoverageOp : public GrMeshDrawOp {
reed1b55a962015-09-17 20:16:13 -0700949 public:
Brian Salomon25a88092016-12-01 09:36:50 -0500950 DEFINE_OP_CLASS_ID
reed1b55a962015-09-17 20:16:13 -0700951
Brian Salomon92aee3d2016-12-21 09:20:25 -0500952 TestLCDCoverageOp() : INHERITED(ClassID()) {}
cdalton6fd158e2015-05-27 15:08:33 -0700953
Brian Salomon09d994e2016-12-21 11:14:46 -0500954 const char* name() const override { return "Test LCD Text Op"; }
Brian Salomon92aee3d2016-12-21 09:20:25 -0500955
956 private:
Brian Salomon5298dc82017-02-22 11:52:03 -0500957 void getFragmentProcessorAnalysisInputs(
958 FragmentProcessorAnalysisInputs* input) const override {
959 input->colorInput()->setToConstant(GrColorPackRGBA(123, 45, 67, 221));
960 input->coverageInput()->setToLCDCoverage();
Brian Salomon92aee3d2016-12-21 09:20:25 -0500961 }
962
963 void applyPipelineOptimizations(const GrPipelineOptimizations&) override {}
Brian Salomon25a88092016-12-01 09:36:50 -0500964 bool onCombineIfPossible(GrOp*, const GrCaps&) override { return false; }
Mike Kleinfc6c37b2016-09-27 09:34:10 -0400965 void onPrepareDraws(Target*) const override {}
cdalton6fd158e2015-05-27 15:08:33 -0700966
Brian Salomondad29232016-12-01 16:40:24 -0500967 typedef GrMeshDrawOp INHERITED;
Brian Salomon92aee3d2016-12-21 09:20:25 -0500968 } testLCDCoverageOp;
cdalton6fd158e2015-05-27 15:08:33 -0700969
Brian Salomon5298dc82017-02-22 11:52:03 -0500970 GrProcessorSet::FragmentProcessorAnalysis analysis;
971 GrAppliedClip clip(SkRect::MakeLargest());
972 testLCDCoverageOp.analyzeProcessors(&analysis, GrProcessorSet(GrPaint()), clip, caps);
cdalton6fd158e2015-05-27 15:08:33 -0700973
Brian Salomon5298dc82017-02-22 11:52:03 -0500974 SkASSERT(analysis.hasKnownOutputColor());
975 SkASSERT(analysis.hasLCDCoverage());
cdalton6fd158e2015-05-27 15:08:33 -0700976
Brian Salomona1633922017-01-09 11:46:10 -0500977 const GrXPFactory* xpf = GrPorterDuffXPFactory::Get(SkBlendMode::kSrcOver);
Brian Salomon5298dc82017-02-22 11:52:03 -0500978 TEST_ASSERT(!GrXPFactory::WillNeedDstTexture(xpf, caps, analysis));
cdalton6fd158e2015-05-27 15:08:33 -0700979
Brian Salomon92aee3d2016-12-21 09:20:25 -0500980 sk_sp<GrXferProcessor> xp(xpf->createXferProcessor(analysis, false, nullptr, caps));
cdalton6fd158e2015-05-27 15:08:33 -0700981 if (!xp) {
982 ERRORF(reporter, "Failed to create an XP with LCD coverage.");
983 return;
984 }
985
Brian Salomon5298dc82017-02-22 11:52:03 -0500986 TEST_ASSERT(GrXPFactory::WillReadDst(xpf, analysis));
cdalton6fd158e2015-05-27 15:08:33 -0700987
Brian Salomon1c10fdd2017-03-03 14:30:15 -0500988 xp->getOptimizations(analysis);
cdalton6fd158e2015-05-27 15:08:33 -0700989
990 GrXferProcessor::BlendInfo blendInfo;
991 xp->getBlendInfo(&blendInfo);
992 TEST_ASSERT(blendInfo.fWriteColor);
993}
994
kkinnunen15302832015-12-01 04:35:26 -0800995DEF_GPUTEST(PorterDuffNoDualSourceBlending, reporter, /*factory*/) {
cdalton6fd158e2015-05-27 15:08:33 -0700996 GrContextOptions opts;
997 opts.fSuppressDualSourceBlending = true;
bsalomon3724e572016-03-30 18:56:19 -0700998 sk_gpu_test::GrContextFactory mockFactory(opts);
bsalomon85b4b532016-04-05 11:06:27 -0700999 GrContext* ctx = mockFactory.get(sk_gpu_test::GrContextFactory::kNullGL_ContextType);
cdalton6fd158e2015-05-27 15:08:33 -07001000 if (!ctx) {
1001 SkFAIL("Failed to create null context without ARB_blend_func_extended.");
1002 return;
1003 }
1004
bsalomon76228632015-05-29 08:02:10 -07001005 const GrCaps& caps = *ctx->caps();
cdalton6fd158e2015-05-27 15:08:33 -07001006 if (caps.shaderCaps()->dualSourceBlendingSupport()) {
1007 SkFAIL("Null context failed to honor request for no ARB_blend_func_extended.");
1008 return;
1009 }
1010
bsalomon091f60c2015-11-10 11:54:56 -08001011 GrBackendObject backendTex =
bungeman6bd52842016-10-27 09:30:08 -07001012 ctx->getGpu()->createTestingOnlyBackendTexture(nullptr, 100, 100, kRGBA_8888_GrPixelConfig);
cdalton6fd158e2015-05-27 15:08:33 -07001013 GrBackendTextureDesc fakeDesc;
1014 fakeDesc.fConfig = kRGBA_8888_GrPixelConfig;
1015 fakeDesc.fWidth = fakeDesc.fHeight = 100;
bsalomon091f60c2015-11-10 11:54:56 -08001016 fakeDesc.fTextureHandle = backendTex;
cdalton6fd158e2015-05-27 15:08:33 -07001017 GrXferProcessor::DstTexture fakeDstTexture;
bungeman6bd52842016-10-27 09:30:08 -07001018 fakeDstTexture.setTexture(
Brian Osman32342f02017-03-04 08:12:46 -05001019 ctx->resourceProvider()->wrapBackendTexture(fakeDesc, kBorrow_GrWrapOwnership));
cdalton6fd158e2015-05-27 15:08:33 -07001020
Brian Salomonc6b71462017-02-14 11:33:01 -05001021 static const GrPipelineInput colorInputs[] = {GrPipelineInput(),
1022 GrPipelineInput(GrPipelineInput::Opaque::kYes),
1023 GrPipelineInput(GrColorPackRGBA(0, 82, 17, 100)),
1024 GrPipelineInput(GrColorPackRGBA(0, 82, 17, 255))};
cdalton6fd158e2015-05-27 15:08:33 -07001025
Brian Salomonc6b71462017-02-14 11:33:01 -05001026 for (const auto& colorInput : colorInputs) {
Brian Salomon5298dc82017-02-22 11:52:03 -05001027 GrProcessorSet::FragmentProcessorAnalysis analysis;
Brian Salomonc6b71462017-02-14 11:33:01 -05001028 for (bool fractionalCoverage : {true, false}) {
Brian Salomon5298dc82017-02-22 11:52:03 -05001029 if (fractionalCoverage) {
1030 analysis = GrProcessorSet::FragmentProcessorAnalysis(colorInput, GrPipelineInput(),
1031 caps);
1032 } else {
1033 analysis = GrProcessorSet::FragmentProcessorAnalysis(colorInput, GrColorPackA4(255),
1034 caps);
cdalton6fd158e2015-05-27 15:08:33 -07001035 }
Mike Reed7d954ad2016-10-28 15:42:34 -04001036 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
1037 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomona1633922017-01-09 11:46:10 -05001038 const GrXPFactory* xpf = GrPorterDuffXPFactory::Get(xfermode);
cdalton86ae0a92015-06-08 15:11:04 -07001039 GrXferProcessor::DstTexture* dstTexture =
Brian Salomon5298dc82017-02-22 11:52:03 -05001040 GrXPFactory::WillNeedDstTexture(xpf, caps, analysis) ? &fakeDstTexture : 0;
Hal Canary342b7ac2016-11-04 11:49:42 -04001041 sk_sp<GrXferProcessor> xp(
Brian Salomon92aee3d2016-12-21 09:20:25 -05001042 xpf->createXferProcessor(analysis, false, dstTexture, caps));
cdalton6fd158e2015-05-27 15:08:33 -07001043 if (!xp) {
1044 ERRORF(reporter, "Failed to create an XP without dual source blending.");
1045 return;
1046 }
1047 TEST_ASSERT(!xp->hasSecondaryOutput());
Brian Salomon1c10fdd2017-03-03 14:30:15 -05001048 xp->getOptimizations(analysis);
cdalton6fd158e2015-05-27 15:08:33 -07001049 TEST_ASSERT(!xp->hasSecondaryOutput());
1050 }
1051 }
1052 }
bsalomon091f60c2015-11-10 11:54:56 -08001053 ctx->getGpu()->deleteTestingOnlyBackendTexture(backendTex);
cdalton6fd158e2015-05-27 15:08:33 -07001054}
1055
1056#endif