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

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: Finish test for no dual source blending 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
« no previous file with comments | « src/gpu/effects/GrPorterDuffXferProcessor.cpp ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 "GrContextOptions.h"
16 #include "GrGpu.h"
17 #include "GrXferProcessor.h"
18 #include "effects/GrPorterDuffXferProcessor.h"
19 #include "gl/GrGLCaps.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 G rCaps& 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 Gr Caps& caps);
27 static void test_lcd_coverage(skiatest::Reporter* reporter, const GrCaps& caps);
28 static void test_no_dual_source_blending(skiatest::Reporter* reporter);
29
30 DEF_GPUTEST(GrPorterDuff, reporter, factory) {
31 GrContext* ctx = factory->get(GrContextFactory::kNull_GLContextType);
32 if (!ctx) {
33 SkFAIL("Failed to create null context.");
34 return;
35 }
36
37 const GrCaps& caps = *ctx->getGpu()->caps();
38 if (!caps.shaderCaps()->dualSourceBlendingSupport()) {
39 SkFAIL("Null context does not support dual source blending.");
40 return;
41 }
42
43 test_color_unknown_with_coverage(reporter, caps);
44 test_color_unknown_no_coverage(reporter, caps);
45 test_color_opaque_with_coverage(reporter, caps);
46 test_color_opaque_no_coverage(reporter, caps);
47 test_lcd_coverage(reporter, caps);
48 test_no_dual_source_blending(reporter);
49 }
50
51 ////////////////////////////////////////////////////////////////////////////////
52
53 #define TEST_ASSERT(...) REPORTER_ASSERT(reporter, __VA_ARGS__)
54
55 enum {
56 kNone_OutputType,
57 kCoverage_OutputType,
58 kModulate_OutputType,
59 kISAModulate_OutputType,
60 kISCModulate_OutputType
61 };
62
63 enum {
64 kNone_Opt = GrXferProcessor::kNone_Opt,
65 kSkipDraw_OptFlag = GrXferProcessor::kSkipDraw_OptFlag,
66 kIgnoreColor_OptFlag = GrXferProcessor::kIgnoreColor_OptFlag,
67 kIgnoreCoverage_OptFlag = GrXferProcessor::kIgnoreCoverage_OptFlag ,
68 kCanTweakAlphaForCoverage_OptFlag = GrXferProcessor::kCanTweakAlphaForCovera ge_OptFlag
69 };
70
71 class GrPorterDuffTest {
72 public:
73 struct XPInfo {
74 XPInfo(skiatest::Reporter* reporter, SkXfermode::Mode xfermode, const Gr Caps& caps,
75 const GrProcOptInfo& colorPOI, const GrProcOptInfo& covPOI) {
76 SkAutoTUnref<GrXPFactory> xpf(GrPorterDuffXPFactory::Create(xfermode ));
77 SkAutoTUnref<GrXferProcessor> xp(xpf->createXferProcessor(colorPOI, covPOI, 0, caps));
78 TEST_ASSERT(!xpf->willNeedDstTexture(caps, colorPOI, covPOI));
79 xpf->getInvariantOutput(colorPOI, covPOI, &fInvariantOutput);
80 fOptFlags = xp->getOptimizations(colorPOI, covPOI, false, 0, caps);
81 GetXPOutputTypes(xp, &fPrimaryOutputType, &fSecondaryOutputType);
82 xp->getBlendInfo(&fBlendInfo);
83 TEST_ASSERT(!xp->willReadDstColor());
84 TEST_ASSERT(xp->hasSecondaryOutput() == GrBlendCoeffRefsSrc2(fBlendI nfo.fDstBlend));
85 }
86
87 GrXPFactory::InvariantOutput fInvariantOutput;
88 int fOptFlags;
89 int fPrimaryOutputType;
90 int fSecondaryOutputType;
91 GrXferProcessor::BlendInfo fBlendInfo;
92 };
93
94 static void GetXPOutputTypes(const GrXferProcessor* xp, int* outPrimary, int * outSecondary) {
95 GrPorterDuffXPFactory::TestGetXPOutputTypes(xp, outPrimary, outSecondary );
96 }
97 };
98
99 static void test_color_unknown_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
100 GrProcOptInfo colorPOI, covPOI;
101 colorPOI.calcWithInitialValues(NULL, 0, 0, kNone_GrColorComponentFlags, fals e);
102 covPOI.calcWithInitialValues(NULL, 0, 0, kNone_GrColorComponentFlags, true);
103
104 SkASSERT(!colorPOI.isOpaque());
105 SkASSERT(!colorPOI.isSolidWhite());
106 SkASSERT(!covPOI.isSolidWhite());
107 SkASSERT(!covPOI.isFourChannelOutput());
108
109 for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) {
110 SkXfermode::Mode xfermode = static_cast<SkXfermode::Mode>(m);
111 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, colorPOI, c ovPOI);
112
113 switch (xfermode) {
114 case SkXfermode::kClear_Mode:
115 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
116 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
117 TEST_ASSERT((kIgnoreColor_OptFlag) == xpi.fOptFlags);
118 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
119 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
120 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.f Equation);
121 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
122 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
123 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
124 break;
125 case SkXfermode::kSrc_Mode:
126 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
127 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
128 TEST_ASSERT((kNone_Opt) == xpi.fOptFlags);
129 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
130 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
131 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
132 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
133 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
134 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
135 break;
136 case SkXfermode::kDst_Mode:
137 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
138 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
139 TEST_ASSERT((kSkipDraw_OptFlag |
140 kIgnoreColor_OptFlag |
141 kIgnoreCoverage_OptFlag |
142 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
143 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
144 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
145 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
146 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
147 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
148 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
149 break;
150 case SkXfermode::kSrcOver_Mode:
151 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
152 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
153 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
154 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
155 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
156 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
157 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
158 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
159 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
160 break;
161 case SkXfermode::kDstOver_Mode:
162 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
163 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
164 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
165 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
166 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
167 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
168 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
169 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
170 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
171 break;
172 case SkXfermode::kSrcIn_Mode:
173 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
174 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
175 TEST_ASSERT((kNone_Opt) == xpi.fOptFlags);
176 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
177 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
178 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
179 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
180 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
181 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
182 break;
183 case SkXfermode::kDstIn_Mode:
184 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
185 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
186 TEST_ASSERT((kNone_Opt) == xpi.fOptFlags);
187 TEST_ASSERT(kISAModulate_OutputType == xpi.fPrimaryOutputType);
188 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
189 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.f Equation);
190 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
191 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
192 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
193 break;
194 case SkXfermode::kSrcOut_Mode:
195 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
196 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
197 TEST_ASSERT((kNone_Opt) == xpi.fOptFlags);
198 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
199 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
200 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
201 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
202 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
203 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
204 break;
205 case SkXfermode::kDstOut_Mode:
206 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
207 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
208 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
209 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
210 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
211 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
212 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
213 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
214 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
215 break;
216 case SkXfermode::kSrcATop_Mode:
217 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
218 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
219 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
220 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
221 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
222 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
223 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
224 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
225 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
226 break;
227 case SkXfermode::kDstATop_Mode:
228 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
229 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
230 TEST_ASSERT((kNone_Opt) == xpi.fOptFlags);
231 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
232 TEST_ASSERT(kISAModulate_OutputType == xpi.fSecondaryOutputType) ;
233 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
234 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
235 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
236 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
237 break;
238 case SkXfermode::kXor_Mode:
239 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
240 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
241 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
242 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
243 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
244 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
245 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
246 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
247 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
248 break;
249 case SkXfermode::kPlus_Mode:
250 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
251 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
252 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
253 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
254 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
255 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
256 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
257 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
258 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
259 break;
260 case SkXfermode::kModulate_Mode:
261 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
262 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
263 TEST_ASSERT((kNone_Opt) == xpi.fOptFlags);
264 TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType);
265 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
266 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.f Equation);
267 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
268 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
269 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
270 break;
271 case SkXfermode::kScreen_Mode:
272 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
273 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
274 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
275 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
276 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
277 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
278 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
279 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
280 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
281 break;
282 default:
283 ERRORF(reporter, "Invalid xfermode.");
284 break;
285 }
286 }
287 }
288
289 static void test_color_unknown_no_coverage(skiatest::Reporter* reporter, const G rCaps& caps) {
290 GrProcOptInfo colorPOI, covPOI;
291 colorPOI.calcWithInitialValues(NULL, 0, GrColorPackRGBA(229, 0, 154, 0),
292 kR_GrColorComponentFlag | kB_GrColorComponent Flag, false);
293 covPOI.calcWithInitialValues(NULL, 0, GrColorPackA4(255), kRGBA_GrColorCompo nentFlags, true);
294
295 SkASSERT(!colorPOI.isOpaque());
296 SkASSERT(!colorPOI.isSolidWhite());
297 SkASSERT(covPOI.isSolidWhite());
298 SkASSERT(!covPOI.isFourChannelOutput());
299
300 for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) {
301 SkXfermode::Mode xfermode = static_cast<SkXfermode::Mode>(m);
302 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, colorPOI, c ovPOI);
303
304 switch (xfermode) {
305 case SkXfermode::kClear_Mode:
306 TEST_ASSERT(!xpi.fInvariantOutput.fWillBlendWithDst);
307 TEST_ASSERT(0 == xpi.fInvariantOutput.fBlendedColor);
308 TEST_ASSERT(kRGBA_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
309 TEST_ASSERT((kIgnoreColor_OptFlag |
310 kIgnoreCoverage_OptFlag) == xpi.fOptFlags);
311 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
312 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
313 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
314 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
315 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
316 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
317 break;
318 case SkXfermode::kSrc_Mode:
319 TEST_ASSERT(!xpi.fInvariantOutput.fWillBlendWithDst);
320 TEST_ASSERT(229 == GrColorUnpackR(xpi.fInvariantOutput.fBlendedC olor));
321 TEST_ASSERT(154 == GrColorUnpackB(xpi.fInvariantOutput.fBlendedC olor));
322 TEST_ASSERT((kR_GrColorComponentFlag |
323 kB_GrColorComponentFlag) == xpi.fInvariantOutput.fB lendedColorFlags);
324 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags);
325 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
326 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
327 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
328 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
329 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
330 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
331 break;
332 case SkXfermode::kDst_Mode:
333 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
334 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
335 TEST_ASSERT((kSkipDraw_OptFlag |
336 kIgnoreColor_OptFlag |
337 kIgnoreCoverage_OptFlag |
338 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
339 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
340 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
341 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
342 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
343 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
344 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
345 break;
346 case SkXfermode::kSrcOver_Mode:
347 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
348 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
349 TEST_ASSERT((kIgnoreCoverage_OptFlag |
350 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
351 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
352 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
353 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
354 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
355 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
356 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
357 break;
358 case SkXfermode::kDstOver_Mode:
359 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
360 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
361 TEST_ASSERT((kIgnoreCoverage_OptFlag |
362 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
363 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
364 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
365 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
366 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
367 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
368 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
369 break;
370 case SkXfermode::kSrcIn_Mode:
371 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
372 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
373 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags);
374 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
375 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
376 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
377 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
378 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
379 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
380 break;
381 case SkXfermode::kDstIn_Mode:
382 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
383 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
384 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags);
385 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
386 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
387 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
388 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
389 TEST_ASSERT(kSA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
390 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
391 break;
392 case SkXfermode::kSrcOut_Mode:
393 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
394 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
395 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags);
396 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
397 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
398 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
399 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
400 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
401 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
402 break;
403 case SkXfermode::kDstOut_Mode:
404 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
405 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
406 TEST_ASSERT((kIgnoreCoverage_OptFlag |
407 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
408 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
409 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
410 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
411 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
412 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
413 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
414 break;
415 case SkXfermode::kSrcATop_Mode:
416 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
417 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
418 TEST_ASSERT((kIgnoreCoverage_OptFlag |
419 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
420 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
421 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
422 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
423 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
424 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
425 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
426 break;
427 case SkXfermode::kDstATop_Mode:
428 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
429 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
430 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags);
431 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
432 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
433 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
434 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
435 TEST_ASSERT(kSA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
436 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
437 break;
438 case SkXfermode::kXor_Mode:
439 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
440 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
441 TEST_ASSERT((kIgnoreCoverage_OptFlag |
442 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
443 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
444 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
445 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
446 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
447 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
448 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
449 break;
450 case SkXfermode::kPlus_Mode:
451 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
452 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
453 TEST_ASSERT((kIgnoreCoverage_OptFlag |
454 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
455 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
456 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
457 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
458 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
459 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
460 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
461 break;
462 case SkXfermode::kModulate_Mode:
463 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
464 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
465 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags);
466 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
467 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
468 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
469 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
470 TEST_ASSERT(kSC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
471 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
472 break;
473 case SkXfermode::kScreen_Mode:
474 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
475 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
476 TEST_ASSERT((kIgnoreCoverage_OptFlag |
477 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
478 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
479 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
480 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
481 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
482 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
483 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
484 break;
485 default:
486 ERRORF(reporter, "Invalid xfermode.");
487 break;
488 }
489 }
490 }
491
492 static void test_color_opaque_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
493 GrProcOptInfo colorPOI, covPOI;
494 colorPOI.calcWithInitialValues(NULL, 0, GrColorPackA4(255), kA_GrColorCompon entFlag, false);
495 covPOI.calcWithInitialValues(NULL, 0, 0, kNone_GrColorComponentFlags, true);
496
497 SkASSERT(colorPOI.isOpaque());
498 SkASSERT(!colorPOI.isSolidWhite());
499 SkASSERT(!covPOI.isSolidWhite());
500 SkASSERT(!covPOI.isFourChannelOutput());
501
502 for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) {
503 SkXfermode::Mode xfermode = static_cast<SkXfermode::Mode>(m);
504 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, colorPOI, c ovPOI);
505
506 switch (xfermode) {
507 case SkXfermode::kClear_Mode:
508 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
509 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
510 TEST_ASSERT((kIgnoreColor_OptFlag) == xpi.fOptFlags);
511 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
512 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
513 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.f Equation);
514 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
515 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
516 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
517 break;
518 case SkXfermode::kSrc_Mode:
519 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
520 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
521 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
522 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
523 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
524 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
525 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
526 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
527 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
528 break;
529 case SkXfermode::kDst_Mode:
530 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
531 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
532 TEST_ASSERT((kSkipDraw_OptFlag |
533 kIgnoreColor_OptFlag |
534 kIgnoreCoverage_OptFlag |
535 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
536 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
537 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
538 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
539 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
540 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
541 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
542 break;
543 case SkXfermode::kSrcOver_Mode:
544 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
545 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
546 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
547 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
548 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
549 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
550 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
551 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
552 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
553 break;
554 case SkXfermode::kDstOver_Mode:
555 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
556 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
557 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
558 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
559 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
560 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
561 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
562 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
563 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
564 break;
565 case SkXfermode::kSrcIn_Mode:
566 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
567 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
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(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
573 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
574 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
575 break;
576 case SkXfermode::kDstIn_Mode:
577 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
578 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
579 TEST_ASSERT((kSkipDraw_OptFlag |
580 kIgnoreColor_OptFlag |
581 kIgnoreCoverage_OptFlag |
582 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
583 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
584 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
585 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
586 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
587 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
588 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
589 break;
590 case SkXfermode::kSrcOut_Mode:
591 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
592 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
593 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
594 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
595 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
596 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
597 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
598 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
599 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
600 break;
601 case SkXfermode::kDstOut_Mode:
602 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
603 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
604 TEST_ASSERT((kIgnoreColor_OptFlag) == xpi.fOptFlags);
605 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
606 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
607 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.f Equation);
608 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
609 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
610 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
611 break;
612 case SkXfermode::kSrcATop_Mode:
613 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
614 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
615 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
616 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
617 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
618 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
619 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
620 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
621 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
622 break;
623 case SkXfermode::kDstATop_Mode:
624 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
625 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
626 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
627 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
628 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
629 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
630 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
631 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
632 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
633 break;
634 case SkXfermode::kXor_Mode:
635 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
636 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
637 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
638 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
639 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
640 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
641 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
642 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
643 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
644 break;
645 case SkXfermode::kPlus_Mode:
646 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
647 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
648 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
649 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
650 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
651 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
652 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
653 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
654 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
655 break;
656 case SkXfermode::kModulate_Mode:
657 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
658 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
659 TEST_ASSERT((kNone_Opt) == xpi.fOptFlags);
660 TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType);
661 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
662 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.f Equation);
663 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
664 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
665 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
666 break;
667 case SkXfermode::kScreen_Mode:
668 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
669 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
670 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
671 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
672 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
673 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
674 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
675 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
676 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
677 break;
678 default:
679 ERRORF(reporter, "Invalid xfermode.");
680 break;
681 }
682 }
683 }
684
685 static void test_color_opaque_no_coverage(skiatest::Reporter* reporter, const Gr Caps& caps) {
686 GrProcOptInfo colorPOI, covPOI;
687 colorPOI.calcWithInitialValues(NULL, 0, GrColorPackRGBA(0, 82, 0, 255),
688 kG_GrColorComponentFlag | kA_GrColorComponent Flag, false);
689 covPOI.calcWithInitialValues(NULL, 0, GrColorPackA4(255), kRGBA_GrColorCompo nentFlags, true);
690
691 SkASSERT(colorPOI.isOpaque());
692 SkASSERT(!colorPOI.isSolidWhite());
693 SkASSERT(covPOI.isSolidWhite());
694 SkASSERT(!covPOI.isFourChannelOutput());
695
696 for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) {
697 SkXfermode::Mode xfermode = static_cast<SkXfermode::Mode>(m);
698 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, colorPOI, c ovPOI);
699
700 switch (xfermode) {
701 case SkXfermode::kClear_Mode:
702 TEST_ASSERT(!xpi.fInvariantOutput.fWillBlendWithDst);
703 TEST_ASSERT(0 == xpi.fInvariantOutput.fBlendedColor);
704 TEST_ASSERT(kRGBA_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
705 TEST_ASSERT((kIgnoreColor_OptFlag |
706 kIgnoreCoverage_OptFlag) == xpi.fOptFlags);
707 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
708 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
709 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
710 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
711 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
712 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
713 break;
714 case SkXfermode::kSrc_Mode:
715 TEST_ASSERT(!xpi.fInvariantOutput.fWillBlendWithDst);
716 TEST_ASSERT(82 == GrColorUnpackG(xpi.fInvariantOutput.fBlendedCo lor));
717 TEST_ASSERT(255 == GrColorUnpackA(xpi.fInvariantOutput.fBlendedC olor));
718 TEST_ASSERT((kG_GrColorComponentFlag |
719 kA_GrColorComponentFlag) == xpi.fInvariantOutput.fB lendedColorFlags);
720 TEST_ASSERT((kIgnoreCoverage_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(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
725 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
726 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
727 break;
728 case SkXfermode::kDst_Mode:
729 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
730 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
731 TEST_ASSERT((kSkipDraw_OptFlag |
732 kIgnoreColor_OptFlag |
733 kIgnoreCoverage_OptFlag |
734 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
735 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
736 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
737 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
738 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
739 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
740 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
741 break;
742 case SkXfermode::kSrcOver_Mode:
743 TEST_ASSERT(!xpi.fInvariantOutput.fWillBlendWithDst);
744 TEST_ASSERT(82 == GrColorUnpackG(xpi.fInvariantOutput.fBlendedCo lor));
745 TEST_ASSERT(255 == GrColorUnpackA(xpi.fInvariantOutput.fBlendedC olor));
746 TEST_ASSERT((kG_GrColorComponentFlag |
747 kA_GrColorComponentFlag) == xpi.fInvariantOutput.fB lendedColorFlags);
748 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags);
749 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
750 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
751 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
752 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
753 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
754 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
755 break;
756 case SkXfermode::kDstOver_Mode:
757 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
758 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
759 TEST_ASSERT((kIgnoreCoverage_OptFlag |
760 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(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
765 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
766 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
767 break;
768 case SkXfermode::kSrcIn_Mode:
769 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
770 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
771 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags);
772 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
773 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
774 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
775 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
776 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
777 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
778 break;
779 case SkXfermode::kDstIn_Mode:
780 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
781 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
782 TEST_ASSERT((kSkipDraw_OptFlag |
783 kIgnoreColor_OptFlag |
784 kIgnoreCoverage_OptFlag |
785 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
786 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
787 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
788 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
789 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
790 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
791 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
792 break;
793 case SkXfermode::kSrcOut_Mode:
794 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
795 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
796 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags);
797 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
798 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
799 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
800 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
801 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
802 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
803 break;
804 case SkXfermode::kDstOut_Mode:
805 TEST_ASSERT(!xpi.fInvariantOutput.fWillBlendWithDst);
806 TEST_ASSERT(0 == xpi.fInvariantOutput.fBlendedColor);
807 TEST_ASSERT(kRGBA_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
808 TEST_ASSERT((kIgnoreColor_OptFlag |
809 kIgnoreCoverage_OptFlag) == xpi.fOptFlags);
810 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
811 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
812 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
813 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
814 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
815 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
816 break;
817 case SkXfermode::kSrcATop_Mode:
818 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
819 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
820 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags);
821 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
822 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
823 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
824 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
825 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
826 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
827 break;
828 case SkXfermode::kDstATop_Mode:
829 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
830 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
831 TEST_ASSERT((kIgnoreCoverage_OptFlag |
832 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
833 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
834 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
835 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
836 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
837 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
838 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
839 break;
840 case SkXfermode::kXor_Mode:
841 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
842 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
843 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags);
844 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
845 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
846 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
847 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
848 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
849 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
850 break;
851 case SkXfermode::kPlus_Mode:
852 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
853 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
854 TEST_ASSERT((kIgnoreCoverage_OptFlag |
855 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
856 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
857 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
858 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
859 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
860 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
861 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
862 break;
863 case SkXfermode::kModulate_Mode:
864 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
865 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
866 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags);
867 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
868 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
869 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
870 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
871 TEST_ASSERT(kSC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
872 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
873 break;
874 case SkXfermode::kScreen_Mode:
875 TEST_ASSERT(xpi.fInvariantOutput.fWillBlendWithDst);
876 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fInvariantOutput. fBlendedColorFlags);
877 TEST_ASSERT((kIgnoreCoverage_OptFlag |
878 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags );
879 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
880 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
881 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
882 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
883 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
884 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
885 break;
886 default:
887 ERRORF(reporter, "Invalid xfermode.");
888 break;
889 }
890 }
891 }
892
893 static void test_lcd_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
894 class : public GrBatch {
895 void getInvariantOutputColor(GrInitInvariantOutput* out) const override {
896 out->setKnownFourComponents(GrColorPackRGBA(123, 45, 67, 221));
897 }
898
899 void getInvariantOutputCoverage(GrInitInvariantOutput* out) const overri de {
900 out->setUnknownFourComponents();
901 out->setUsingLCDCoverage();
902 }
903
904 const char* name() const override { return "Test LCD Text Batch"; }
905 void initBatchTracker(const GrPipelineInfo&) override {}
906 bool onCombineIfPossible(GrBatch*) override { return false; }
907 void generateGeometry(GrBatchTarget*, const GrPipeline*) override {}
908
909 } testLCDCoverageBatch;
910
911 GrProcOptInfo colorPOI, covPOI;
912 colorPOI.calcColorWithBatch(&testLCDCoverageBatch, NULL, 0);
913 covPOI.calcCoverageWithBatch(&testLCDCoverageBatch, NULL, 0);
914
915 SkASSERT(kRGBA_GrColorComponentFlags == colorPOI.validFlags());
916 SkASSERT(covPOI.isFourChannelOutput());
917
918 SkAutoTUnref<GrXPFactory> xpf(GrPorterDuffXPFactory::Create(SkXfermode::kSrc Over_Mode));
919 TEST_ASSERT(!xpf->willNeedDstTexture(caps, colorPOI, covPOI));
920
921 SkAutoTUnref<GrXferProcessor> xp(xpf->createXferProcessor(colorPOI, covPOI, 0, caps));
922 if (!xp) {
923 ERRORF(reporter, "Failed to create an XP with LCD coverage.");
924 return;
925 }
926
927 GrXPFactory::InvariantOutput invariantOutput;
928 xpf->getInvariantOutput(colorPOI, covPOI, &invariantOutput);
929 TEST_ASSERT(invariantOutput.fWillBlendWithDst);
930 TEST_ASSERT(kNone_GrColorComponentFlags == invariantOutput.fBlendedColorFlag s);
931
932 GrColor overrideColor;
933 xp->getOptimizations(colorPOI, covPOI, false, &overrideColor, caps);
934
935 GrXferProcessor::BlendInfo blendInfo;
936 xp->getBlendInfo(&blendInfo);
937 TEST_ASSERT(blendInfo.fWriteColor);
938 }
939
940 static void test_no_dual_source_blending(skiatest::Reporter* reporter) {
941 GrContextOptions opts;
942 opts.fSuppressDualSourceBlending = true;
943 GrContextFactory factory(opts);
944 factory.get(GrContextFactory::kNull_GLContextType);
945 GrContext* ctx = factory.get(GrContextFactory::kNull_GLContextType);
946 if (!ctx) {
947 SkFAIL("Failed to create null context without ARB_blend_func_extended.") ;
948 return;
949 }
950
951 GrGpu* gpu = ctx->getGpu();
bsalomon 2015/05/27 20:46:20 I'm trying to remove getGpu() from GrContext and a
Chris Dalton 2015/05/27 21:09:41 The only place it calls getGpu() now is to access
bsalomon 2015/05/27 21:16:01 ok I'll updcate it at that time. thanks.
952 const GrCaps& caps = *gpu->caps();
953 if (caps.shaderCaps()->dualSourceBlendingSupport()) {
954 SkFAIL("Null context failed to honor request for no ARB_blend_func_exten ded.");
955 return;
956 }
957
958 GrBackendTextureDesc fakeDesc;
959 fakeDesc.fConfig = kRGBA_8888_GrPixelConfig;
960 fakeDesc.fWidth = fakeDesc.fHeight = 100;
961 fakeDesc.fTextureHandle = 1;
962 SkAutoTUnref<GrTexture> fakeTexture(gpu->wrapBackendTexture(fakeDesc));
963 GrXferProcessor::DstTexture fakeDstTexture;
964 fakeDstTexture.setTexture(fakeTexture);
965
966 static const GrColor testColors[] = {
967 0,
968 GrColorPackRGBA(0, 82, 0, 255),
969 GrColorPackA4(255)
970 };
971 static const GrColorComponentFlags testColorFlags[] = {
972 kNone_GrColorComponentFlags,
973 kG_GrColorComponentFlag | kA_GrColorComponentFlag,
974 kRGBA_GrColorComponentFlags
975 };
976 GR_STATIC_ASSERT(SK_ARRAY_COUNT(testColors) == SK_ARRAY_COUNT(testColorFlags ));
977
978 for (size_t c = 0; c < SK_ARRAY_COUNT(testColors); c++) {
979 GrProcOptInfo colorPOI;
980 colorPOI.calcWithInitialValues(NULL, 0, testColors[c], testColorFlags[c] , false);
981 for (int f = 0; f <= 1; f++) {
982 GrProcOptInfo covPOI;
983 if (!f) {
984 covPOI.calcWithInitialValues(NULL, 0, 0, kNone_GrColorComponentF lags, true);
985 } else {
986 covPOI.calcWithInitialValues(NULL, 0, GrColorPackA4(255),
987 kRGBA_GrColorComponentFlags, true);
988 }
989 for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) {
990 SkXfermode::Mode xfermode = static_cast<SkXfermode::Mode>(m);
991 SkAutoTUnref<GrXPFactory> xpf(GrPorterDuffXPFactory::Create(xfer mode));
992 SkAutoTUnref<GrXferProcessor> xp;
993 if (xpf->willNeedDstTexture(caps, colorPOI, covPOI)) {
994 xp.reset(xpf->createXferProcessor(colorPOI, covPOI, &fakeDst Texture, caps));
995 } else {
996 xp.reset(xpf->createXferProcessor(colorPOI, covPOI, NULL, ca ps));
997 }
998 if (!xp) {
999 ERRORF(reporter, "Failed to create an XP without dual source blending.");
1000 return;
1001 }
1002 TEST_ASSERT(!xp->hasSecondaryOutput());
1003 xp->getOptimizations(colorPOI, covPOI, false, 0, caps);
1004 TEST_ASSERT(!xp->hasSecondaryOutput());
1005 }
1006 }
1007 }
1008 }
1009
1010 #endif
1011
OLDNEW
« no previous file with comments | « src/gpu/effects/GrPorterDuffXferProcessor.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698