Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(709)

Side by Side Diff: tests/GrPorterDuffTest.cpp

Issue 1124373002: Implement Porter Duff XP with a blend table (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: separate XP for dst read fallback Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
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 "SkXfermode.h"
9 #include "Test.h"
10
11 #if SK_SUPPORT_GPU
12
13 #include "GrBatch.h"
14 #include "GrContextFactory.h"
15 #include "GrGpu.h"
16 #include "GrXferProcessor.h"
17 #include "effects/GrPorterDuffXferProcessor.h"
18 #include "gl/GrGLCaps.h"
19
20 ////////////////////////////////////////////////////////////////////////////////
21
22 static void test_alpha_unknown_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps);
23 static void test_alpha_unknown_no_coverage(skiatest::Reporter* reporter, const G rCaps& caps);
24 static void test_alpha_opaque_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps);
25 static void test_alpha_opaque_no_coverage(skiatest::Reporter* reporter, const Gr Caps& caps);
26 static void test_color_white_with_coverage(skiatest::Reporter* reporter, const G rCaps& caps);
27 static void test_color_white_no_coverage(skiatest::Reporter* reporter, const GrC aps& caps);
28 static void test_no_dual_source_blending(skiatest::Reporter* reporter, GrGpu* gp u);
29 static void test_lcd_coverage(skiatest::Reporter* reporter, const GrCaps& caps);
30
31 DEF_GPUTEST(GrPorterDuff, reporter, factory) {
32 GrContext* ctx = factory->get(GrContextFactory::kNull_GLContextType);
33 if (!ctx) {
34 SkFAIL("Failed to create null context.");
35 return;
36 }
37
38 const GrCaps& caps = *ctx->getGpu()->caps();
39 if (!caps.shaderCaps()->dualSourceBlendingSupport()) {
40 SkFAIL("Null context does not support dual source blending.");
41 return;
42 }
43
44 test_alpha_unknown_with_coverage(reporter, caps);
45 test_alpha_unknown_no_coverage(reporter, caps);
46 test_alpha_opaque_with_coverage(reporter, caps);
47 test_alpha_opaque_no_coverage(reporter, caps);
48 test_color_white_with_coverage(reporter, caps);
49 test_color_white_with_coverage(reporter, caps);
50 test_color_white_no_coverage(reporter, caps);
51 test_no_dual_source_blending(reporter, ctx->getGpu());
52 test_lcd_coverage(reporter, caps);
53 }
54
55 ////////////////////////////////////////////////////////////////////////////////
56
57 #define TEST_ASSERT(...) REPORTER_ASSERT(reporter, __VA_ARGS__)
58
59 enum {
60 kNone_OutputType,
61 kCoverage_OutputType,
62 kModulate_OutputType,
63 kISAModulate_OutputType,
64 kISCModulate_OutputType
65 };
66
67 enum {
68 kNone_Opt = GrXferProcessor::kNone_Opt,
69 kSkipDraw_OptFlag = GrXferProcessor::kSkipDraw_OptFlag,
70 kIgnoreColor_OptFlag = GrXferProcessor::kIgnoreColor_OptFlag,
71 kIgnoreCoverage_OptFlag = GrXferProcessor::kIgnoreCoverage_OptFlag ,
72 kCanTweakAlphaForCoverage_OptFlag = GrXferProcessor::kCanTweakAlphaForCovera ge_OptFlag
73 };
74
75 class GrPorterDuffTest {
76 public:
77 struct XPInfo {
78 XPInfo(skiatest::Reporter* reporter, SkXfermode::Mode xfermode, const Gr Caps& caps,
79 const GrProcOptInfo& colorPOI, const GrProcOptInfo& covPOI) {
80 SkAutoTUnref<GrXPFactory> xpf(GrPorterDuffXPFactory::Create(xfermode ));
81 SkAutoTUnref<GrXferProcessor> xp(xpf->createXferProcessor(colorPOI, covPOI, 0, caps));
82 TEST_ASSERT(!xpf->willNeedDstCopy(caps, colorPOI, covPOI));
83 xpf->getInvariantOutput(colorPOI, covPOI, &fInvariantOutput);
84 fOptFlags = xp->getOptimizations(colorPOI, covPOI, false, 0, caps);
85 GetXPOutputTypes(xp, &fPrimaryOutputType, &fSecondaryOutputType);
86 xp->getBlendInfo(&fBlendInfo);
87 TEST_ASSERT(!xp->willReadDstColor());
88 TEST_ASSERT(xp->hasSecondaryOutput() == GrBlendCoeffRefsSrc2(fBlendI nfo.fDstBlend));
89 }
90
91 GrXPFactory::InvariantOutput fInvariantOutput;
92 int fOptFlags;
93 int fPrimaryOutputType;
94 int fSecondaryOutputType;
95 GrXferProcessor::BlendInfo fBlendInfo;
96 };
97
98 static void GetXPOutputTypes(const GrXferProcessor* xp, int* outPrimary, int * outSecondary) {
99 GrPorterDuffXPFactory::TestGetXPOutputTypes(xp, outPrimary, outSecondary );
100 }
101 };
102
103 static void test_alpha_unknown_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
104 GrProcOptInfo colorPOI, covPOI;
105 colorPOI.calcWithInitialValues(NULL, 0, 0, kNone_GrColorComponentFlags, fals e);
106 covPOI.calcWithInitialValues(NULL, 0, 0, kNone_GrColorComponentFlags, true);
107
108 SkASSERT(!colorPOI.isOpaque());
109 SkASSERT(!colorPOI.isSolidWhite());
110 SkASSERT(!covPOI.isSolidWhite());
111 SkASSERT(!covPOI.isFourChannelOutput());
112
113 for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) {
114 SkXfermode::Mode xfermode = static_cast<SkXfermode::Mode>(m);
115 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, colorPOI, c ovPOI);
116
117 switch (xfermode) {
118 case SkXfermode::kClear_Mode:
119 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
120 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
121 TEST_ASSERT((kIgnoreColor_OptFlag) == xpi.fOptFlags);
122 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
123 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
124 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.f Equation);
125 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
126 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
127 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
128 break;
129 case SkXfermode::kSrc_Mode:
130 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
131 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
132 TEST_ASSERT((kNone_Opt) == xpi.fOptFlags);
133 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
134 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
135 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
136 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
137 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
138 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
139 break;
140 case SkXfermode::kDst_Mode:
141 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
142 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
143 TEST_ASSERT((kSkipDraw_OptFlag |
144 kIgnoreColor_OptFlag |
145 kIgnoreCoverage_OptFlag |
146 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
147 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
148 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
149 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
150 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
151 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
152 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
153 break;
154 case SkXfermode::kSrcOver_Mode:
155 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
156 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
157 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
158 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
159 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
160 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
161 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
162 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
163 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
164 break;
165 case SkXfermode::kDstOver_Mode:
166 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
167 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
168 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
169 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
170 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
171 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
172 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
173 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
174 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
175 break;
176 case SkXfermode::kSrcIn_Mode:
177 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
178 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
179 TEST_ASSERT((kNone_Opt) == 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(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
184 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
185 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
186 break;
187 case SkXfermode::kDstIn_Mode:
188 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
189 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
190 TEST_ASSERT((kNone_Opt) == xpi.fOptFlags);
191 TEST_ASSERT(kISAModulate_OutputType == xpi.fPrimaryOutputType);
192 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
193 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.f Equation);
194 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
195 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
196 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
197 break;
198 case SkXfermode::kSrcOut_Mode:
199 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
200 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
201 TEST_ASSERT((kNone_Opt) == xpi.fOptFlags);
202 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
203 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
204 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
205 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
206 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
207 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
208 break;
209 case SkXfermode::kDstOut_Mode:
210 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
211 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
212 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
213 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
214 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
215 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
216 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
217 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
218 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
219 break;
220 case SkXfermode::kSrcATop_Mode:
221 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
222 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
223 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
224 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
225 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
226 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
227 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
228 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
229 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
230 break;
231 case SkXfermode::kDstATop_Mode:
232 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
233 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
234 TEST_ASSERT((kNone_Opt) == xpi.fOptFlags);
235 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
236 TEST_ASSERT(kISAModulate_OutputType == xpi.fSecondaryOutputType) ;
237 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
238 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
239 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
240 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
241 break;
242 case SkXfermode::kXor_Mode:
243 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
244 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
245 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
246 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
247 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
248 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
249 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
250 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
251 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
252 break;
253 case SkXfermode::kPlus_Mode:
254 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
255 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
256 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
257 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
258 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
259 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
260 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
261 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
262 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
263 break;
264 case SkXfermode::kModulate_Mode:
265 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
266 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
267 TEST_ASSERT((kNone_Opt) == xpi.fOptFlags);
268 TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType);
269 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
270 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.f Equation);
271 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
272 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
273 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
274 break;
275 case SkXfermode::kScreen_Mode:
276 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
277 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
278 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
279 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
280 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
281 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
282 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
283 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
284 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
285 break;
286 default:
287 ERRORF(reporter, "Invalid xfermode.");
288 break;
289 }
290 }
291 }
292
293 static void test_alpha_unknown_no_coverage(skiatest::Reporter* reporter, const G rCaps& caps) {
294 GrProcOptInfo colorPOI, covPOI;
295 colorPOI.calcWithInitialValues(NULL, 0, GrColorPackRGBA(229, 0, 154, 0),
296 kR_GrColorComponentFlag | kB_GrColorComponent Flag, false);
297 covPOI.calcWithInitialValues(NULL, 0, GrColorPackA4(255), kRGBA_GrColorCompo nentFlags, true);
298
299 SkASSERT(!colorPOI.isOpaque());
300 SkASSERT(!colorPOI.isSolidWhite());
301 SkASSERT(covPOI.isSolidWhite());
302 SkASSERT(!covPOI.isFourChannelOutput());
303
304 for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) {
305 SkXfermode::Mode xfermode = static_cast<SkXfermode::Mode>(m);
306 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, colorPOI, c ovPOI);
307
308 switch (xfermode) {
309 case SkXfermode::kClear_Mode:
310 TEST_ASSERT(!xpi.fInvariantOutput.fWillBlendWithDst);
311 TEST_ASSERT(0 == xpi.fInvariantOutput.fBlendedColor);
312 TEST_ASSERT(kRGBA_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
313 TEST_ASSERT((kIgnoreColor_OptFlag |
314 kIgnoreCoverage_OptFlag) == xpi.fOptFlags);
315 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
316 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
317 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
318 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
319 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
320 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
321 break;
322 case SkXfermode::kSrc_Mode:
323 TEST_ASSERT(!xpi.fInvariantOutput.fWillBlendWithDst);
324 TEST_ASSERT(229 == GrColorUnpackR(xpi.fInvariantOutput.fBlendedC olor));
325 TEST_ASSERT(154 == GrColorUnpackB(xpi.fInvariantOutput.fBlendedC olor));
326 TEST_ASSERT((kR_GrColorComponentFlag |
327 kB_GrColorComponentFlag) == xpi.fInvariantOutput.fB lendedColorFlags);
328 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags);
329 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
330 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
331 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
332 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
333 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
334 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
335 break;
336 case SkXfermode::kDst_Mode:
337 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
338 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
339 TEST_ASSERT((kSkipDraw_OptFlag |
340 kIgnoreColor_OptFlag |
341 kIgnoreCoverage_OptFlag |
342 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
343 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
344 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
345 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
346 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
347 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
348 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
349 break;
350 case SkXfermode::kSrcOver_Mode:
351 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
352 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
353 TEST_ASSERT((kIgnoreCoverage_OptFlag |
354 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
355 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
356 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
357 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
358 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
359 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
360 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
361 break;
362 case SkXfermode::kDstOver_Mode:
363 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
364 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
365 TEST_ASSERT((kIgnoreCoverage_OptFlag |
366 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
367 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
368 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
369 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
370 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
371 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
372 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
373 break;
374 case SkXfermode::kSrcIn_Mode:
375 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
376 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
377 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags);
378 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
379 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
380 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
381 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
382 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
383 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
384 break;
385 case SkXfermode::kDstIn_Mode:
386 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
387 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
388 TEST_ASSERT((kIgnoreCoverage_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(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
393 TEST_ASSERT(kSA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
394 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
395 break;
396 case SkXfermode::kSrcOut_Mode:
397 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
398 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
399 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags);
400 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
401 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
402 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
403 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
404 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
405 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
406 break;
407 case SkXfermode::kDstOut_Mode:
408 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
409 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
410 TEST_ASSERT((kIgnoreCoverage_OptFlag |
411 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
412 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
413 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
414 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
415 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
416 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
417 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
418 break;
419 case SkXfermode::kSrcATop_Mode:
420 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
421 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
422 TEST_ASSERT((kIgnoreCoverage_OptFlag |
423 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
424 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
425 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
426 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
427 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
428 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
429 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
430 break;
431 case SkXfermode::kDstATop_Mode:
432 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
433 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
434 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags);
435 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
436 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
437 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
438 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
439 TEST_ASSERT(kSA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
440 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
441 break;
442 case SkXfermode::kXor_Mode:
443 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
444 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
445 TEST_ASSERT((kIgnoreCoverage_OptFlag |
446 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
447 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
448 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
449 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
450 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
451 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
452 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
453 break;
454 case SkXfermode::kPlus_Mode:
455 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
456 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
457 TEST_ASSERT((kIgnoreCoverage_OptFlag |
458 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
459 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
460 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
461 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
462 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
463 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
464 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
465 break;
466 case SkXfermode::kModulate_Mode:
467 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
468 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
469 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags);
470 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
471 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
472 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
473 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
474 TEST_ASSERT(kSC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
475 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
476 break;
477 case SkXfermode::kScreen_Mode:
478 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
479 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
480 TEST_ASSERT((kIgnoreCoverage_OptFlag |
481 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
482 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
483 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
484 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
485 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
486 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
487 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
488 break;
489 default:
490 ERRORF(reporter, "Invalid xfermode.");
491 break;
492 }
493 }
494 }
495
496 static void test_alpha_opaque_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
497 GrProcOptInfo colorPOI, covPOI;
498 colorPOI.calcWithInitialValues(NULL, 0, GrColorPackA4(255), kA_GrColorCompon entFlag, false);
499 covPOI.calcWithInitialValues(NULL, 0, 0, kNone_GrColorComponentFlags, true);
500
501 SkASSERT(colorPOI.isOpaque());
502 SkASSERT(!colorPOI.isSolidWhite());
503 SkASSERT(!covPOI.isSolidWhite());
504 SkASSERT(!covPOI.isFourChannelOutput());
505
506 for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) {
507 SkXfermode::Mode xfermode = static_cast<SkXfermode::Mode>(m);
508 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, colorPOI, c ovPOI);
509
510 switch (xfermode) {
511 case SkXfermode::kClear_Mode:
512 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
513 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
514 TEST_ASSERT((kIgnoreColor_OptFlag) == xpi.fOptFlags);
515 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
516 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
517 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.f Equation);
518 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
519 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
520 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
521 break;
522 case SkXfermode::kSrc_Mode:
523 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
524 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
525 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
526 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
527 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
528 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
529 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
530 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
531 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
532 break;
533 case SkXfermode::kDst_Mode:
534 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
535 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
536 TEST_ASSERT((kSkipDraw_OptFlag |
537 kIgnoreColor_OptFlag |
538 kIgnoreCoverage_OptFlag |
539 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
540 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
541 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
542 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
543 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
544 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
545 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
546 break;
547 case SkXfermode::kSrcOver_Mode:
548 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
549 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
550 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
551 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
552 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
553 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
554 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
555 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
556 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
557 break;
558 case SkXfermode::kDstOver_Mode:
559 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
560 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
561 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
562 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
563 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
564 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
565 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
566 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
567 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
568 break;
569 case SkXfermode::kSrcIn_Mode:
570 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
571 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
572 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
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(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
577 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
578 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
579 break;
580 case SkXfermode::kDstIn_Mode:
581 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
582 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
583 TEST_ASSERT((kSkipDraw_OptFlag |
584 kIgnoreColor_OptFlag |
585 kIgnoreCoverage_OptFlag |
586 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
587 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
588 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
589 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
590 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
591 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
592 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
593 break;
594 case SkXfermode::kSrcOut_Mode:
595 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
596 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
597 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
598 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
599 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
600 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
601 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
602 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
603 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
604 break;
605 case SkXfermode::kDstOut_Mode:
606 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
607 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
608 TEST_ASSERT((kIgnoreColor_OptFlag) == xpi.fOptFlags);
609 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
610 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
611 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.f Equation);
612 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
613 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
614 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
615 break;
616 case SkXfermode::kSrcATop_Mode:
617 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
618 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
619 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
620 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
621 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
622 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
623 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
624 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
625 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
626 break;
627 case SkXfermode::kDstATop_Mode:
628 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
629 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
630 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
631 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
632 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
633 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
634 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
635 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
636 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
637 break;
638 case SkXfermode::kXor_Mode:
639 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
640 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
641 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
642 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
643 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
644 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
645 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
646 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
647 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
648 break;
649 case SkXfermode::kPlus_Mode:
650 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
651 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
652 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
653 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
654 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
655 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
656 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
657 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
658 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
659 break;
660 case SkXfermode::kModulate_Mode:
661 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
662 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
663 TEST_ASSERT((kNone_Opt) == xpi.fOptFlags);
664 TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType);
665 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
666 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.f Equation);
667 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
668 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
669 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
670 break;
671 case SkXfermode::kScreen_Mode:
672 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
673 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
674 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
675 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
676 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
677 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
678 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
679 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
680 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
681 break;
682 default:
683 ERRORF(reporter, "Invalid xfermode.");
684 break;
685 }
686 }
687 }
688
689 static void test_alpha_opaque_no_coverage(skiatest::Reporter* reporter, const Gr Caps& caps) {
690 GrProcOptInfo colorPOI, covPOI;
691 colorPOI.calcWithInitialValues(NULL, 0, GrColorPackRGBA(0, 82, 0, 255),
692 kG_GrColorComponentFlag | kA_GrColorComponent Flag, false);
693 covPOI.calcWithInitialValues(NULL, 0, GrColorPackA4(255), kRGBA_GrColorCompo nentFlags, true);
694
695 SkASSERT(colorPOI.isOpaque());
696 SkASSERT(!colorPOI.isSolidWhite());
697 SkASSERT(covPOI.isSolidWhite());
698 SkASSERT(!covPOI.isFourChannelOutput());
699
700 for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) {
701 SkXfermode::Mode xfermode = static_cast<SkXfermode::Mode>(m);
702 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, colorPOI, c ovPOI);
703
704 switch (xfermode) {
705 case SkXfermode::kClear_Mode:
706 TEST_ASSERT(!xpi.fInvariantOutput.fWillBlendWithDst);
707 TEST_ASSERT(0 == xpi.fInvariantOutput.fBlendedColor);
708 TEST_ASSERT(kRGBA_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
709 TEST_ASSERT((kIgnoreColor_OptFlag |
710 kIgnoreCoverage_OptFlag) == xpi.fOptFlags);
711 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
712 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
713 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
714 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
715 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
716 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
717 break;
718 case SkXfermode::kSrc_Mode:
719 TEST_ASSERT(!xpi.fInvariantOutput.fWillBlendWithDst);
720 TEST_ASSERT(82 == GrColorUnpackG(xpi.fInvariantOutput.fBlendedCo lor));
721 TEST_ASSERT(255 == GrColorUnpackA(xpi.fInvariantOutput.fBlendedC olor));
722 TEST_ASSERT((kG_GrColorComponentFlag |
723 kA_GrColorComponentFlag) == xpi.fInvariantOutput.fB lendedColorFlags);
724 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags);
725 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
726 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
727 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
728 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
729 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
730 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
731 break;
732 case SkXfermode::kDst_Mode:
733 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
734 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
735 TEST_ASSERT((kSkipDraw_OptFlag |
736 kIgnoreColor_OptFlag |
737 kIgnoreCoverage_OptFlag |
738 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
739 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
740 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
741 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
742 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
743 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
744 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
745 break;
746 case SkXfermode::kSrcOver_Mode:
747 TEST_ASSERT(!xpi.fInvariantOutput.fWillBlendWithDst);
748 TEST_ASSERT(82 == GrColorUnpackG(xpi.fInvariantOutput.fBlendedCo lor));
749 TEST_ASSERT(255 == GrColorUnpackA(xpi.fInvariantOutput.fBlendedC olor));
750 TEST_ASSERT((kG_GrColorComponentFlag |
751 kA_GrColorComponentFlag) == xpi.fInvariantOutput.fB lendedColorFlags);
752 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags);
753 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
754 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
755 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
756 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
757 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
758 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
759 break;
760 case SkXfermode::kDstOver_Mode:
761 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
762 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
763 TEST_ASSERT((kIgnoreCoverage_OptFlag |
764 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
765 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
766 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
767 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
768 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
769 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
770 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
771 break;
772 case SkXfermode::kSrcIn_Mode:
773 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
774 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
775 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags);
776 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
777 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
778 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
779 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
780 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
781 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
782 break;
783 case SkXfermode::kDstIn_Mode:
784 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
785 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
786 TEST_ASSERT((kSkipDraw_OptFlag |
787 kIgnoreColor_OptFlag |
788 kIgnoreCoverage_OptFlag |
789 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
790 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
791 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
792 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
793 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
794 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
795 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
796 break;
797 case SkXfermode::kSrcOut_Mode:
798 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
799 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
800 TEST_ASSERT((kIgnoreCoverage_OptFlag) == 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(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
805 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
806 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
807 break;
808 case SkXfermode::kDstOut_Mode:
809 TEST_ASSERT(!xpi.fInvariantOutput.fWillBlendWithDst);
810 TEST_ASSERT(0 == xpi.fInvariantOutput.fBlendedColor);
811 TEST_ASSERT(kRGBA_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
812 TEST_ASSERT((kIgnoreColor_OptFlag |
813 kIgnoreCoverage_OptFlag) == xpi.fOptFlags);
814 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
815 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
816 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
817 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
818 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
819 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
820 break;
821 case SkXfermode::kSrcATop_Mode:
822 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
823 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
824 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags);
825 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
826 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
827 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
828 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
829 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
830 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
831 break;
832 case SkXfermode::kDstATop_Mode:
833 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
834 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
835 TEST_ASSERT((kIgnoreCoverage_OptFlag |
836 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
837 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
838 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
839 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
840 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
841 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
842 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
843 break;
844 case SkXfermode::kXor_Mode:
845 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
846 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
847 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags);
848 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
849 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
850 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
851 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
852 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
853 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
854 break;
855 case SkXfermode::kPlus_Mode:
856 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
857 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
858 TEST_ASSERT((kIgnoreCoverage_OptFlag |
859 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
860 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
861 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
862 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
863 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
864 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
865 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
866 break;
867 case SkXfermode::kModulate_Mode:
868 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
869 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
870 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags);
871 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
872 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
873 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
874 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
875 TEST_ASSERT(kSC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
876 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
877 break;
878 case SkXfermode::kScreen_Mode:
879 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
880 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
881 TEST_ASSERT((kIgnoreCoverage_OptFlag |
882 kCanTweakAlphaForCoverage_OptFlag) == 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(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
887 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
888 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
889 break;
890 default:
891 ERRORF(reporter, "Invalid xfermode.");
892 break;
893 }
894 }
895 }
896
897 static void test_color_white_with_coverage(skiatest::Reporter* reporter, const G rCaps& caps) {
898 GrProcOptInfo colorPOI, covPOI;
899 colorPOI.calcWithInitialValues(NULL, 0, GrColorPackA4(255), kRGBA_GrColorCom ponentFlags, false);
900 covPOI.calcWithInitialValues(NULL, 0, 0, kNone_GrColorComponentFlags, true);
901
902 SkASSERT(colorPOI.isOpaque());
903 SkASSERT(colorPOI.isSolidWhite());
904 SkASSERT(!covPOI.isSolidWhite());
905 SkASSERT(!covPOI.isFourChannelOutput());
906
907 for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) {
908 SkXfermode::Mode xfermode = static_cast<SkXfermode::Mode>(m);
909 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, colorPOI, c ovPOI);
910
911 switch (xfermode) {
912 case SkXfermode::kClear_Mode:
913 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
914 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
915 TEST_ASSERT((kIgnoreColor_OptFlag) == xpi.fOptFlags);
916 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
917 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
918 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.f Equation);
919 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
920 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
921 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
922 break;
923 case SkXfermode::kSrc_Mode:
924 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
925 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
926 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
927 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
928 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
929 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
930 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
931 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
932 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
933 break;
934 case SkXfermode::kDst_Mode:
935 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
936 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
937 TEST_ASSERT((kSkipDraw_OptFlag |
938 kIgnoreColor_OptFlag |
939 kIgnoreCoverage_OptFlag |
940 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
941 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
942 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
943 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
944 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
945 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
946 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
947 break;
948 case SkXfermode::kSrcOver_Mode:
949 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
950 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
951 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
952 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
953 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
954 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
955 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
956 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
957 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
958 break;
959 case SkXfermode::kDstOver_Mode:
960 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
961 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
962 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
963 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
964 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
965 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
966 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
967 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
968 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
969 break;
970 case SkXfermode::kSrcIn_Mode:
971 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
972 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
973 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
974 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
975 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
976 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
977 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
978 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
979 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
980 break;
981 case SkXfermode::kDstIn_Mode:
982 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
983 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
984 TEST_ASSERT((kSkipDraw_OptFlag |
985 kIgnoreColor_OptFlag |
986 kIgnoreCoverage_OptFlag |
987 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
988 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
989 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
990 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
991 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
992 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
993 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
994 break;
995 case SkXfermode::kSrcOut_Mode:
996 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
997 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
998 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
999 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
1000 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
1001 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
1002 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
1003 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
1004 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
1005 break;
1006 case SkXfermode::kDstOut_Mode:
1007 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
1008 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
1009 TEST_ASSERT((kIgnoreColor_OptFlag) == xpi.fOptFlags);
1010 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
1011 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
1012 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.f Equation);
1013 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
1014 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
1015 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
1016 break;
1017 case SkXfermode::kSrcATop_Mode:
1018 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
1019 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
1020 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
1021 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
1022 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
1023 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
1024 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
1025 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
1026 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
1027 break;
1028 case SkXfermode::kDstATop_Mode:
1029 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
1030 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
1031 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
1032 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
1033 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
1034 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
1035 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
1036 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
1037 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
1038 break;
1039 case SkXfermode::kXor_Mode:
1040 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
1041 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
1042 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
1043 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
1044 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
1045 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
1046 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
1047 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
1048 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
1049 break;
1050 case SkXfermode::kPlus_Mode:
1051 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
1052 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
1053 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
1054 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
1055 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
1056 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
1057 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
1058 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
1059 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
1060 break;
1061 case SkXfermode::kModulate_Mode:
1062 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
1063 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
1064 TEST_ASSERT((kNone_Opt) == xpi.fOptFlags);
1065 TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType);
1066 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
1067 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.f Equation);
1068 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
1069 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
1070 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
1071 break;
1072 case SkXfermode::kScreen_Mode:
1073 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
1074 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
1075 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
1076 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
1077 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
1078 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
1079 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
1080 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
1081 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
1082 break;
1083 default:
1084 ERRORF(reporter, "Invalid xfermode.");
1085 break;
1086 }
1087 }
1088 }
1089
1090 static void test_color_white_no_coverage(skiatest::Reporter* reporter, const GrC aps& caps) {
1091 GrProcOptInfo colorPOI, covPOI;
1092 colorPOI.calcWithInitialValues(NULL, 0, GrColorPackA4(255), kRGBA_GrColorCom ponentFlags, false);
1093 covPOI.calcWithInitialValues(NULL, 0, GrColorPackA4(255), kRGBA_GrColorCompo nentFlags, true);
1094
1095 SkASSERT(colorPOI.isOpaque());
1096 SkASSERT(colorPOI.isSolidWhite());
1097 SkASSERT(covPOI.isSolidWhite());
1098 SkASSERT(!covPOI.isFourChannelOutput());
1099
1100 for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) {
1101 SkXfermode::Mode xfermode = static_cast<SkXfermode::Mode>(m);
1102 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, colorPOI, c ovPOI);
1103
1104 switch (xfermode) {
1105 case SkXfermode::kClear_Mode:
1106 TEST_ASSERT(!xpi.fInvariantOutput.fWillBlendWithDst);
1107 TEST_ASSERT(0 == xpi.fInvariantOutput.fBlendedColor);
1108 TEST_ASSERT(kRGBA_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
1109 TEST_ASSERT((kIgnoreColor_OptFlag |
1110 kIgnoreCoverage_OptFlag) == xpi.fOptFlags);
1111 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
1112 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
1113 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
1114 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
1115 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
1116 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
1117 break;
1118 case SkXfermode::kSrc_Mode:
1119 TEST_ASSERT(!xpi.fInvariantOutput.fWillBlendWithDst);
1120 TEST_ASSERT(GrColorPackA4(255) == xpi.fInvariantOutput.fBlendedC olor);
1121 TEST_ASSERT(kRGBA_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
1122 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags);
1123 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
1124 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
1125 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
1126 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
1127 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
1128 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
1129 break;
1130 case SkXfermode::kDst_Mode:
1131 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
1132 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
1133 TEST_ASSERT((kSkipDraw_OptFlag |
1134 kIgnoreColor_OptFlag |
1135 kIgnoreCoverage_OptFlag |
1136 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
1137 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
1138 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
1139 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
1140 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
1141 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
1142 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
1143 break;
1144 case SkXfermode::kSrcOver_Mode:
1145 TEST_ASSERT(!xpi.fInvariantOutput.fWillBlendWithDst);
1146 TEST_ASSERT(GrColorPackA4(255) == xpi.fInvariantOutput.fBlendedC olor);
1147 TEST_ASSERT(kRGBA_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
1148 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags);
1149 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
1150 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
1151 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
1152 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
1153 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
1154 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
1155 break;
1156 case SkXfermode::kDstOver_Mode:
1157 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
1158 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
1159 TEST_ASSERT((kIgnoreCoverage_OptFlag |
1160 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
1161 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
1162 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
1163 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
1164 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
1165 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
1166 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
1167 break;
1168 case SkXfermode::kSrcIn_Mode:
1169 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
1170 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
1171 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags);
1172 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
1173 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
1174 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
1175 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
1176 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
1177 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
1178 break;
1179 case SkXfermode::kDstIn_Mode:
1180 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
1181 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
1182 TEST_ASSERT((kSkipDraw_OptFlag |
1183 kIgnoreColor_OptFlag |
1184 kIgnoreCoverage_OptFlag |
1185 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
1186 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
1187 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
1188 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
1189 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
1190 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
1191 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
1192 break;
1193 case SkXfermode::kSrcOut_Mode:
1194 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
1195 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
1196 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags);
1197 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
1198 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
1199 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
1200 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
1201 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
1202 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
1203 break;
1204 case SkXfermode::kDstOut_Mode:
1205 TEST_ASSERT(!xpi.fInvariantOutput.fWillBlendWithDst);
1206 TEST_ASSERT(0 == xpi.fInvariantOutput.fBlendedColor);
1207 TEST_ASSERT(kRGBA_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
1208 TEST_ASSERT((kIgnoreColor_OptFlag |
1209 kIgnoreCoverage_OptFlag) == xpi.fOptFlags);
1210 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
1211 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
1212 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
1213 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
1214 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
1215 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
1216 break;
1217 case SkXfermode::kSrcATop_Mode:
1218 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
1219 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
1220 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags);
1221 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
1222 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
1223 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
1224 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
1225 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
1226 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
1227 break;
1228 case SkXfermode::kDstATop_Mode:
1229 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
1230 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
1231 TEST_ASSERT((kIgnoreCoverage_OptFlag |
1232 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
1233 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
1234 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
1235 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
1236 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
1237 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
1238 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
1239 break;
1240 case SkXfermode::kXor_Mode:
1241 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
1242 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
1243 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags);
1244 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
1245 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
1246 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
1247 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
1248 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
1249 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
1250 break;
1251 case SkXfermode::kPlus_Mode:
1252 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
1253 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
1254 TEST_ASSERT((kIgnoreCoverage_OptFlag |
1255 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
1256 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
1257 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
1258 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
1259 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
1260 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
1261 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
1262 break;
1263 case SkXfermode::kModulate_Mode:
1264 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
1265 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
1266 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags);
1267 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
1268 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
1269 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
1270 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
1271 TEST_ASSERT(kSC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
1272 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
1273 break;
1274 case SkXfermode::kScreen_Mode:
1275 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
1276 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
1277 TEST_ASSERT((kIgnoreCoverage_OptFlag |
1278 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
1279 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
1280 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
1281 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
1282 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
1283 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
1284 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
1285 break;
1286 default:
1287 ERRORF(reporter, "Invalid xfermode.");
1288 break;
1289 }
1290 }
1291 }
1292
1293 static void test_no_dual_source_blending(skiatest::Reporter* reporter, GrGpu* gp u) {
1294 const GrCaps& nilCaps = GrGLCaps();
bsalomon 2015/05/26 13:19:51 Is your tree up to date? I refactored caps creatio
Chris Dalton 2015/05/26 22:10:28 Waiting for the upcoming change (tomorrow, hopeful
Chris Dalton 2015/05/27 20:42:05 Done.
1295 SkASSERT(!nilCaps.shaderCaps()->dualSourceBlendingSupport());
1296
1297 GrBackendTextureDesc fakeDstTextureDesc;
1298 fakeDstTextureDesc.fConfig = kRGBA_8888_GrPixelConfig;
1299 fakeDstTextureDesc.fWidth = fakeDstTextureDesc.fHeight = 100;
1300 fakeDstTextureDesc.fTextureHandle = 1;
1301 SkAutoTUnref<GrTexture> fakeDstTexture(gpu->wrapBackendTexture(fakeDstTextur eDesc));
1302 GrDeviceCoordTexture fakeDstCopy;
1303 fakeDstCopy.setTexture(fakeDstTexture);
1304
1305 static const GrColor testColors[] = {
1306 0,
1307 GrColorPackRGBA(0, 82, 0, 255),
1308 GrColorPackA4(0255)
1309 };
1310 static const GrColorComponentFlags testColorFlags[] = {
1311 kNone_GrColorComponentFlags,
1312 kG_GrColorComponentFlag | kA_GrColorComponentFlag,
1313 kRGBA_GrColorComponentFlags
1314 };
1315 for (int c = 0; c < 3; c++) {
1316 GrProcOptInfo colorPOI;
1317 colorPOI.calcWithInitialValues(NULL, 0, testColors[c], testColorFlags[c] , false);
1318 for (int f = 0; f <= 1; f++) {
1319 GrProcOptInfo covPOI;
1320 if (!f) {
1321 covPOI.calcWithInitialValues(NULL, 0, 0, kNone_GrColorComponentF lags, true);
1322 } else {
1323 covPOI.calcWithInitialValues(NULL, 0, GrColorPackA4(255),
1324 kRGBA_GrColorComponentFlags, true);
1325 }
1326 for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) {
1327 SkXfermode::Mode xfermode = static_cast<SkXfermode::Mode>(m);
1328 SkAutoTUnref<GrXPFactory> xpf(GrPorterDuffXPFactory::Create(xfer mode));
1329 SkAutoTUnref<GrXferProcessor> xp;
1330 if (xpf->willNeedDstCopy(nilCaps, colorPOI, covPOI)) {
1331 xp.reset(xpf->createXferProcessor(colorPOI, covPOI, &fakeDst Copy, nilCaps));
1332 } else {
1333 xp.reset(xpf->createXferProcessor(colorPOI, covPOI, NULL, ni lCaps));
1334 }
1335 if (!xp) {
1336 ERRORF(reporter, "Failed to create an XP without dual source blending.");
1337 return;
1338 }
1339 TEST_ASSERT(!xp->hasSecondaryOutput());
1340 xp->getOptimizations(colorPOI, covPOI, false, 0, nilCaps);
1341 TEST_ASSERT(!xp->hasSecondaryOutput());
1342 }
1343 }
1344 }
1345 }
1346
1347 static void test_lcd_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
1348 class : public GrBatch {
1349 void getInvariantOutputColor(GrInitInvariantOutput* out) const override {
1350 out->setKnownFourComponents(GrColorPackRGBA(123, 45, 67, 221));
1351 }
1352
1353 void getInvariantOutputCoverage(GrInitInvariantOutput* out) const overri de {
1354 out->setUnknownFourComponents();
1355 out->setUsingLCDCoverage();
1356 }
1357
1358 const char* name() const override { return "Test LCD Text Batch"; }
1359 void initBatchTracker(const GrPipelineInfo&) override {}
1360 bool onCombineIfPossible(GrBatch*) override { return false; }
1361 void generateGeometry(GrBatchTarget*, const GrPipeline*) override {}
1362
1363 } testLCDCoverageBatch;
1364
1365 GrProcOptInfo colorPOI, covPOI;
1366 colorPOI.calcColorWithBatch(&testLCDCoverageBatch, NULL, 0);
1367 covPOI.calcCoverageWithBatch(&testLCDCoverageBatch, NULL, 0);
1368
1369 SkASSERT(kRGBA_GrColorComponentFlags == colorPOI.validFlags());
1370 SkASSERT(covPOI.isFourChannelOutput());
1371
1372 SkAutoTUnref<GrXPFactory> xpf(GrPorterDuffXPFactory::Create(SkXfermode::kSrc Over_Mode));
1373 TEST_ASSERT(!xpf->willNeedDstCopy(caps, colorPOI, covPOI));
1374
1375 SkAutoTUnref<GrXferProcessor> xp(xpf->createXferProcessor(colorPOI, covPOI, 0, caps));
1376 if (!xp) {
1377 ERRORF(reporter, "Failed to create an XP with LCD coverage.");
1378 return;
1379 }
1380
1381 GrXPFactory::InvariantOutput invariantOutput;
1382 xpf->getInvariantOutput(colorPOI, covPOI, &invariantOutput);
1383 TEST_ASSERT(invariantOutput.fWillBlendWithDst);
1384 TEST_ASSERT(kNone_GrColorComponentFlags == invariantOutput.fBlendedColorFlag s);
1385
1386 GrColor overrideColor;
1387 xp->getOptimizations(colorPOI, covPOI, false, &overrideColor, caps);
1388
1389 GrXferProcessor::BlendInfo blendInfo;
1390 xp->getBlendInfo(&blendInfo);
1391 TEST_ASSERT(blendInfo.fWriteColor);
1392 }
1393
1394 #endif
1395
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698