1 /*
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
8 #include "tests/Test.h"
9
10 #include "include/gpu/GrBackendSurface.h"
11 #include "include/gpu/GrContextOptions.h"
12 #include "src/gpu/GrContextPriv.h"
13 #include "src/gpu/GrGpu.h"
14 #include "src/gpu/GrProxyProvider.h"
15 #include "src/gpu/GrXferProcessor.h"
16 #include "src/gpu/effects/GrPorterDuffXferProcessor.h"
17 #include "src/gpu/gl/GrGLCaps.h"
18 #include "src/gpu/ops/GrMeshDrawOp.h"
19 #include "tools/gpu/GrContextFactory.h"
20
21 ////////////////////////////////////////////////////////////////////////////////
22
23 static void test_color_unknown_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps);
24 static void test_color_not_opaque_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps);
25 static void test_color_opaque_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps);
26 static void test_color_opaque_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps);
27 static void test_lcd_coverage(skiatest::Reporter* reporter, const GrCaps& caps);
28 static void test_lcd_coverage_fallback_case(skiatest::Reporter* reporter, const GrCaps& caps);
29
30 DEF_GPUTEST(GrPorterDuff, reporter, /*ctxInfo*/) {
31 GrMockOptions mockOptions;
32 mockOptions.fDualSourceBlendingSupport = true;
33 auto context = GrContext::MakeMock(&mockOptions, GrContextOptions());
34 const GrCaps& caps = *context->priv().getGpu()->caps();
35
36 if (!caps.shaderCaps()->dualSourceBlendingSupport()) {
37 SK_ABORT("Null context does not support dual source blending.");
38 }
39
40 test_color_unknown_with_coverage(reporter, caps);
41 test_color_not_opaque_no_coverage(reporter, caps);
42 test_color_opaque_with_coverage(reporter, caps);
43 test_color_opaque_no_coverage(reporter, caps);
44 test_lcd_coverage(reporter, caps);
45 test_lcd_coverage_fallback_case(reporter, caps);
46 }
47
48 ////////////////////////////////////////////////////////////////////////////////
49
50 #define TEST_ASSERT(...) REPORTER_ASSERT(reporter, __VA_ARGS__)
51
52 enum {
53 kNone_OutputType,
54 kCoverage_OutputType,
55 kModulate_OutputType,
56 kSAModulate_OutputType,
57 kISAModulate_OutputType,
58 kISCModulate_OutputType
59 };
60 static const int kInvalid_OutputType = -1;
61
do_analysis(const GrXPFactory * xpf,const GrProcessorAnalysisColor & colorInput,GrProcessorAnalysisCoverage coverageInput,const GrCaps & caps)62 static GrProcessorSet::Analysis do_analysis(const GrXPFactory* xpf,
63 const GrProcessorAnalysisColor& colorInput,
64 GrProcessorAnalysisCoverage coverageInput,
65 const GrCaps& caps) {
66 GrPaint paint;
67 paint.setXPFactory(xpf);
68 GrProcessorSet procs(std::move(paint));
69 bool hasMixedSampledCoverage = false;
70 SkPMColor4f overrideColor;
71 GrProcessorSet::Analysis analysis = procs.finalize(
72 colorInput, coverageInput, nullptr, &GrUserStencilSettings::kUnused,
73 hasMixedSampledCoverage, caps, GrClampType::kAuto, &overrideColor);
74 return analysis;
75 }
76
77 class GrPorterDuffTest {
78 public:
79 struct XPInfo {
XPInfoGrPorterDuffTest::XPInfo80 XPInfo(skiatest::Reporter* reporter, SkBlendMode xfermode, const GrCaps& caps,
81 GrProcessorAnalysisColor inputColor, GrProcessorAnalysisCoverage inputCoverage) {
82 const GrXPFactory* xpf = GrPorterDuffXPFactory::Get(xfermode);
83
84 bool isLCD = GrProcessorAnalysisCoverage::kLCD == inputCoverage;
85
86 GrProcessorSet::Analysis analysis = do_analysis(xpf, inputColor, inputCoverage, caps);
87 fCompatibleWithCoverageAsAlpha = analysis.isCompatibleWithCoverageAsAlpha();
88 fIgnoresInputColor = analysis.inputColorIsIgnored();
89 sk_sp<const GrXferProcessor> xp(
90 GrXPFactory::MakeXferProcessor(xpf, inputColor, inputCoverage, false, caps,
91 GrClampType::kAuto));
92 TEST_ASSERT(!analysis.requiresDstTexture() ||
93 (isLCD &&
94 !caps.shaderCaps()->dstReadInShaderSupport() &&
95 (SkBlendMode::kSrcOver != xfermode ||
96 !inputColor.isOpaque())));
97 // Porter Duff modes currently only use fixed-function or shader blending, and Ganesh
98 // doesn't yet make use of framebuffer fetches that require a barrier
99 // (e.g., QCOM_shader_framebuffer_fetch_noncoherent). So dst textures and xfer barriers
100 // should always go hand in hand for Porter Duff modes.
101 TEST_ASSERT(analysis.requiresDstTexture() == analysis.requiresNonOverlappingDraws());
102 GetXPOutputTypes(xp.get(), &fPrimaryOutputType, &fSecondaryOutputType);
103 fBlendInfo = xp->getBlendInfo();
104 TEST_ASSERT(!xp->willReadDstColor() ||
105 (isLCD && (SkBlendMode::kSrcOver != xfermode ||
106 !inputColor.isOpaque())));
107 TEST_ASSERT(xp->hasSecondaryOutput() == GrBlendCoeffRefsSrc2(fBlendInfo.fDstBlend));
108 }
109
110 bool fCompatibleWithCoverageAsAlpha;
111 bool fIgnoresInputColor;
112 int fPrimaryOutputType;
113 int fSecondaryOutputType;
114 GrXferProcessor::BlendInfo fBlendInfo;
115 };
116
GetXPOutputTypes(const GrXferProcessor * xp,int * outPrimary,int * outSecondary)117 static void GetXPOutputTypes(const GrXferProcessor* xp, int* outPrimary, int* outSecondary) {
118 GrPorterDuffXPFactory::TestGetXPOutputTypes(xp, outPrimary, outSecondary);
119 }
120 };
121
test_lcd_coverage(skiatest::Reporter * reporter,const GrCaps & caps)122 static void test_lcd_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
123 GrProcessorAnalysisColor inputColor = GrProcessorAnalysisColor::Opaque::kYes;
124 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kLCD;
125
126 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
127 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
128 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
129 switch (xfermode) {
130 case SkBlendMode::kClear:
131 TEST_ASSERT(xpi.fIgnoresInputColor);
132 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
133 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
134 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
135 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
136 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
137 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
138 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
139 break;
140 case SkBlendMode::kSrc:
141 TEST_ASSERT(!xpi.fIgnoresInputColor);
142 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
143 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
144 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
145 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
146 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
147 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
148 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
149 break;
150 case SkBlendMode::kDst:
151 TEST_ASSERT(xpi.fIgnoresInputColor);
152 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
153 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
154 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
155 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
156 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
157 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
158 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
159 break;
160 case SkBlendMode::kSrcOver:
161 TEST_ASSERT(!xpi.fIgnoresInputColor);
162 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
163 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
164 TEST_ASSERT(kSAModulate_OutputType == xpi.fSecondaryOutputType);
165 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
166 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
167 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
168 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
169 break;
170 case SkBlendMode::kDstOver:
171 TEST_ASSERT(!xpi.fIgnoresInputColor);
172 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
173 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
174 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
175 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
176 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
177 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
178 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
179 break;
180 case SkBlendMode::kSrcIn:
181 TEST_ASSERT(!xpi.fIgnoresInputColor);
182 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
183 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
184 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
185 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
186 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
187 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
188 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
189 break;
190 case SkBlendMode::kDstIn:
191 TEST_ASSERT(!xpi.fIgnoresInputColor);
192 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
193 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
194 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
195 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
196 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
197 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
198 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
199 break;
200 case SkBlendMode::kSrcOut:
201 TEST_ASSERT(!xpi.fIgnoresInputColor);
202 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
203 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
204 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
205 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
206 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
207 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
208 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
209 break;
210 case SkBlendMode::kDstOut:
211 TEST_ASSERT(!xpi.fIgnoresInputColor);
212 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
213 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
214 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
215 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
216 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
217 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
218 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
219 break;
220 case SkBlendMode::kSrcATop:
221 TEST_ASSERT(!xpi.fIgnoresInputColor);
222 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
223 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
224 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
225 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
226 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
227 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
228 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
229 break;
230 case SkBlendMode::kDstATop:
231 TEST_ASSERT(!xpi.fIgnoresInputColor);
232 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
233 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
234 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
235 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
236 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
237 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
238 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
239 break;
240 case SkBlendMode::kXor:
241 TEST_ASSERT(!xpi.fIgnoresInputColor);
242 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
243 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
244 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
245 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
246 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
247 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
248 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
249 break;
250 case SkBlendMode::kPlus:
251 TEST_ASSERT(!xpi.fIgnoresInputColor);
252 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
253 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
254 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
255 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
256 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
257 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
258 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
259 break;
260 case SkBlendMode::kModulate:
261 TEST_ASSERT(!xpi.fIgnoresInputColor);
262 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
263 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
264 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
265 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
266 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
267 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
268 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
269 break;
270 case SkBlendMode::kScreen:
271 TEST_ASSERT(!xpi.fIgnoresInputColor);
272 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
273 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
274 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
275 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
276 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
277 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
278 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
279 break;
280 default:
281 ERRORF(reporter, "Invalid xfermode.");
282 break;
283 }
284 }
285 }
test_color_unknown_with_coverage(skiatest::Reporter * reporter,const GrCaps & caps)286 static void test_color_unknown_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
287 GrProcessorAnalysisColor inputColor = GrProcessorAnalysisColor::Opaque::kNo;
288 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kSingleChannel;
289
290 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
291 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
292 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
293 switch (xfermode) {
294 case SkBlendMode::kClear:
295 TEST_ASSERT(xpi.fIgnoresInputColor);
296 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
297 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
298 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
299 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
300 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
301 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
302 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
303 break;
304 case SkBlendMode::kSrc:
305 TEST_ASSERT(!xpi.fIgnoresInputColor);
306 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
307 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
308 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
309 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
310 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
311 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
312 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
313 break;
314 case SkBlendMode::kDst:
315 TEST_ASSERT(xpi.fIgnoresInputColor);
316 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
317 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
318 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
319 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
320 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
321 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
322 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
323 break;
324 case SkBlendMode::kSrcOver:
325 TEST_ASSERT(!xpi.fIgnoresInputColor);
326 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
327 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
328 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
329 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
330 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
331 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
332 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
333 break;
334 case SkBlendMode::kDstOver:
335 TEST_ASSERT(!xpi.fIgnoresInputColor);
336 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
337 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
338 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
339 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
340 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
341 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
342 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
343 break;
344 case SkBlendMode::kSrcIn:
345 TEST_ASSERT(!xpi.fIgnoresInputColor);
346 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
347 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
348 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
349 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
350 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
351 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
352 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
353 break;
354 case SkBlendMode::kDstIn:
355 TEST_ASSERT(!xpi.fIgnoresInputColor);
356 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
357 TEST_ASSERT(kISAModulate_OutputType == xpi.fPrimaryOutputType);
358 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
359 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
360 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
361 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
362 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
363 break;
364 case SkBlendMode::kSrcOut:
365 TEST_ASSERT(!xpi.fIgnoresInputColor);
366 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
367 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
368 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
369 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
370 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
371 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
372 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
373 break;
374 case SkBlendMode::kDstOut:
375 TEST_ASSERT(!xpi.fIgnoresInputColor);
376 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
377 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
378 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
379 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
380 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
381 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
382 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
383 break;
384 case SkBlendMode::kSrcATop:
385 TEST_ASSERT(!xpi.fIgnoresInputColor);
386 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
387 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
388 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
389 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
390 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
391 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
392 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
393 break;
394 case SkBlendMode::kDstATop:
395 TEST_ASSERT(!xpi.fIgnoresInputColor);
396 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
397 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
398 TEST_ASSERT(kISAModulate_OutputType == xpi.fSecondaryOutputType);
399 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
400 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
401 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
402 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
403 break;
404 case SkBlendMode::kXor:
405 TEST_ASSERT(!xpi.fIgnoresInputColor);
406 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
407 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
408 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
409 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
410 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
411 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
412 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
413 break;
414 case SkBlendMode::kPlus:
415 TEST_ASSERT(!xpi.fIgnoresInputColor);
416 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
417 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
418 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
419 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
420 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
421 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
422 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
423 break;
424 case SkBlendMode::kModulate:
425 TEST_ASSERT(!xpi.fIgnoresInputColor);
426 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
427 TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType);
428 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
429 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
430 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
431 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
432 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
433 break;
434 case SkBlendMode::kScreen:
435 TEST_ASSERT(!xpi.fIgnoresInputColor);
436 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
437 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
438 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
439 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
440 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
441 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
442 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
443 break;
444 default:
445 ERRORF(reporter, "Invalid xfermode.");
446 break;
447 }
448 }
449 }
450
test_color_not_opaque_no_coverage(skiatest::Reporter * reporter,const GrCaps & caps)451 static void test_color_not_opaque_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
452 GrProcessorAnalysisColor inputColor(
453 SkPMColor4f::FromBytes_RGBA(GrColorPackRGBA(229, 0, 154, 240)));
454 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kNone;
455
456 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
457 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
458 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
459 switch (xfermode) {
460 case SkBlendMode::kClear:
461 TEST_ASSERT(xpi.fIgnoresInputColor);
462 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
463 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
464 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
465 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
466 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
467 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
468 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
469 break;
470 case SkBlendMode::kSrc:
471 TEST_ASSERT(!xpi.fIgnoresInputColor);
472 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
473 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
474 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
475 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
476 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
477 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
478 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
479 break;
480 case SkBlendMode::kDst:
481 TEST_ASSERT(xpi.fIgnoresInputColor);
482 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
483 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
484 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
485 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
486 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
487 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
488 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
489 break;
490 case SkBlendMode::kSrcOver:
491 TEST_ASSERT(!xpi.fIgnoresInputColor);
492 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
493 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
494 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
495 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
496 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
497 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
498 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
499 break;
500 case SkBlendMode::kDstOver:
501 TEST_ASSERT(!xpi.fIgnoresInputColor);
502 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
503 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
504 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
505 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
506 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
507 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
508 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
509 break;
510 case SkBlendMode::kSrcIn:
511 TEST_ASSERT(!xpi.fIgnoresInputColor);
512 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
513 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
514 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
515 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
516 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
517 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
518 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
519 break;
520 case SkBlendMode::kDstIn:
521 TEST_ASSERT(!xpi.fIgnoresInputColor);
522 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
523 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
524 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
525 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
526 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
527 TEST_ASSERT(kSA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
528 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
529 break;
530 case SkBlendMode::kSrcOut:
531 TEST_ASSERT(!xpi.fIgnoresInputColor);
532 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
533 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
534 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
535 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
536 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
537 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
538 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
539 break;
540 case SkBlendMode::kDstOut:
541 TEST_ASSERT(!xpi.fIgnoresInputColor);
542 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
543 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
544 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
545 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
546 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
547 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
548 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
549 break;
550 case SkBlendMode::kSrcATop:
551 TEST_ASSERT(!xpi.fIgnoresInputColor);
552 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
553 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
554 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
555 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
556 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
557 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
558 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
559 break;
560 case SkBlendMode::kDstATop:
561 TEST_ASSERT(!xpi.fIgnoresInputColor);
562 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
563 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
564 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
565 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
566 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
567 TEST_ASSERT(kSA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
568 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
569 break;
570 case SkBlendMode::kXor:
571 TEST_ASSERT(!xpi.fIgnoresInputColor);
572 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
573 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
574 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
575 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
576 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
577 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
578 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
579 break;
580 case SkBlendMode::kPlus:
581 TEST_ASSERT(!xpi.fIgnoresInputColor);
582 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
583 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
584 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
585 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
586 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
587 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
588 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
589 break;
590 case SkBlendMode::kModulate:
591 TEST_ASSERT(!xpi.fIgnoresInputColor);
592 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
593 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
594 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
595 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
596 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
597 TEST_ASSERT(kSC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
598 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
599 break;
600 case SkBlendMode::kScreen:
601 TEST_ASSERT(!xpi.fIgnoresInputColor);
602 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
603 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
604 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
605 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
606 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
607 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
608 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
609 break;
610 default:
611 ERRORF(reporter, "Invalid xfermode.");
612 break;
613 }
614 }
615 }
616
test_color_opaque_with_coverage(skiatest::Reporter * reporter,const GrCaps & caps)617 static void test_color_opaque_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
618 GrProcessorAnalysisColor inputColor = GrProcessorAnalysisColor::Opaque::kYes;
619 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kSingleChannel;
620
621 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
622 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
623 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
624 switch (xfermode) {
625 case SkBlendMode::kClear:
626 TEST_ASSERT(xpi.fIgnoresInputColor);
627 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
628 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
629 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
630 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
631 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
632 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
633 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
634 break;
635 case SkBlendMode::kSrc:
636 TEST_ASSERT(!xpi.fIgnoresInputColor);
637 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
638 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
639 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
640 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
641 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
642 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
643 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
644 break;
645 case SkBlendMode::kDst:
646 TEST_ASSERT(xpi.fIgnoresInputColor);
647 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
648 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
649 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
650 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
651 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
652 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
653 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
654 break;
655 case SkBlendMode::kSrcOver:
656 TEST_ASSERT(!xpi.fIgnoresInputColor);
657 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
658 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
659 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
660 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
661 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
662 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
663 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
664 break;
665 case SkBlendMode::kDstOver:
666 TEST_ASSERT(!xpi.fIgnoresInputColor);
667 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
668 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
669 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
670 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
671 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
672 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
673 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
674 break;
675 case SkBlendMode::kSrcIn:
676 TEST_ASSERT(!xpi.fIgnoresInputColor);
677 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
678 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
679 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
680 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
681 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
682 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
683 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
684 break;
685 case SkBlendMode::kDstIn:
686 TEST_ASSERT(xpi.fIgnoresInputColor);
687 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
688 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
689 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
690 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
691 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
692 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
693 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
694 break;
695 case SkBlendMode::kSrcOut:
696 TEST_ASSERT(!xpi.fIgnoresInputColor);
697 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
698 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
699 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
700 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
701 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
702 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
703 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
704 break;
705 case SkBlendMode::kDstOut:
706 TEST_ASSERT(xpi.fIgnoresInputColor);
707 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
708 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
709 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
710 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
711 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
712 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
713 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
714 break;
715 case SkBlendMode::kSrcATop:
716 TEST_ASSERT(!xpi.fIgnoresInputColor);
717 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
718 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
719 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
720 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
721 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
722 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
723 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
724 break;
725 case SkBlendMode::kDstATop:
726 TEST_ASSERT(!xpi.fIgnoresInputColor);
727 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
728 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
729 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
730 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
731 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
732 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
733 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
734 break;
735 case SkBlendMode::kXor:
736 TEST_ASSERT(!xpi.fIgnoresInputColor);
737 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
738 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
739 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
740 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
741 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
742 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
743 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
744 break;
745 case SkBlendMode::kPlus:
746 TEST_ASSERT(!xpi.fIgnoresInputColor);
747 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
748 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
749 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
750 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
751 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
752 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
753 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
754 break;
755 case SkBlendMode::kModulate:
756 TEST_ASSERT(!xpi.fIgnoresInputColor);
757 TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType);
758 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
759 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
760 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
761 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
762 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
763 break;
764 case SkBlendMode::kScreen:
765 TEST_ASSERT(!xpi.fIgnoresInputColor);
766 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
767 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
768 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
769 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
770 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
771 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
772 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
773 break;
774 default:
775 ERRORF(reporter, "Invalid xfermode.");
776 break;
777 }
778 }
779 }
780
test_color_opaque_no_coverage(skiatest::Reporter * reporter,const GrCaps & caps)781 static void test_color_opaque_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
782 GrProcessorAnalysisColor inputColor = GrProcessorAnalysisColor::Opaque::kYes;
783 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kNone;
784
785 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
786 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
787 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
788
789 switch (xfermode) {
790 case SkBlendMode::kClear:
791 TEST_ASSERT(xpi.fIgnoresInputColor);
792 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
793 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
794 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
795 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
796 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
797 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
798 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
799 break;
800 case SkBlendMode::kSrc:
801 TEST_ASSERT(!xpi.fIgnoresInputColor);
802 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
803 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
804 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
805 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
806 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
807 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
808 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
809 break;
810 case SkBlendMode::kDst:
811 TEST_ASSERT(xpi.fIgnoresInputColor);
812 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
813 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
814 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
815 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
816 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
817 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
818 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
819 break;
820 case SkBlendMode::kSrcOver:
821 // We don't specialize opaque src-over. See note in GrPorterDuffXferProcessor.cpp
822 TEST_ASSERT(!xpi.fIgnoresInputColor);
823 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
824 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
825 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
826 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
827 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
828 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
829 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
830 break;
831 case SkBlendMode::kDstOver:
832 TEST_ASSERT(!xpi.fIgnoresInputColor);
833 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
834 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
835 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
836 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
837 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
838 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
839 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
840 break;
841 case SkBlendMode::kSrcIn:
842 TEST_ASSERT(!xpi.fIgnoresInputColor);
843 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
844 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
845 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
846 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
847 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
848 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
849 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
850 break;
851 case SkBlendMode::kDstIn:
852 TEST_ASSERT(xpi.fIgnoresInputColor);
853 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
854 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
855 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
856 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
857 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
858 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
859 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
860 break;
861 case SkBlendMode::kSrcOut:
862 TEST_ASSERT(!xpi.fIgnoresInputColor);
863 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
864 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
865 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
866 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
867 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
868 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
869 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
870 break;
871 case SkBlendMode::kDstOut:
872 TEST_ASSERT(xpi.fIgnoresInputColor);
873 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
874 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
875 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
876 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
877 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
878 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
879 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
880 break;
881 case SkBlendMode::kSrcATop:
882 TEST_ASSERT(!xpi.fIgnoresInputColor);
883 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
884 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
885 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
886 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
887 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
888 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
889 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
890 break;
891 case SkBlendMode::kDstATop:
892 TEST_ASSERT(!xpi.fIgnoresInputColor);
893 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
894 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
895 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
896 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
897 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
898 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
899 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
900 break;
901 case SkBlendMode::kXor:
902 TEST_ASSERT(!xpi.fIgnoresInputColor);
903 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
904 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
905 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
906 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
907 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
908 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
909 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
910 break;
911 case SkBlendMode::kPlus:
912 TEST_ASSERT(!xpi.fIgnoresInputColor);
913 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
914 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
915 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
916 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
917 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
918 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
919 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
920 break;
921 case SkBlendMode::kModulate:
922 TEST_ASSERT(!xpi.fIgnoresInputColor);
923 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
924 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
925 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
926 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
927 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
928 TEST_ASSERT(kSC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
929 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
930 break;
931 case SkBlendMode::kScreen:
932 TEST_ASSERT(!xpi.fIgnoresInputColor);
933 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
934 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
935 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
936 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
937 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
938 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
939 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
940 break;
941 default:
942 ERRORF(reporter, "Invalid xfermode.");
943 break;
944 }
945 }
946 }
947
test_lcd_coverage_fallback_case(skiatest::Reporter * reporter,const GrCaps & caps)948 static void test_lcd_coverage_fallback_case(skiatest::Reporter* reporter, const GrCaps& caps) {
949 constexpr GrClampType autoClamp = GrClampType::kAuto;
950 const GrXPFactory* xpf = GrPorterDuffXPFactory::Get(SkBlendMode::kSrcOver);
951 GrProcessorAnalysisColor color = SkPMColor4f::FromBytes_RGBA(GrColorPackRGBA(123, 45, 67, 255));
952 GrProcessorAnalysisCoverage coverage = GrProcessorAnalysisCoverage::kLCD;
953 TEST_ASSERT(!(GrXPFactory::GetAnalysisProperties(xpf, color, coverage, caps, autoClamp) &
954 GrXPFactory::AnalysisProperties::kRequiresDstTexture));
955 sk_sp<const GrXferProcessor> xp_opaque(
956 GrXPFactory::MakeXferProcessor(xpf, color, coverage, false, caps, autoClamp));
957 if (!xp_opaque) {
958 ERRORF(reporter, "Failed to create an XP with LCD coverage.");
959 return;
960 }
961
962 GrXferProcessor::BlendInfo blendInfo = xp_opaque->getBlendInfo();
963 TEST_ASSERT(blendInfo.fWriteColor);
964
965 // Test with non-opaque alpha
966 color = SkPMColor4f::FromBytes_RGBA(GrColorPackRGBA(123, 45, 67, 221));
967 coverage = GrProcessorAnalysisCoverage::kLCD;
968 TEST_ASSERT(!(GrXPFactory::GetAnalysisProperties(xpf, color, coverage, caps, autoClamp) &
969 GrXPFactory::AnalysisProperties::kRequiresDstTexture));
970 sk_sp<const GrXferProcessor> xp(
971 GrXPFactory::MakeXferProcessor(xpf, color, coverage, false, caps, autoClamp));
972 if (!xp) {
973 ERRORF(reporter, "Failed to create an XP with LCD coverage.");
974 return;
975 }
976
977 blendInfo = xp->getBlendInfo();
978 TEST_ASSERT(blendInfo.fWriteColor);
979 }
980
DEF_GPUTEST(PorterDuffNoDualSourceBlending,reporter,options)981 DEF_GPUTEST(PorterDuffNoDualSourceBlending, reporter, options) {
982 GrContextOptions opts = options;
983 opts.fSuppressDualSourceBlending = true;
984 sk_gpu_test::GrContextFactory mockFactory(opts);
985 GrContext* ctx = mockFactory.get(sk_gpu_test::GrContextFactory::kMock_ContextType);
986 if (!ctx) {
987 SK_ABORT("Failed to create mock context without ARB_blend_func_extended.");
988 }
989
990 GrProxyProvider* proxyProvider = ctx->priv().proxyProvider();
991 const GrCaps& caps = *ctx->priv().caps();
992 if (caps.shaderCaps()->dualSourceBlendingSupport()) {
993 SK_ABORT("Mock context failed to honor request for no ARB_blend_func_extended.");
994 }
995
996 GrBackendTexture backendTex =
997 ctx->createBackendTexture(100, 100, kRGBA_8888_SkColorType, SkColors::kTransparent,
998 GrMipMapped::kNo, GrRenderable::kNo, GrProtected::kNo);
999
1000 GrXferProcessor::DstProxy fakeDstProxy;
1001 {
1002 sk_sp<GrTextureProxy> proxy = proxyProvider->wrapBackendTexture(
1003 backendTex, GrColorType::kRGBA_8888, kTopLeft_GrSurfaceOrigin,
1004 kBorrow_GrWrapOwnership, GrWrapCacheable::kNo, kRead_GrIOType);
1005 fakeDstProxy.setProxy(std::move(proxy));
1006 }
1007
1008 static const GrProcessorAnalysisColor colorInputs[] = {
1009 GrProcessorAnalysisColor::Opaque::kNo, GrProcessorAnalysisColor::Opaque::kYes,
1010 GrProcessorAnalysisColor(SkPMColor4f::FromBytes_RGBA(GrColorPackRGBA(0, 82, 17, 100))),
1011 GrProcessorAnalysisColor(SkPMColor4f::FromBytes_RGBA(GrColorPackRGBA(0, 82, 17, 255)))};
1012
1013 for (const auto& colorInput : colorInputs) {
1014 for (GrProcessorAnalysisCoverage coverageType :
1015 {GrProcessorAnalysisCoverage::kSingleChannel, GrProcessorAnalysisCoverage::kNone}) {
1016 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
1017 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
1018 const GrXPFactory* xpf = GrPorterDuffXPFactory::Get(xfermode);
1019 sk_sp<const GrXferProcessor> xp(
1020 GrXPFactory::MakeXferProcessor(xpf, colorInput, coverageType, false, caps,
1021 GrClampType::kAuto));
1022 if (!xp) {
1023 ERRORF(reporter, "Failed to create an XP without dual source blending.");
1024 return;
1025 }
1026 TEST_ASSERT(!xp->hasSecondaryOutput());
1027 }
1028 }
1029 }
1030 ctx->deleteBackendTexture(backendTex);
1031 }
1032