blob: 6005be57a4abb08cf4d7418a2f4cddefdccf05b6 [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
Herb Derbyd3895d82018-09-04 13:27:00 -040010#include "GrBackendSurface.h"
cdalton6fd158e2015-05-27 15:08:33 -070011#include "GrContextFactory.h"
12#include "GrContextOptions.h"
Greg Daniel7ef28f32017-04-20 16:41:55 +000013#include "GrContextPriv.h"
cdalton6fd158e2015-05-27 15:08:33 -070014#include "GrGpu.h"
Robert Phillips0bd24dc2018-01-16 08:06:32 -050015#include "GrProxyProvider.h"
cdalton6fd158e2015-05-27 15:08:33 -070016#include "GrXferProcessor.h"
17#include "effects/GrPorterDuffXferProcessor.h"
18#include "gl/GrGLCaps.h"
Brian Salomon89527432016-12-16 09:52:16 -050019#include "ops/GrMeshDrawOp.h"
cdalton6fd158e2015-05-27 15:08:33 -070020
21////////////////////////////////////////////////////////////////////////////////
22
23static void test_color_unknown_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps);
Brian Salomon31853842017-03-28 16:32:05 -040024static void test_color_not_opaque_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps);
cdalton6fd158e2015-05-27 15:08:33 -070025static void test_color_opaque_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps);
26static void test_color_opaque_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps);
27static void test_lcd_coverage(skiatest::Reporter* reporter, const GrCaps& caps);
egdaniel723b0502015-09-15 09:31:40 -070028static void test_lcd_coverage_fallback_case(skiatest::Reporter* reporter, const GrCaps& caps);
cdalton6fd158e2015-05-27 15:08:33 -070029
bsalomon758586c2016-04-06 14:02:39 -070030DEF_GPUTEST_FOR_NULLGL_CONTEXT(GrPorterDuff, reporter, ctxInfo) {
Robert Phillipsf35fd8d2018-01-22 10:48:15 -050031 const GrCaps& caps = *ctxInfo.grContext()->contextPriv().getGpu()->caps();
cdalton6fd158e2015-05-27 15:08:33 -070032 if (!caps.shaderCaps()->dualSourceBlendingSupport()) {
Ben Wagnerb4aab9a2017-08-16 10:53:04 -040033 SK_ABORT("Null context does not support dual source blending.");
cdalton6fd158e2015-05-27 15:08:33 -070034 return;
35 }
36
37 test_color_unknown_with_coverage(reporter, caps);
Brian Salomon31853842017-03-28 16:32:05 -040038 test_color_not_opaque_no_coverage(reporter, caps);
cdalton6fd158e2015-05-27 15:08:33 -070039 test_color_opaque_with_coverage(reporter, caps);
40 test_color_opaque_no_coverage(reporter, caps);
41 test_lcd_coverage(reporter, caps);
egdaniel723b0502015-09-15 09:31:40 -070042 test_lcd_coverage_fallback_case(reporter, caps);
cdalton6fd158e2015-05-27 15:08:33 -070043}
44
45////////////////////////////////////////////////////////////////////////////////
46
47#define TEST_ASSERT(...) REPORTER_ASSERT(reporter, __VA_ARGS__)
48
49enum {
50 kNone_OutputType,
51 kCoverage_OutputType,
52 kModulate_OutputType,
egdaniel723b0502015-09-15 09:31:40 -070053 kSAModulate_OutputType,
cdalton6fd158e2015-05-27 15:08:33 -070054 kISAModulate_OutputType,
55 kISCModulate_OutputType
56};
Greg Daniel79cdf282017-05-22 15:56:22 -040057static const int kInvalid_OutputType = -1;
cdalton6fd158e2015-05-27 15:08:33 -070058
Brian Salomon48d1b4c2017-04-08 07:38:53 -040059static GrProcessorSet::Analysis do_analysis(const GrXPFactory* xpf,
60 const GrProcessorAnalysisColor& colorInput,
61 GrProcessorAnalysisCoverage coverageInput,
62 const GrCaps& caps) {
63 GrPaint paint;
64 paint.setXPFactory(xpf);
65 GrProcessorSet procs(std::move(paint));
Brian Osmancf860852018-10-31 14:04:39 -040066 SkPMColor4f overrideColor;
Brian Salomon48d1b4c2017-04-08 07:38:53 -040067 GrProcessorSet::Analysis analysis =
Brian Osman532b3f92018-07-11 10:02:07 -040068 procs.finalize(colorInput, coverageInput, nullptr, false, caps, &overrideColor);
Brian Salomon48d1b4c2017-04-08 07:38:53 -040069 return analysis;
70}
71
cdalton6fd158e2015-05-27 15:08:33 -070072class GrPorterDuffTest {
73public:
74 struct XPInfo {
Mike Reed7d954ad2016-10-28 15:42:34 -040075 XPInfo(skiatest::Reporter* reporter, SkBlendMode xfermode, const GrCaps& caps,
Brian Salomona811b122017-03-30 08:21:32 -040076 GrProcessorAnalysisColor inputColor, GrProcessorAnalysisCoverage inputCoverage) {
Brian Salomona1633922017-01-09 11:46:10 -050077 const GrXPFactory* xpf = GrPorterDuffXPFactory::Get(xfermode);
Brian Salomon48d1b4c2017-04-08 07:38:53 -040078
Greg Daniel79cdf282017-05-22 15:56:22 -040079 bool isLCD = GrProcessorAnalysisCoverage::kLCD == inputCoverage;
80
Brian Salomon48d1b4c2017-04-08 07:38:53 -040081 GrProcessorSet::Analysis analysis = do_analysis(xpf, inputColor, inputCoverage, caps);
Brian Salomon31853842017-03-28 16:32:05 -040082 fCompatibleWithCoverageAsAlpha = analysis.isCompatibleWithCoverageAsAlpha();
Brian Salomon48d1b4c2017-04-08 07:38:53 -040083 fIgnoresInputColor = analysis.inputColorIsIgnored();
Brian Salomond61c9d92017-04-10 10:54:25 -040084 sk_sp<const GrXferProcessor> xp(
Brian Osman532b3f92018-07-11 10:02:07 -040085 GrXPFactory::MakeXferProcessor(xpf, inputColor, inputCoverage, false, caps));
Greg Daniel79cdf282017-05-22 15:56:22 -040086 TEST_ASSERT(!analysis.requiresDstTexture() ||
87 (isLCD &&
88 !caps.shaderCaps()->dstReadInShaderSupport() &&
89 (SkBlendMode::kSrcOver != xfermode ||
90 !inputColor.isOpaque())));
Chris Dalton945ee652019-01-23 09:10:36 -070091 // Porter Duff modes currently only use fixed-function or shader blending, and Ganesh
92 // doesn't yet make use of framebuffer fetches that require a barrier
93 // (e.g., QCOM_shader_framebuffer_fetch_noncoherent). So dst textures and xfer barriers
94 // should always go hand in hand for Porter Duff modes.
95 TEST_ASSERT(analysis.requiresDstTexture() == analysis.requiresNonOverlappingDraws());
Hal Canary342b7ac2016-11-04 11:49:42 -040096 GetXPOutputTypes(xp.get(), &fPrimaryOutputType, &fSecondaryOutputType);
cdalton6fd158e2015-05-27 15:08:33 -070097 xp->getBlendInfo(&fBlendInfo);
Greg Daniel79cdf282017-05-22 15:56:22 -040098 TEST_ASSERT(!xp->willReadDstColor() ||
99 (isLCD && (SkBlendMode::kSrcOver != xfermode ||
100 !inputColor.isOpaque())));
cdalton6fd158e2015-05-27 15:08:33 -0700101 TEST_ASSERT(xp->hasSecondaryOutput() == GrBlendCoeffRefsSrc2(fBlendInfo.fDstBlend));
102 }
103
Brian Salomon31853842017-03-28 16:32:05 -0400104 bool fCompatibleWithCoverageAsAlpha;
105 bool fIgnoresInputColor;
cdalton6fd158e2015-05-27 15:08:33 -0700106 int fPrimaryOutputType;
107 int fSecondaryOutputType;
108 GrXferProcessor::BlendInfo fBlendInfo;
109 };
110
111 static void GetXPOutputTypes(const GrXferProcessor* xp, int* outPrimary, int* outSecondary) {
egdanielf2342722015-11-20 15:12:59 -0800112 GrPorterDuffXPFactory::TestGetXPOutputTypes(xp, outPrimary, outSecondary);
cdalton6fd158e2015-05-27 15:08:33 -0700113 }
114};
115
egdaniel723b0502015-09-15 09:31:40 -0700116static void test_lcd_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Greg Daniel6ebe4b92017-05-19 10:56:46 -0400117 GrProcessorAnalysisColor inputColor = GrProcessorAnalysisColor::Opaque::kYes;
Brian Salomona811b122017-03-30 08:21:32 -0400118 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kLCD;
egdaniel723b0502015-09-15 09:31:40 -0700119
Mike Reed7d954ad2016-10-28 15:42:34 -0400120 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
121 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon31853842017-03-28 16:32:05 -0400122 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
egdaniel723b0502015-09-15 09:31:40 -0700123 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400124 case SkBlendMode::kClear:
Brian Salomon31853842017-03-28 16:32:05 -0400125 TEST_ASSERT(xpi.fIgnoresInputColor);
126 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400127 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
128 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
129 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
130 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
131 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700132 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
133 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400134 case SkBlendMode::kSrc:
Brian Salomon31853842017-03-28 16:32:05 -0400135 TEST_ASSERT(!xpi.fIgnoresInputColor);
136 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400137 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
138 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700139 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
140 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
Greg Daniel79cdf282017-05-22 15:56:22 -0400141 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700142 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
143 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400144 case SkBlendMode::kDst:
Brian Salomon31853842017-03-28 16:32:05 -0400145 TEST_ASSERT(xpi.fIgnoresInputColor);
146 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400147 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
148 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700149 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400150 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
151 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
152 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
egdaniel723b0502015-09-15 09:31:40 -0700153 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400154 case SkBlendMode::kSrcOver:
Brian Salomon31853842017-03-28 16:32:05 -0400155 TEST_ASSERT(!xpi.fIgnoresInputColor);
156 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
egdaniel723b0502015-09-15 09:31:40 -0700157 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
158 TEST_ASSERT(kSAModulate_OutputType == xpi.fSecondaryOutputType);
159 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
160 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
161 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
162 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
163 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400164 case SkBlendMode::kDstOver:
Brian Salomon31853842017-03-28 16:32:05 -0400165 TEST_ASSERT(!xpi.fIgnoresInputColor);
166 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400167 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
168 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700169 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400170 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
171 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700172 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
173 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400174 case SkBlendMode::kSrcIn:
Brian Salomon31853842017-03-28 16:32:05 -0400175 TEST_ASSERT(!xpi.fIgnoresInputColor);
176 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400177 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
178 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700179 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400180 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
181 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700182 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
183 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400184 case SkBlendMode::kDstIn:
Brian Salomon31853842017-03-28 16:32:05 -0400185 TEST_ASSERT(!xpi.fIgnoresInputColor);
186 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400187 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
188 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
189 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
190 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
191 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700192 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
193 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400194 case SkBlendMode::kSrcOut:
Brian Salomon31853842017-03-28 16:32:05 -0400195 TEST_ASSERT(!xpi.fIgnoresInputColor);
196 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400197 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
198 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700199 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400200 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
201 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700202 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
203 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400204 case SkBlendMode::kDstOut:
Brian Salomon31853842017-03-28 16:32:05 -0400205 TEST_ASSERT(!xpi.fIgnoresInputColor);
206 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400207 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
208 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700209 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400210 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
211 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700212 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
213 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400214 case SkBlendMode::kSrcATop:
Brian Salomon31853842017-03-28 16:32:05 -0400215 TEST_ASSERT(!xpi.fIgnoresInputColor);
216 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400217 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
218 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700219 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400220 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
221 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700222 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
223 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400224 case SkBlendMode::kDstATop:
Brian Salomon31853842017-03-28 16:32:05 -0400225 TEST_ASSERT(!xpi.fIgnoresInputColor);
226 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400227 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
228 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700229 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400230 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
231 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700232 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
233 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400234 case SkBlendMode::kXor:
Brian Salomon31853842017-03-28 16:32:05 -0400235 TEST_ASSERT(!xpi.fIgnoresInputColor);
236 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400237 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
238 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700239 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400240 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
241 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700242 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
243 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400244 case SkBlendMode::kPlus:
Brian Salomon31853842017-03-28 16:32:05 -0400245 TEST_ASSERT(!xpi.fIgnoresInputColor);
246 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400247 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
248 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700249 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
250 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
Greg Daniel79cdf282017-05-22 15:56:22 -0400251 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700252 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
253 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400254 case SkBlendMode::kModulate:
Brian Salomon31853842017-03-28 16:32:05 -0400255 TEST_ASSERT(!xpi.fIgnoresInputColor);
256 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400257 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
258 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
259 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
260 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
261 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700262 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
263 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400264 case SkBlendMode::kScreen:
Brian Salomon31853842017-03-28 16:32:05 -0400265 TEST_ASSERT(!xpi.fIgnoresInputColor);
266 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400267 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
268 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700269 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
270 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
Greg Daniel79cdf282017-05-22 15:56:22 -0400271 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700272 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
273 break;
274 default:
275 ERRORF(reporter, "Invalid xfermode.");
276 break;
277 }
278 }
279}
cdalton6fd158e2015-05-27 15:08:33 -0700280static void test_color_unknown_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomona811b122017-03-30 08:21:32 -0400281 GrProcessorAnalysisColor inputColor = GrProcessorAnalysisColor::Opaque::kNo;
282 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kSingleChannel;
cdalton6fd158e2015-05-27 15:08:33 -0700283
Mike Reed7d954ad2016-10-28 15:42:34 -0400284 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
285 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon31853842017-03-28 16:32:05 -0400286 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
cdalton6fd158e2015-05-27 15:08:33 -0700287 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400288 case SkBlendMode::kClear:
Brian Salomon31853842017-03-28 16:32:05 -0400289 TEST_ASSERT(xpi.fIgnoresInputColor);
290 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700291 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
292 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
293 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
294 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
295 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
296 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
297 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400298 case SkBlendMode::kSrc:
Brian Salomon31853842017-03-28 16:32:05 -0400299 TEST_ASSERT(!xpi.fIgnoresInputColor);
300 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700301 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
302 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
303 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
304 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
305 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
306 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
307 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400308 case SkBlendMode::kDst:
Brian Salomon31853842017-03-28 16:32:05 -0400309 TEST_ASSERT(xpi.fIgnoresInputColor);
310 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700311 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
312 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
313 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
314 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
315 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
316 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
317 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400318 case SkBlendMode::kSrcOver:
Brian Salomon31853842017-03-28 16:32:05 -0400319 TEST_ASSERT(!xpi.fIgnoresInputColor);
320 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700321 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
322 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
323 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
324 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
325 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
326 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
327 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400328 case SkBlendMode::kDstOver:
Brian Salomon31853842017-03-28 16:32:05 -0400329 TEST_ASSERT(!xpi.fIgnoresInputColor);
330 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700331 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
332 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
333 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
334 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
335 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
336 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
337 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400338 case SkBlendMode::kSrcIn:
Brian Salomon31853842017-03-28 16:32:05 -0400339 TEST_ASSERT(!xpi.fIgnoresInputColor);
340 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700341 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
342 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
343 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
344 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
345 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
346 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
347 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400348 case SkBlendMode::kDstIn:
Brian Salomon31853842017-03-28 16:32:05 -0400349 TEST_ASSERT(!xpi.fIgnoresInputColor);
350 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700351 TEST_ASSERT(kISAModulate_OutputType == xpi.fPrimaryOutputType);
352 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
353 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
354 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
355 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
356 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
357 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400358 case SkBlendMode::kSrcOut:
Brian Salomon31853842017-03-28 16:32:05 -0400359 TEST_ASSERT(!xpi.fIgnoresInputColor);
360 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700361 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
362 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
363 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
364 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
365 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
366 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
367 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400368 case SkBlendMode::kDstOut:
Brian Salomon31853842017-03-28 16:32:05 -0400369 TEST_ASSERT(!xpi.fIgnoresInputColor);
370 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700371 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
372 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
373 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
374 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
375 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
376 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
377 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400378 case SkBlendMode::kSrcATop:
Brian Salomon31853842017-03-28 16:32:05 -0400379 TEST_ASSERT(!xpi.fIgnoresInputColor);
380 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700381 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
382 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
383 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
384 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
385 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
386 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
387 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400388 case SkBlendMode::kDstATop:
Brian Salomon31853842017-03-28 16:32:05 -0400389 TEST_ASSERT(!xpi.fIgnoresInputColor);
390 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700391 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
392 TEST_ASSERT(kISAModulate_OutputType == xpi.fSecondaryOutputType);
393 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
394 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
395 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
396 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
397 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400398 case SkBlendMode::kXor:
Brian Salomon31853842017-03-28 16:32:05 -0400399 TEST_ASSERT(!xpi.fIgnoresInputColor);
400 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700401 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
402 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
403 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
404 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
405 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
406 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
407 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400408 case SkBlendMode::kPlus:
Brian Salomon31853842017-03-28 16:32:05 -0400409 TEST_ASSERT(!xpi.fIgnoresInputColor);
410 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700411 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
412 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
413 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
414 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
415 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
416 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
417 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400418 case SkBlendMode::kModulate:
Brian Salomon31853842017-03-28 16:32:05 -0400419 TEST_ASSERT(!xpi.fIgnoresInputColor);
420 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700421 TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType);
422 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
423 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
424 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
425 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
426 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
427 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400428 case SkBlendMode::kScreen:
Brian Salomon31853842017-03-28 16:32:05 -0400429 TEST_ASSERT(!xpi.fIgnoresInputColor);
430 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700431 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
432 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
433 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
434 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
435 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
436 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
437 break;
438 default:
439 ERRORF(reporter, "Invalid xfermode.");
440 break;
441 }
442 }
443}
444
Brian Salomon31853842017-03-28 16:32:05 -0400445static void test_color_not_opaque_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Osmancf860852018-10-31 14:04:39 -0400446 GrProcessorAnalysisColor inputColor(
447 SkPMColor4f::FromBytes_RGBA(GrColorPackRGBA(229, 0, 154, 240)));
Brian Salomona811b122017-03-30 08:21:32 -0400448 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kNone;
cdalton6fd158e2015-05-27 15:08:33 -0700449
Mike Reed7d954ad2016-10-28 15:42:34 -0400450 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
451 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon31853842017-03-28 16:32:05 -0400452 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
cdalton6fd158e2015-05-27 15:08:33 -0700453 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400454 case SkBlendMode::kClear:
Brian Salomon31853842017-03-28 16:32:05 -0400455 TEST_ASSERT(xpi.fIgnoresInputColor);
456 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700457 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
458 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
459 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
460 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
461 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
462 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
463 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400464 case SkBlendMode::kSrc:
Brian Salomon31853842017-03-28 16:32:05 -0400465 TEST_ASSERT(!xpi.fIgnoresInputColor);
466 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700467 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
468 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
469 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
470 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
471 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
472 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
473 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400474 case SkBlendMode::kDst:
Brian Salomon31853842017-03-28 16:32:05 -0400475 TEST_ASSERT(xpi.fIgnoresInputColor);
476 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700477 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
478 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
479 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
480 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
481 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
482 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
483 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400484 case SkBlendMode::kSrcOver:
Brian Salomon31853842017-03-28 16:32:05 -0400485 TEST_ASSERT(!xpi.fIgnoresInputColor);
486 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700487 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
488 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
489 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
490 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
491 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
492 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
493 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400494 case SkBlendMode::kDstOver:
Brian Salomon31853842017-03-28 16:32:05 -0400495 TEST_ASSERT(!xpi.fIgnoresInputColor);
496 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700497 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
498 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
499 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
500 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
501 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
502 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
503 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400504 case SkBlendMode::kSrcIn:
Brian Salomon31853842017-03-28 16:32:05 -0400505 TEST_ASSERT(!xpi.fIgnoresInputColor);
506 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700507 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
508 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
509 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
510 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
511 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
512 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
513 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400514 case SkBlendMode::kDstIn:
Brian Salomon31853842017-03-28 16:32:05 -0400515 TEST_ASSERT(!xpi.fIgnoresInputColor);
516 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700517 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
518 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
519 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
520 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
521 TEST_ASSERT(kSA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
522 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
523 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400524 case SkBlendMode::kSrcOut:
Brian Salomon31853842017-03-28 16:32:05 -0400525 TEST_ASSERT(!xpi.fIgnoresInputColor);
526 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700527 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
528 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
529 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
530 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
531 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
532 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
533 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400534 case SkBlendMode::kDstOut:
Brian Salomon31853842017-03-28 16:32:05 -0400535 TEST_ASSERT(!xpi.fIgnoresInputColor);
536 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700537 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
538 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
539 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
540 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
541 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
542 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
543 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400544 case SkBlendMode::kSrcATop:
Brian Salomon31853842017-03-28 16:32:05 -0400545 TEST_ASSERT(!xpi.fIgnoresInputColor);
546 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700547 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
548 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
549 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
550 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
551 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
552 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
553 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400554 case SkBlendMode::kDstATop:
Brian Salomon31853842017-03-28 16:32:05 -0400555 TEST_ASSERT(!xpi.fIgnoresInputColor);
556 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700557 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
558 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
559 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
560 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
561 TEST_ASSERT(kSA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
562 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
563 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400564 case SkBlendMode::kXor:
Brian Salomon31853842017-03-28 16:32:05 -0400565 TEST_ASSERT(!xpi.fIgnoresInputColor);
566 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700567 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
568 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
569 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
570 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
571 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
572 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
573 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400574 case SkBlendMode::kPlus:
Brian Salomon31853842017-03-28 16:32:05 -0400575 TEST_ASSERT(!xpi.fIgnoresInputColor);
576 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700577 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
578 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
579 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
580 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
581 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
582 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
583 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400584 case SkBlendMode::kModulate:
Brian Salomon31853842017-03-28 16:32:05 -0400585 TEST_ASSERT(!xpi.fIgnoresInputColor);
586 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700587 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
588 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
589 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
590 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
591 TEST_ASSERT(kSC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
592 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
593 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400594 case SkBlendMode::kScreen:
Brian Salomon31853842017-03-28 16:32:05 -0400595 TEST_ASSERT(!xpi.fIgnoresInputColor);
596 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700597 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
598 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
599 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
600 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
601 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
602 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
603 break;
604 default:
605 ERRORF(reporter, "Invalid xfermode.");
606 break;
607 }
608 }
609}
610
611static void test_color_opaque_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomona811b122017-03-30 08:21:32 -0400612 GrProcessorAnalysisColor inputColor = GrProcessorAnalysisColor::Opaque::kYes;
613 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kSingleChannel;
cdalton6fd158e2015-05-27 15:08:33 -0700614
Mike Reed7d954ad2016-10-28 15:42:34 -0400615 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
616 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon31853842017-03-28 16:32:05 -0400617 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
cdalton6fd158e2015-05-27 15:08:33 -0700618 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400619 case SkBlendMode::kClear:
Brian Salomon31853842017-03-28 16:32:05 -0400620 TEST_ASSERT(xpi.fIgnoresInputColor);
621 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700622 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
623 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
624 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
625 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
626 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
627 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
628 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400629 case SkBlendMode::kSrc:
Brian Salomon31853842017-03-28 16:32:05 -0400630 TEST_ASSERT(!xpi.fIgnoresInputColor);
631 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700632 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
633 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
634 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
635 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
636 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
637 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
638 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400639 case SkBlendMode::kDst:
Brian Salomon31853842017-03-28 16:32:05 -0400640 TEST_ASSERT(xpi.fIgnoresInputColor);
641 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700642 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
643 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
644 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
645 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
646 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
647 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
648 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400649 case SkBlendMode::kSrcOver:
Brian Salomon31853842017-03-28 16:32:05 -0400650 TEST_ASSERT(!xpi.fIgnoresInputColor);
651 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700652 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
653 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
654 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
655 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
656 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
657 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
658 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400659 case SkBlendMode::kDstOver:
Brian Salomon31853842017-03-28 16:32:05 -0400660 TEST_ASSERT(!xpi.fIgnoresInputColor);
661 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700662 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
663 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
664 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
665 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
666 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
667 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
668 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400669 case SkBlendMode::kSrcIn:
Brian Salomon31853842017-03-28 16:32:05 -0400670 TEST_ASSERT(!xpi.fIgnoresInputColor);
671 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700672 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
673 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
674 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
675 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
676 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
677 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
678 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400679 case SkBlendMode::kDstIn:
Brian Salomon31853842017-03-28 16:32:05 -0400680 TEST_ASSERT(xpi.fIgnoresInputColor);
681 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700682 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 Salomon31853842017-03-28 16:32:05 -0400690 TEST_ASSERT(!xpi.fIgnoresInputColor);
691 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700692 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 Salomon31853842017-03-28 16:32:05 -0400700 TEST_ASSERT(xpi.fIgnoresInputColor);
701 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700702 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 Salomon31853842017-03-28 16:32:05 -0400710 TEST_ASSERT(!xpi.fIgnoresInputColor);
711 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700712 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 Salomon31853842017-03-28 16:32:05 -0400720 TEST_ASSERT(!xpi.fIgnoresInputColor);
721 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700722 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 Salomon31853842017-03-28 16:32:05 -0400730 TEST_ASSERT(!xpi.fIgnoresInputColor);
731 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700732 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 Salomon31853842017-03-28 16:32:05 -0400740 TEST_ASSERT(!xpi.fIgnoresInputColor);
741 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700742 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 Salomon31853842017-03-28 16:32:05 -0400750 TEST_ASSERT(!xpi.fIgnoresInputColor);
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 Salomon31853842017-03-28 16:32:05 -0400759 TEST_ASSERT(!xpi.fIgnoresInputColor);
760 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700761 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 Salomona811b122017-03-30 08:21:32 -0400776 GrProcessorAnalysisColor inputColor = GrProcessorAnalysisColor::Opaque::kYes;
777 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kNone;
cdalton6fd158e2015-05-27 15:08:33 -0700778
Mike Reed7d954ad2016-10-28 15:42:34 -0400779 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
780 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon31853842017-03-28 16:32:05 -0400781 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
cdalton6fd158e2015-05-27 15:08:33 -0700782
783 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400784 case SkBlendMode::kClear:
Brian Salomon31853842017-03-28 16:32:05 -0400785 TEST_ASSERT(xpi.fIgnoresInputColor);
786 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700787 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
788 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
789 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
790 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
791 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
792 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
793 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400794 case SkBlendMode::kSrc:
Brian Salomon31853842017-03-28 16:32:05 -0400795 TEST_ASSERT(!xpi.fIgnoresInputColor);
796 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700797 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
798 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
799 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
800 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
801 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
802 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
803 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400804 case SkBlendMode::kDst:
Brian Salomon31853842017-03-28 16:32:05 -0400805 TEST_ASSERT(xpi.fIgnoresInputColor);
806 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700807 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
808 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
809 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
810 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
811 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
812 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
813 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400814 case SkBlendMode::kSrcOver:
Brian Salomon28207df2017-06-05 12:25:13 -0400815 // We don't specialize opaque src-over. See note in GrPorterDuffXferProcessor.cpp
Brian Salomon31853842017-03-28 16:32:05 -0400816 TEST_ASSERT(!xpi.fIgnoresInputColor);
Brian Salomon28207df2017-06-05 12:25:13 -0400817 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700818 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
819 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
820 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
821 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
Brian Salomon28207df2017-06-05 12:25:13 -0400822 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
cdalton6fd158e2015-05-27 15:08:33 -0700823 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
824 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400825 case SkBlendMode::kDstOver:
Brian Salomon31853842017-03-28 16:32:05 -0400826 TEST_ASSERT(!xpi.fIgnoresInputColor);
827 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700828 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
829 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
830 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
831 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
832 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
833 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
834 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400835 case SkBlendMode::kSrcIn:
Brian Salomon31853842017-03-28 16:32:05 -0400836 TEST_ASSERT(!xpi.fIgnoresInputColor);
837 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700838 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
839 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
840 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
841 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
842 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
843 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
844 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400845 case SkBlendMode::kDstIn:
Brian Salomon31853842017-03-28 16:32:05 -0400846 TEST_ASSERT(xpi.fIgnoresInputColor);
847 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700848 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
849 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
850 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
851 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
852 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
853 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
854 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400855 case SkBlendMode::kSrcOut:
Brian Salomon31853842017-03-28 16:32:05 -0400856 TEST_ASSERT(!xpi.fIgnoresInputColor);
857 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700858 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
859 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
860 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
861 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
862 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
863 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
864 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400865 case SkBlendMode::kDstOut:
Brian Salomon31853842017-03-28 16:32:05 -0400866 TEST_ASSERT(xpi.fIgnoresInputColor);
867 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700868 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
869 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
870 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
871 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
872 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
873 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
874 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400875 case SkBlendMode::kSrcATop:
Brian Salomon31853842017-03-28 16:32:05 -0400876 TEST_ASSERT(!xpi.fIgnoresInputColor);
877 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700878 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
879 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
880 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
881 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
882 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
883 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
884 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400885 case SkBlendMode::kDstATop:
Brian Salomon31853842017-03-28 16:32:05 -0400886 TEST_ASSERT(!xpi.fIgnoresInputColor);
887 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700888 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
889 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
890 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
891 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
892 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
893 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
894 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400895 case SkBlendMode::kXor:
Brian Salomon31853842017-03-28 16:32:05 -0400896 TEST_ASSERT(!xpi.fIgnoresInputColor);
897 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700898 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
899 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
900 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
901 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
902 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
903 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
904 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400905 case SkBlendMode::kPlus:
Brian Salomon31853842017-03-28 16:32:05 -0400906 TEST_ASSERT(!xpi.fIgnoresInputColor);
907 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700908 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
909 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
910 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
911 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
912 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
913 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
914 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400915 case SkBlendMode::kModulate:
Brian Salomon31853842017-03-28 16:32:05 -0400916 TEST_ASSERT(!xpi.fIgnoresInputColor);
917 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700918 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
919 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
920 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
921 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
922 TEST_ASSERT(kSC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
923 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
924 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400925 case SkBlendMode::kScreen:
Brian Salomon31853842017-03-28 16:32:05 -0400926 TEST_ASSERT(!xpi.fIgnoresInputColor);
927 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700928 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
929 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
930 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
931 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
932 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
933 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
934 break;
935 default:
936 ERRORF(reporter, "Invalid xfermode.");
937 break;
938 }
939 }
940}
941
egdaniel723b0502015-09-15 09:31:40 -0700942static void test_lcd_coverage_fallback_case(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomon31853842017-03-28 16:32:05 -0400943 const GrXPFactory* xpf = GrPorterDuffXPFactory::Get(SkBlendMode::kSrcOver);
Brian Osmancf860852018-10-31 14:04:39 -0400944 GrProcessorAnalysisColor color = SkPMColor4f::FromBytes_RGBA(GrColorPackRGBA(123, 45, 67, 255));
Brian Salomona811b122017-03-30 08:21:32 -0400945 GrProcessorAnalysisCoverage coverage = GrProcessorAnalysisCoverage::kLCD;
Brian Osman532b3f92018-07-11 10:02:07 -0400946 TEST_ASSERT(!(GrXPFactory::GetAnalysisProperties(xpf, color, coverage, caps) &
Greg Daniel6ebe4b92017-05-19 10:56:46 -0400947 GrXPFactory::AnalysisProperties::kRequiresDstTexture));
948 sk_sp<const GrXferProcessor> xp_opaque(
Brian Osman532b3f92018-07-11 10:02:07 -0400949 GrXPFactory::MakeXferProcessor(xpf, color, coverage, false, caps));
Greg Daniel6ebe4b92017-05-19 10:56:46 -0400950 if (!xp_opaque) {
951 ERRORF(reporter, "Failed to create an XP with LCD coverage.");
952 return;
953 }
954
955 GrXferProcessor::BlendInfo blendInfo;
956 xp_opaque->getBlendInfo(&blendInfo);
957 TEST_ASSERT(blendInfo.fWriteColor);
958
959 // Test with non-opaque alpha
Brian Osmancf860852018-10-31 14:04:39 -0400960 color = SkPMColor4f::FromBytes_RGBA(GrColorPackRGBA(123, 45, 67, 221));
Greg Daniel6ebe4b92017-05-19 10:56:46 -0400961 coverage = GrProcessorAnalysisCoverage::kLCD;
Brian Osman532b3f92018-07-11 10:02:07 -0400962 TEST_ASSERT(!(GrXPFactory::GetAnalysisProperties(xpf, color, coverage, caps) &
Greg Danield7b11592017-06-14 13:37:12 -0400963 GrXPFactory::AnalysisProperties::kRequiresDstTexture));
Brian Salomond61c9d92017-04-10 10:54:25 -0400964 sk_sp<const GrXferProcessor> xp(
Brian Osman532b3f92018-07-11 10:02:07 -0400965 GrXPFactory::MakeXferProcessor(xpf, color, coverage, false, caps));
cdalton6fd158e2015-05-27 15:08:33 -0700966 if (!xp) {
967 ERRORF(reporter, "Failed to create an XP with LCD coverage.");
968 return;
969 }
970
cdalton6fd158e2015-05-27 15:08:33 -0700971 xp->getBlendInfo(&blendInfo);
972 TEST_ASSERT(blendInfo.fWriteColor);
973}
974
Brian Salomondcfca432017-11-15 15:48:03 -0500975DEF_GPUTEST(PorterDuffNoDualSourceBlending, reporter, options) {
976 GrContextOptions opts = options;
cdalton6fd158e2015-05-27 15:08:33 -0700977 opts.fSuppressDualSourceBlending = true;
bsalomon3724e572016-03-30 18:56:19 -0700978 sk_gpu_test::GrContextFactory mockFactory(opts);
bsalomon85b4b532016-04-05 11:06:27 -0700979 GrContext* ctx = mockFactory.get(sk_gpu_test::GrContextFactory::kNullGL_ContextType);
cdalton6fd158e2015-05-27 15:08:33 -0700980 if (!ctx) {
Ben Wagnerb4aab9a2017-08-16 10:53:04 -0400981 SK_ABORT("Failed to create null context without ARB_blend_func_extended.");
cdalton6fd158e2015-05-27 15:08:33 -0700982 return;
983 }
984
Robert Phillipsf35fd8d2018-01-22 10:48:15 -0500985 GrGpu* gpu = ctx->contextPriv().getGpu();
Robert Phillips0bd24dc2018-01-16 08:06:32 -0500986 GrProxyProvider* proxyProvider = ctx->contextPriv().proxyProvider();
Brian Salomonc7fe0f72018-05-11 10:14:21 -0400987 const GrCaps& caps = *ctx->contextPriv().caps();
cdalton6fd158e2015-05-27 15:08:33 -0700988 if (caps.shaderCaps()->dualSourceBlendingSupport()) {
Ben Wagnerb4aab9a2017-08-16 10:53:04 -0400989 SK_ABORT("Null context failed to honor request for no ARB_blend_func_extended.");
cdalton6fd158e2015-05-27 15:08:33 -0700990 return;
991 }
992
Robert Phillipsd21b2a52017-12-12 13:01:25 -0500993 GrBackendTexture backendTex =
Robert Phillips646f6372018-09-25 09:31:10 -0400994 gpu->createTestingOnlyBackendTexture(nullptr, 100, 100, GrColorType::kRGBA_8888,
Robert Phillipsf35fd8d2018-01-22 10:48:15 -0500995 false, GrMipMapped::kNo);
Greg Daniel7ef28f32017-04-20 16:41:55 +0000996
Robert Phillipsbb581ce2017-05-29 15:05:15 -0400997 GrXferProcessor::DstProxy fakeDstProxy;
998 {
Brian Salomonc67c31c2018-12-06 10:00:03 -0500999 sk_sp<GrTextureProxy> proxy = proxyProvider->wrapBackendTexture(
1000 backendTex, kTopLeft_GrSurfaceOrigin, kBorrow_GrWrapOwnership, kRead_GrIOType);
Robert Phillipsbb581ce2017-05-29 15:05:15 -04001001 fakeDstProxy.setProxy(std::move(proxy));
1002 }
cdalton6fd158e2015-05-27 15:08:33 -07001003
Brian Salomona811b122017-03-30 08:21:32 -04001004 static const GrProcessorAnalysisColor colorInputs[] = {
1005 GrProcessorAnalysisColor::Opaque::kNo, GrProcessorAnalysisColor::Opaque::kYes,
Brian Osmancf860852018-10-31 14:04:39 -04001006 GrProcessorAnalysisColor(SkPMColor4f::FromBytes_RGBA(GrColorPackRGBA(0, 82, 17, 100))),
1007 GrProcessorAnalysisColor(SkPMColor4f::FromBytes_RGBA(GrColorPackRGBA(0, 82, 17, 255)))};
cdalton6fd158e2015-05-27 15:08:33 -07001008
Brian Salomonc6b71462017-02-14 11:33:01 -05001009 for (const auto& colorInput : colorInputs) {
Brian Salomona811b122017-03-30 08:21:32 -04001010 for (GrProcessorAnalysisCoverage coverageType :
1011 {GrProcessorAnalysisCoverage::kSingleChannel, GrProcessorAnalysisCoverage::kNone}) {
Mike Reed7d954ad2016-10-28 15:42:34 -04001012 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
1013 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomona1633922017-01-09 11:46:10 -05001014 const GrXPFactory* xpf = GrPorterDuffXPFactory::Get(xfermode);
Brian Salomond61c9d92017-04-10 10:54:25 -04001015 sk_sp<const GrXferProcessor> xp(
Brian Osman532b3f92018-07-11 10:02:07 -04001016 GrXPFactory::MakeXferProcessor(xpf, colorInput, coverageType, false, caps));
cdalton6fd158e2015-05-27 15:08:33 -07001017 if (!xp) {
1018 ERRORF(reporter, "Failed to create an XP without dual source blending.");
1019 return;
1020 }
1021 TEST_ASSERT(!xp->hasSecondaryOutput());
cdalton6fd158e2015-05-27 15:08:33 -07001022 }
1023 }
1024 }
Brian Salomon26102cb2018-03-09 09:33:19 -05001025 gpu->deleteTestingOnlyBackendTexture(backendTex);
cdalton6fd158e2015-05-27 15:08:33 -07001026}