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