blob: f471937f967342c5e8d9d537611975503ee35bf4 [file] [log] [blame]
cdalton6fd158e2015-05-27 15:08:33 -07001/*
2 * Copyright 2015 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
cdalton6fd158e2015-05-27 15:08:33 -07008#include "Test.h"
9
10#if SK_SUPPORT_GPU
11
cdalton6fd158e2015-05-27 15:08:33 -070012#include "GrContextFactory.h"
13#include "GrContextOptions.h"
14#include "GrGpu.h"
15#include "GrResourceProvider.h"
16#include "GrXferProcessor.h"
bsalomon16b99132015-08-13 14:55:50 -070017#include "batches/GrVertexBatch.h"
cdalton6fd158e2015-05-27 15:08:33 -070018#include "effects/GrPorterDuffXferProcessor.h"
19#include "gl/GrGLCaps.h"
20
21////////////////////////////////////////////////////////////////////////////////
22
23static void test_color_unknown_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps);
24static void test_color_unknown_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps);
25static void test_color_opaque_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps);
26static void test_color_opaque_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps);
27static void test_lcd_coverage(skiatest::Reporter* reporter, const GrCaps& caps);
egdaniel723b0502015-09-15 09:31:40 -070028static void test_lcd_coverage_fallback_case(skiatest::Reporter* reporter, const GrCaps& caps);
cdalton6fd158e2015-05-27 15:08:33 -070029
bsalomon758586c2016-04-06 14:02:39 -070030DEF_GPUTEST_FOR_NULLGL_CONTEXT(GrPorterDuff, reporter, ctxInfo) {
bsalomon8b7451a2016-05-11 06:33:06 -070031 const GrCaps& caps = *ctxInfo.grContext()->getGpu()->caps();
cdalton6fd158e2015-05-27 15:08:33 -070032 if (!caps.shaderCaps()->dualSourceBlendingSupport()) {
33 SkFAIL("Null context does not support dual source blending.");
34 return;
35 }
36
37 test_color_unknown_with_coverage(reporter, caps);
38 test_color_unknown_no_coverage(reporter, caps);
39 test_color_opaque_with_coverage(reporter, caps);
40 test_color_opaque_no_coverage(reporter, caps);
41 test_lcd_coverage(reporter, caps);
egdaniel723b0502015-09-15 09:31:40 -070042 test_lcd_coverage_fallback_case(reporter, caps);
cdalton6fd158e2015-05-27 15:08:33 -070043}
44
45////////////////////////////////////////////////////////////////////////////////
46
47#define TEST_ASSERT(...) REPORTER_ASSERT(reporter, __VA_ARGS__)
48
49enum {
50 kNone_OutputType,
51 kCoverage_OutputType,
52 kModulate_OutputType,
egdaniel723b0502015-09-15 09:31:40 -070053 kSAModulate_OutputType,
cdalton6fd158e2015-05-27 15:08:33 -070054 kISAModulate_OutputType,
55 kISCModulate_OutputType
56};
57
58enum {
bsalomon7765a472015-07-08 11:26:37 -070059 kNone_OptFlags = GrXferProcessor::kNone_OptFlags,
cdalton6fd158e2015-05-27 15:08:33 -070060 kSkipDraw_OptFlag = GrXferProcessor::kSkipDraw_OptFlag,
61 kIgnoreColor_OptFlag = GrXferProcessor::kIgnoreColor_OptFlag,
62 kIgnoreCoverage_OptFlag = GrXferProcessor::kIgnoreCoverage_OptFlag,
63 kCanTweakAlphaForCoverage_OptFlag = GrXferProcessor::kCanTweakAlphaForCoverage_OptFlag
64};
65
66class GrPorterDuffTest {
67public:
68 struct XPInfo {
Mike Reed7d954ad2016-10-28 15:42:34 -040069 XPInfo(skiatest::Reporter* reporter, SkBlendMode xfermode, const GrCaps& caps,
ethannicholasde4166a2015-11-30 08:57:38 -080070 const GrPipelineOptimizations& optimizations) {
bungeman06ca8ec2016-06-09 08:01:03 -070071 sk_sp<GrXPFactory> xpf(GrPorterDuffXPFactory::Make(xfermode));
Hal Canary342b7ac2016-11-04 11:49:42 -040072 sk_sp<GrXferProcessor> xp(
ethannicholasde4166a2015-11-30 08:57:38 -080073 xpf->createXferProcessor(optimizations, false, nullptr, caps));
cdalton3ccf2e72016-05-06 09:41:16 -070074 TEST_ASSERT(!xpf->willNeedDstTexture(caps, optimizations));
ethannicholasde4166a2015-11-30 08:57:38 -080075 xpf->getInvariantBlendedColor(optimizations.fColorPOI, &fBlendedColor);
76 fOptFlags = xp->getOptimizations(optimizations, false, nullptr, caps);
Hal Canary342b7ac2016-11-04 11:49:42 -040077 GetXPOutputTypes(xp.get(), &fPrimaryOutputType, &fSecondaryOutputType);
cdalton6fd158e2015-05-27 15:08:33 -070078 xp->getBlendInfo(&fBlendInfo);
79 TEST_ASSERT(!xp->willReadDstColor());
80 TEST_ASSERT(xp->hasSecondaryOutput() == GrBlendCoeffRefsSrc2(fBlendInfo.fDstBlend));
81 }
82
cdalton1fa45722015-06-02 10:43:39 -070083 GrXPFactory::InvariantBlendedColor fBlendedColor;
cdalton6fd158e2015-05-27 15:08:33 -070084 int fOptFlags;
85 int fPrimaryOutputType;
86 int fSecondaryOutputType;
87 GrXferProcessor::BlendInfo fBlendInfo;
88 };
89
90 static void GetXPOutputTypes(const GrXferProcessor* xp, int* outPrimary, int* outSecondary) {
egdanielf2342722015-11-20 15:12:59 -080091 GrPorterDuffXPFactory::TestGetXPOutputTypes(xp, outPrimary, outSecondary);
cdalton6fd158e2015-05-27 15:08:33 -070092 }
93};
94
egdaniel723b0502015-09-15 09:31:40 -070095static void test_lcd_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
ethannicholasde4166a2015-11-30 08:57:38 -080096 GrPipelineOptimizations opt;
97 opt.fColorPOI.calcWithInitialValues(NULL, 0, 0, kNone_GrColorComponentFlags, false);
egdaniel723b0502015-09-15 09:31:40 -070098 // Setting 2nd to last value to false and last to true will force covPOI to LCD coverage.
ethannicholasde4166a2015-11-30 08:57:38 -080099 opt.fCoveragePOI.calcWithInitialValues(NULL, 0, 0, kNone_GrColorComponentFlags, false, true);
egdaniel723b0502015-09-15 09:31:40 -0700100
ethannicholasde4166a2015-11-30 08:57:38 -0800101 SkASSERT(!opt.fColorPOI.isOpaque());
102 SkASSERT(!opt.fColorPOI.isSolidWhite());
103 SkASSERT(!opt.fCoveragePOI.isSolidWhite());
104 SkASSERT(opt.fCoveragePOI.isFourChannelOutput());
egdaniel723b0502015-09-15 09:31:40 -0700105
Mike Reed7d954ad2016-10-28 15:42:34 -0400106 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
107 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
ethannicholasde4166a2015-11-30 08:57:38 -0800108 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, opt);
egdaniel723b0502015-09-15 09:31:40 -0700109
110 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400111 case SkBlendMode::kClear:
egdaniel723b0502015-09-15 09:31:40 -0700112 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst);
113 TEST_ASSERT(0 == xpi.fBlendedColor.fKnownColor);
114 TEST_ASSERT(kRGBA_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
115 TEST_ASSERT((kIgnoreColor_OptFlag) == xpi.fOptFlags);
116 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
117 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
118 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
119 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
120 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
121 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
122 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400123 case SkBlendMode::kSrc:
egdaniel723b0502015-09-15 09:31:40 -0700124 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst);
125 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
126 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
127 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
128 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
129 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
130 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
131 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
132 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
133 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400134 case SkBlendMode::kDst:
egdaniel723b0502015-09-15 09:31:40 -0700135 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
136 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
137 TEST_ASSERT((kSkipDraw_OptFlag |
138 kIgnoreColor_OptFlag |
139 kIgnoreCoverage_OptFlag |
140 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
141 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
142 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
143 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
144 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
145 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
146 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
147 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400148 case SkBlendMode::kSrcOver:
egdaniel723b0502015-09-15 09:31:40 -0700149 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
150 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
151 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
152 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
153 TEST_ASSERT(kSAModulate_OutputType == xpi.fSecondaryOutputType);
154 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
155 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
156 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
157 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
158 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400159 case SkBlendMode::kDstOver:
egdaniel723b0502015-09-15 09:31:40 -0700160 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
161 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
162 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
163 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
164 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
165 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
166 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
167 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
168 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
169 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400170 case SkBlendMode::kSrcIn:
egdaniel723b0502015-09-15 09:31:40 -0700171 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
172 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
173 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
174 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
175 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
176 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
177 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
178 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
179 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
180 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400181 case SkBlendMode::kDstIn:
egdaniel723b0502015-09-15 09:31:40 -0700182 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
183 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
184 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
185 TEST_ASSERT(kISAModulate_OutputType == xpi.fPrimaryOutputType);
186 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
187 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
188 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
189 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
190 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
191 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400192 case SkBlendMode::kSrcOut:
egdaniel723b0502015-09-15 09:31:40 -0700193 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
194 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
195 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
196 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
197 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
198 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
199 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
200 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
201 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
202 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400203 case SkBlendMode::kDstOut:
egdaniel723b0502015-09-15 09:31:40 -0700204 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
205 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
206 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
207 TEST_ASSERT(kSAModulate_OutputType == xpi.fPrimaryOutputType);
208 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
209 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
210 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
211 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
212 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
213 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400214 case SkBlendMode::kSrcATop:
egdaniel723b0502015-09-15 09:31:40 -0700215 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
216 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
217 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
218 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
219 TEST_ASSERT(kSAModulate_OutputType == xpi.fSecondaryOutputType);
220 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
221 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
222 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
223 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
224 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400225 case SkBlendMode::kDstATop:
egdaniel723b0502015-09-15 09:31:40 -0700226 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
227 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
228 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
229 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
230 TEST_ASSERT(kISAModulate_OutputType == xpi.fSecondaryOutputType);
231 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
232 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
233 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
234 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
235 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400236 case SkBlendMode::kXor:
egdaniel723b0502015-09-15 09:31:40 -0700237 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
238 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
239 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
240 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
241 TEST_ASSERT(kSAModulate_OutputType == xpi.fSecondaryOutputType);
242 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
243 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
244 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
245 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
246 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400247 case SkBlendMode::kPlus:
egdaniel723b0502015-09-15 09:31:40 -0700248 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
249 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
250 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
251 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
252 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
253 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
254 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
255 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
256 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
257 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400258 case SkBlendMode::kModulate:
egdaniel723b0502015-09-15 09:31:40 -0700259 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
260 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
261 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
262 TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType);
263 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
264 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
265 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
266 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
267 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
268 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400269 case SkBlendMode::kScreen:
egdaniel723b0502015-09-15 09:31:40 -0700270 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
271 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
272 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
273 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
274 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
275 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
276 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
277 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
278 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
279 break;
280 default:
281 ERRORF(reporter, "Invalid xfermode.");
282 break;
283 }
284 }
285}
cdalton6fd158e2015-05-27 15:08:33 -0700286static void test_color_unknown_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
ethannicholasde4166a2015-11-30 08:57:38 -0800287 GrPipelineOptimizations optimizations;
halcanary9d524f22016-03-29 09:03:52 -0700288 optimizations.fColorPOI.calcWithInitialValues(nullptr, 0, 0, kNone_GrColorComponentFlags,
ethannicholasde4166a2015-11-30 08:57:38 -0800289 false);
halcanary9d524f22016-03-29 09:03:52 -0700290 optimizations.fCoveragePOI.calcWithInitialValues(nullptr, 0, 0, kNone_GrColorComponentFlags,
ethannicholasde4166a2015-11-30 08:57:38 -0800291 true);
cdalton6fd158e2015-05-27 15:08:33 -0700292
ethannicholasde4166a2015-11-30 08:57:38 -0800293 SkASSERT(!optimizations.fColorPOI.isOpaque());
294 SkASSERT(!optimizations.fColorPOI.isSolidWhite());
295 SkASSERT(!optimizations.fCoveragePOI.isSolidWhite());
296 SkASSERT(!optimizations.fCoveragePOI.isFourChannelOutput());
cdalton6fd158e2015-05-27 15:08:33 -0700297
Mike Reed7d954ad2016-10-28 15:42:34 -0400298 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
299 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
ethannicholasde4166a2015-11-30 08:57:38 -0800300 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, optimizations);
cdalton6fd158e2015-05-27 15:08:33 -0700301
egdaniel723b0502015-09-15 09:31:40 -0700302
cdalton6fd158e2015-05-27 15:08:33 -0700303 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400304 case SkBlendMode::kClear:
cdalton1fa45722015-06-02 10:43:39 -0700305 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst);
306 TEST_ASSERT(0 == xpi.fBlendedColor.fKnownColor);
307 TEST_ASSERT(kRGBA_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700308 TEST_ASSERT((kIgnoreColor_OptFlag) == xpi.fOptFlags);
309 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
310 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
311 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
312 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
313 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
314 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
315 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400316 case SkBlendMode::kSrc:
cdalton1fa45722015-06-02 10:43:39 -0700317 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst);
318 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
bsalomon7765a472015-07-08 11:26:37 -0700319 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700320 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
321 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
322 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
323 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
324 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
325 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
326 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400327 case SkBlendMode::kDst:
cdalton1fa45722015-06-02 10:43:39 -0700328 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
329 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700330 TEST_ASSERT((kSkipDraw_OptFlag |
331 kIgnoreColor_OptFlag |
332 kIgnoreCoverage_OptFlag |
333 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
334 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
335 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
336 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
337 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
338 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
339 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
340 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400341 case SkBlendMode::kSrcOver:
cdalton1fa45722015-06-02 10:43:39 -0700342 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
343 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700344 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
345 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
346 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
347 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
348 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
349 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
350 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
351 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400352 case SkBlendMode::kDstOver:
cdalton1fa45722015-06-02 10:43:39 -0700353 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
354 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700355 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
356 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
357 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
358 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
359 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
360 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
361 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
362 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400363 case SkBlendMode::kSrcIn:
cdalton1fa45722015-06-02 10:43:39 -0700364 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
365 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
bsalomon7765a472015-07-08 11:26:37 -0700366 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700367 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
368 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
369 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
370 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
371 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
372 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
373 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400374 case SkBlendMode::kDstIn:
cdalton1fa45722015-06-02 10:43:39 -0700375 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
376 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
bsalomon7765a472015-07-08 11:26:37 -0700377 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700378 TEST_ASSERT(kISAModulate_OutputType == xpi.fPrimaryOutputType);
379 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
380 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
381 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
382 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
383 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
384 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400385 case SkBlendMode::kSrcOut:
cdalton1fa45722015-06-02 10:43:39 -0700386 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
387 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
bsalomon7765a472015-07-08 11:26:37 -0700388 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700389 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
390 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
391 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
392 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
393 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
394 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
395 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400396 case SkBlendMode::kDstOut:
cdalton1fa45722015-06-02 10:43:39 -0700397 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
398 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700399 TEST_ASSERT((kCanTweakAlphaForCoverage_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(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
404 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
405 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
406 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400407 case SkBlendMode::kSrcATop:
cdalton1fa45722015-06-02 10:43:39 -0700408 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
409 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700410 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
411 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
412 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
413 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
414 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
415 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
416 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
417 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400418 case SkBlendMode::kDstATop:
cdalton1fa45722015-06-02 10:43:39 -0700419 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
420 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
bsalomon7765a472015-07-08 11:26:37 -0700421 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700422 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
423 TEST_ASSERT(kISAModulate_OutputType == xpi.fSecondaryOutputType);
424 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
425 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
426 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
427 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
428 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400429 case SkBlendMode::kXor:
cdalton1fa45722015-06-02 10:43:39 -0700430 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
431 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700432 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
433 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
434 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
435 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
436 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
437 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
438 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
439 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400440 case SkBlendMode::kPlus:
cdalton1fa45722015-06-02 10:43:39 -0700441 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
442 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700443 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
444 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
445 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
446 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
447 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
448 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
449 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
450 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400451 case SkBlendMode::kModulate:
cdalton1fa45722015-06-02 10:43:39 -0700452 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
453 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
bsalomon7765a472015-07-08 11:26:37 -0700454 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700455 TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType);
456 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
457 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
458 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
459 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
460 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
461 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400462 case SkBlendMode::kScreen:
cdalton1fa45722015-06-02 10:43:39 -0700463 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
464 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700465 TEST_ASSERT((kCanTweakAlphaForCoverage_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(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
470 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
471 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
472 break;
473 default:
474 ERRORF(reporter, "Invalid xfermode.");
475 break;
476 }
477 }
478}
479
480static void test_color_unknown_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
ethannicholasde4166a2015-11-30 08:57:38 -0800481 GrPipelineOptimizations optimizations;
482 optimizations.fColorPOI.calcWithInitialValues(nullptr, 0, GrColorPackRGBA(229, 0, 154, 0),
cdalton6fd158e2015-05-27 15:08:33 -0700483 kR_GrColorComponentFlag | kB_GrColorComponentFlag, false);
halcanary9d524f22016-03-29 09:03:52 -0700484 optimizations.fCoveragePOI.calcWithInitialValues(nullptr, 0, GrColorPackA4(255),
ethannicholasde4166a2015-11-30 08:57:38 -0800485 kRGBA_GrColorComponentFlags, true);
cdalton6fd158e2015-05-27 15:08:33 -0700486
ethannicholasde4166a2015-11-30 08:57:38 -0800487 SkASSERT(!optimizations.fColorPOI.isOpaque());
488 SkASSERT(!optimizations.fColorPOI.isSolidWhite());
489 SkASSERT(optimizations.fCoveragePOI.isSolidWhite());
490 SkASSERT(!optimizations.fCoveragePOI.isFourChannelOutput());
cdalton6fd158e2015-05-27 15:08:33 -0700491
Mike Reed7d954ad2016-10-28 15:42:34 -0400492 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
493 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
ethannicholasde4166a2015-11-30 08:57:38 -0800494 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, optimizations);
cdalton6fd158e2015-05-27 15:08:33 -0700495
496 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400497 case SkBlendMode::kClear:
cdalton1fa45722015-06-02 10:43:39 -0700498 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst);
499 TEST_ASSERT(0 == xpi.fBlendedColor.fKnownColor);
500 TEST_ASSERT(kRGBA_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700501 TEST_ASSERT((kIgnoreColor_OptFlag |
502 kIgnoreCoverage_OptFlag) == xpi.fOptFlags);
503 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
504 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
505 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
506 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
507 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
508 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
509 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400510 case SkBlendMode::kSrc:
cdalton1fa45722015-06-02 10:43:39 -0700511 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst);
512 TEST_ASSERT(229 == GrColorUnpackR(xpi.fBlendedColor.fKnownColor));
513 TEST_ASSERT(154 == GrColorUnpackB(xpi.fBlendedColor.fKnownColor));
cdalton6fd158e2015-05-27 15:08:33 -0700514 TEST_ASSERT((kR_GrColorComponentFlag |
cdalton1fa45722015-06-02 10:43:39 -0700515 kB_GrColorComponentFlag) == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700516 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags);
517 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
518 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
519 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
520 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
521 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
522 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
523 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400524 case SkBlendMode::kDst:
cdalton1fa45722015-06-02 10:43:39 -0700525 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
526 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700527 TEST_ASSERT((kSkipDraw_OptFlag |
528 kIgnoreColor_OptFlag |
529 kIgnoreCoverage_OptFlag |
530 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
531 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
532 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
533 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
534 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
535 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
536 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
537 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400538 case SkBlendMode::kSrcOver:
cdalton1fa45722015-06-02 10:43:39 -0700539 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
540 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700541 TEST_ASSERT((kIgnoreCoverage_OptFlag |
542 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
543 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
544 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
545 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
546 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
547 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
548 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
549 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400550 case SkBlendMode::kDstOver:
cdalton1fa45722015-06-02 10:43:39 -0700551 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
552 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700553 TEST_ASSERT((kIgnoreCoverage_OptFlag |
554 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
555 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
556 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
557 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
558 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
559 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
560 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
561 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400562 case SkBlendMode::kSrcIn:
cdalton1fa45722015-06-02 10:43:39 -0700563 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
564 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700565 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags);
566 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
567 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
568 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
569 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
570 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
571 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
572 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400573 case SkBlendMode::kDstIn:
cdalton1fa45722015-06-02 10:43:39 -0700574 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
575 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700576 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags);
577 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
578 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
579 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
580 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
581 TEST_ASSERT(kSA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
582 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
583 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400584 case SkBlendMode::kSrcOut:
cdalton1fa45722015-06-02 10:43:39 -0700585 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
586 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700587 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags);
588 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
589 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
590 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
591 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
592 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
593 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
594 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400595 case SkBlendMode::kDstOut:
cdalton1fa45722015-06-02 10:43:39 -0700596 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
597 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700598 TEST_ASSERT((kIgnoreCoverage_OptFlag |
599 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
600 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
601 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
602 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
603 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
604 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
605 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
606 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400607 case SkBlendMode::kSrcATop:
cdalton1fa45722015-06-02 10:43:39 -0700608 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
609 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700610 TEST_ASSERT((kIgnoreCoverage_OptFlag |
611 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
612 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
613 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
614 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
615 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
616 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
617 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
618 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400619 case SkBlendMode::kDstATop:
cdalton1fa45722015-06-02 10:43:39 -0700620 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
621 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700622 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags);
623 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
624 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
625 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
626 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
627 TEST_ASSERT(kSA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
628 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
629 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400630 case SkBlendMode::kXor:
cdalton1fa45722015-06-02 10:43:39 -0700631 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
632 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700633 TEST_ASSERT((kIgnoreCoverage_OptFlag |
634 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
635 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
636 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
637 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
638 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
639 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
640 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
641 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400642 case SkBlendMode::kPlus:
cdalton1fa45722015-06-02 10:43:39 -0700643 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
644 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700645 TEST_ASSERT((kIgnoreCoverage_OptFlag |
646 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
647 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
648 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
649 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
650 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
651 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
652 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
653 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400654 case SkBlendMode::kModulate:
cdalton1fa45722015-06-02 10:43:39 -0700655 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
656 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700657 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags);
658 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
659 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
660 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
661 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
662 TEST_ASSERT(kSC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
663 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
664 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400665 case SkBlendMode::kScreen:
cdalton1fa45722015-06-02 10:43:39 -0700666 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
667 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700668 TEST_ASSERT((kIgnoreCoverage_OptFlag |
669 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
670 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
671 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
672 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
673 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
674 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
675 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
676 break;
677 default:
678 ERRORF(reporter, "Invalid xfermode.");
679 break;
680 }
681 }
682}
683
684static void test_color_opaque_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
ethannicholasde4166a2015-11-30 08:57:38 -0800685 GrPipelineOptimizations optimizations;
halcanary9d524f22016-03-29 09:03:52 -0700686 optimizations.fColorPOI.calcWithInitialValues(nullptr, 0, GrColorPackA4(255),
ethannicholasde4166a2015-11-30 08:57:38 -0800687 kA_GrColorComponentFlag, false);
halcanary9d524f22016-03-29 09:03:52 -0700688 optimizations.fCoveragePOI.calcWithInitialValues(nullptr, 0, 0, kNone_GrColorComponentFlags,
ethannicholasde4166a2015-11-30 08:57:38 -0800689 true);
cdalton6fd158e2015-05-27 15:08:33 -0700690
ethannicholasde4166a2015-11-30 08:57:38 -0800691 SkASSERT(optimizations.fColorPOI.isOpaque());
692 SkASSERT(!optimizations.fColorPOI.isSolidWhite());
693 SkASSERT(!optimizations.fCoveragePOI.isSolidWhite());
694 SkASSERT(!optimizations.fCoveragePOI.isFourChannelOutput());
cdalton6fd158e2015-05-27 15:08:33 -0700695
Mike Reed7d954ad2016-10-28 15:42:34 -0400696 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
697 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
ethannicholasde4166a2015-11-30 08:57:38 -0800698 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, optimizations);
cdalton6fd158e2015-05-27 15:08:33 -0700699
700 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400701 case SkBlendMode::kClear:
cdalton1fa45722015-06-02 10:43:39 -0700702 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst);
703 TEST_ASSERT(0 == xpi.fBlendedColor.fKnownColor);
704 TEST_ASSERT(kRGBA_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700705 TEST_ASSERT((kIgnoreColor_OptFlag) == xpi.fOptFlags);
706 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
707 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
708 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
709 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
710 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
711 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
712 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400713 case SkBlendMode::kSrc:
cdalton1fa45722015-06-02 10:43:39 -0700714 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst);
715 TEST_ASSERT(255 == GrColorUnpackA(xpi.fBlendedColor.fKnownColor));
716 TEST_ASSERT(kA_GrColorComponentFlag == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700717 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
718 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
719 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
720 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
721 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
722 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
723 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
724 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400725 case SkBlendMode::kDst:
cdalton1fa45722015-06-02 10:43:39 -0700726 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
727 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700728 TEST_ASSERT((kSkipDraw_OptFlag |
729 kIgnoreColor_OptFlag |
730 kIgnoreCoverage_OptFlag |
731 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
732 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
733 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
734 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
735 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
736 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
737 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
738 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400739 case SkBlendMode::kSrcOver:
cdalton1fa45722015-06-02 10:43:39 -0700740 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst);
741 TEST_ASSERT(255 == GrColorUnpackA(xpi.fBlendedColor.fKnownColor));
742 TEST_ASSERT(kA_GrColorComponentFlag == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700743 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
744 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
745 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
746 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
747 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
748 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
749 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
750 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400751 case SkBlendMode::kDstOver:
cdalton1fa45722015-06-02 10:43:39 -0700752 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
753 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700754 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
755 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
756 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
757 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
758 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
759 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
760 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
761 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400762 case SkBlendMode::kSrcIn:
cdalton1fa45722015-06-02 10:43:39 -0700763 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
764 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700765 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
766 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
767 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
768 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
769 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
770 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
771 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
772 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400773 case SkBlendMode::kDstIn:
cdalton1fa45722015-06-02 10:43:39 -0700774 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
775 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700776 TEST_ASSERT((kSkipDraw_OptFlag |
777 kIgnoreColor_OptFlag |
778 kIgnoreCoverage_OptFlag |
779 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
780 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
781 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
782 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
783 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
784 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
785 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
786 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400787 case SkBlendMode::kSrcOut:
cdalton1fa45722015-06-02 10:43:39 -0700788 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
789 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700790 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
791 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
792 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
793 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
794 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
795 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
796 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
797 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400798 case SkBlendMode::kDstOut:
cdalton1fa45722015-06-02 10:43:39 -0700799 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst);
800 TEST_ASSERT(0 == xpi.fBlendedColor.fKnownColor);
801 TEST_ASSERT(kRGBA_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700802 TEST_ASSERT((kIgnoreColor_OptFlag) == xpi.fOptFlags);
803 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
804 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
805 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
806 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
807 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
808 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
809 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400810 case SkBlendMode::kSrcATop:
cdalton1fa45722015-06-02 10:43:39 -0700811 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
812 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700813 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
814 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
815 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
816 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
817 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
818 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
819 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
820 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400821 case SkBlendMode::kDstATop:
cdalton1fa45722015-06-02 10:43:39 -0700822 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
823 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700824 TEST_ASSERT((kCanTweakAlphaForCoverage_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(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
829 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
830 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
831 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400832 case SkBlendMode::kXor:
cdalton1fa45722015-06-02 10:43:39 -0700833 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
834 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700835 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
836 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
837 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
838 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
839 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
840 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
841 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
842 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400843 case SkBlendMode::kPlus:
cdalton1fa45722015-06-02 10:43:39 -0700844 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
845 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700846 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
847 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
848 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
849 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
850 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
851 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
852 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
853 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400854 case SkBlendMode::kModulate:
cdalton1fa45722015-06-02 10:43:39 -0700855 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
856 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
bsalomon7765a472015-07-08 11:26:37 -0700857 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700858 TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType);
859 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
860 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
861 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
862 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
863 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
864 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400865 case SkBlendMode::kScreen:
cdalton1fa45722015-06-02 10:43:39 -0700866 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
867 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700868 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
869 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
870 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
871 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
872 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
873 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
874 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
875 break;
876 default:
877 ERRORF(reporter, "Invalid xfermode.");
878 break;
879 }
880 }
881}
882
883static void test_color_opaque_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
ethannicholasde4166a2015-11-30 08:57:38 -0800884 GrPipelineOptimizations optimizations;
885 optimizations.fColorPOI.calcWithInitialValues(nullptr, 0, GrColorPackRGBA(0, 82, 0, 255),
cdalton6fd158e2015-05-27 15:08:33 -0700886 kG_GrColorComponentFlag | kA_GrColorComponentFlag, false);
halcanary9d524f22016-03-29 09:03:52 -0700887 optimizations.fCoveragePOI.calcWithInitialValues(nullptr, 0, GrColorPackA4(255),
ethannicholasde4166a2015-11-30 08:57:38 -0800888 kRGBA_GrColorComponentFlags, true);
cdalton6fd158e2015-05-27 15:08:33 -0700889
ethannicholasde4166a2015-11-30 08:57:38 -0800890 SkASSERT(optimizations.fColorPOI.isOpaque());
891 SkASSERT(!optimizations.fColorPOI.isSolidWhite());
892 SkASSERT(optimizations.fCoveragePOI.isSolidWhite());
893 SkASSERT(!optimizations.fCoveragePOI.isFourChannelOutput());
cdalton6fd158e2015-05-27 15:08:33 -0700894
Mike Reed7d954ad2016-10-28 15:42:34 -0400895 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
896 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
ethannicholasde4166a2015-11-30 08:57:38 -0800897 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, optimizations);
cdalton6fd158e2015-05-27 15:08:33 -0700898
899 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400900 case SkBlendMode::kClear:
cdalton1fa45722015-06-02 10:43:39 -0700901 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst);
902 TEST_ASSERT(0 == xpi.fBlendedColor.fKnownColor);
903 TEST_ASSERT(kRGBA_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700904 TEST_ASSERT((kIgnoreColor_OptFlag |
905 kIgnoreCoverage_OptFlag) == xpi.fOptFlags);
906 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
907 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
908 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
909 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
910 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
911 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
912 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400913 case SkBlendMode::kSrc:
cdalton1fa45722015-06-02 10:43:39 -0700914 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst);
915 TEST_ASSERT(82 == GrColorUnpackG(xpi.fBlendedColor.fKnownColor));
916 TEST_ASSERT(255 == GrColorUnpackA(xpi.fBlendedColor.fKnownColor));
cdalton6fd158e2015-05-27 15:08:33 -0700917 TEST_ASSERT((kG_GrColorComponentFlag |
cdalton1fa45722015-06-02 10:43:39 -0700918 kA_GrColorComponentFlag) == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700919 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags);
920 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
921 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
922 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
923 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
924 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
925 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
926 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400927 case SkBlendMode::kDst:
cdalton1fa45722015-06-02 10:43:39 -0700928 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
929 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700930 TEST_ASSERT((kSkipDraw_OptFlag |
931 kIgnoreColor_OptFlag |
932 kIgnoreCoverage_OptFlag |
933 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
934 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
935 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
936 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
937 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
938 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
939 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
940 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400941 case SkBlendMode::kSrcOver:
cdalton1fa45722015-06-02 10:43:39 -0700942 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst);
943 TEST_ASSERT(82 == GrColorUnpackG(xpi.fBlendedColor.fKnownColor));
944 TEST_ASSERT(255 == GrColorUnpackA(xpi.fBlendedColor.fKnownColor));
cdalton6fd158e2015-05-27 15:08:33 -0700945 TEST_ASSERT((kG_GrColorComponentFlag |
cdalton1fa45722015-06-02 10:43:39 -0700946 kA_GrColorComponentFlag) == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700947 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags);
948 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
949 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
950 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
951 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
952 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
953 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
954 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400955 case SkBlendMode::kDstOver:
cdalton1fa45722015-06-02 10:43:39 -0700956 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
957 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700958 TEST_ASSERT((kIgnoreCoverage_OptFlag |
959 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
960 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
961 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
962 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
963 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
964 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
965 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
966 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400967 case SkBlendMode::kSrcIn:
cdalton1fa45722015-06-02 10:43:39 -0700968 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
969 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700970 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags);
971 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
972 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
973 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
974 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
975 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
976 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
977 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400978 case SkBlendMode::kDstIn:
cdalton1fa45722015-06-02 10:43:39 -0700979 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
980 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700981 TEST_ASSERT((kSkipDraw_OptFlag |
982 kIgnoreColor_OptFlag |
983 kIgnoreCoverage_OptFlag |
984 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
985 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
986 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
987 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
988 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
989 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
990 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
991 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400992 case SkBlendMode::kSrcOut:
cdalton1fa45722015-06-02 10:43:39 -0700993 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
994 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -0700995 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags);
996 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
997 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
998 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
999 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
1000 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
1001 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
1002 break;
Mike Reed7d954ad2016-10-28 15:42:34 -04001003 case SkBlendMode::kDstOut:
cdalton1fa45722015-06-02 10:43:39 -07001004 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst);
1005 TEST_ASSERT(0 == xpi.fBlendedColor.fKnownColor);
1006 TEST_ASSERT(kRGBA_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -07001007 TEST_ASSERT((kIgnoreColor_OptFlag |
1008 kIgnoreCoverage_OptFlag) == xpi.fOptFlags);
1009 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
1010 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
1011 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
1012 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
1013 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
1014 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
1015 break;
Mike Reed7d954ad2016-10-28 15:42:34 -04001016 case SkBlendMode::kSrcATop:
cdalton1fa45722015-06-02 10:43:39 -07001017 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
1018 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -07001019 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags);
1020 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
1021 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
1022 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
1023 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
1024 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
1025 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
1026 break;
Mike Reed7d954ad2016-10-28 15:42:34 -04001027 case SkBlendMode::kDstATop:
cdalton1fa45722015-06-02 10:43:39 -07001028 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
1029 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -07001030 TEST_ASSERT((kIgnoreCoverage_OptFlag |
1031 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;
Mike Reed7d954ad2016-10-28 15:42:34 -04001039 case SkBlendMode::kXor:
cdalton1fa45722015-06-02 10:43:39 -07001040 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
1041 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -07001042 TEST_ASSERT((kIgnoreCoverage_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(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
1048 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
1049 break;
Mike Reed7d954ad2016-10-28 15:42:34 -04001050 case SkBlendMode::kPlus:
cdalton1fa45722015-06-02 10:43:39 -07001051 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
1052 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -07001053 TEST_ASSERT((kIgnoreCoverage_OptFlag |
1054 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
1055 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
1056 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
1057 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
1058 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
1059 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
1060 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
1061 break;
Mike Reed7d954ad2016-10-28 15:42:34 -04001062 case SkBlendMode::kModulate:
cdalton1fa45722015-06-02 10:43:39 -07001063 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
1064 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -07001065 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags);
1066 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
1067 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
1068 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
1069 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
1070 TEST_ASSERT(kSC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
1071 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
1072 break;
Mike Reed7d954ad2016-10-28 15:42:34 -04001073 case SkBlendMode::kScreen:
cdalton1fa45722015-06-02 10:43:39 -07001074 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst);
1075 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -07001076 TEST_ASSERT((kIgnoreCoverage_OptFlag |
1077 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags);
1078 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
1079 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
1080 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
1081 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
1082 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
1083 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
1084 break;
1085 default:
1086 ERRORF(reporter, "Invalid xfermode.");
1087 break;
1088 }
1089 }
1090}
1091
egdaniel723b0502015-09-15 09:31:40 -07001092static void test_lcd_coverage_fallback_case(skiatest::Reporter* reporter, const GrCaps& caps) {
reed1b55a962015-09-17 20:16:13 -07001093 class TestLCDCoverageBatch: public GrVertexBatch {
1094 public:
Brian Salomon25a88092016-12-01 09:36:50 -05001095 DEFINE_OP_CLASS_ID
reed1b55a962015-09-17 20:16:13 -07001096
1097 TestLCDCoverageBatch() : INHERITED(ClassID()) {}
1098
1099 private:
halcanary9d524f22016-03-29 09:03:52 -07001100 void computePipelineOptimizations(GrInitInvariantOutput* color,
ethannicholasff210322015-11-24 12:10:10 -08001101 GrInitInvariantOutput* coverage,
1102 GrBatchToXPOverrides* overrides) const override {
1103 color->setKnownFourComponents(GrColorPackRGBA(123, 45, 67, 221));
1104 coverage->setUnknownFourComponents();
ethannicholas22793252016-01-30 09:59:10 -08001105 coverage->setUsingLCDCoverage(); }
cdalton6fd158e2015-05-27 15:08:33 -07001106
1107 const char* name() const override { return "Test LCD Text Batch"; }
ethannicholasff210322015-11-24 12:10:10 -08001108 void initBatchTracker(const GrXPOverridesForBatch&) override {}
Brian Salomon25a88092016-12-01 09:36:50 -05001109 bool onCombineIfPossible(GrOp*, const GrCaps&) override { return false; }
Mike Kleinfc6c37b2016-09-27 09:34:10 -04001110 void onPrepareDraws(Target*) const override {}
cdalton6fd158e2015-05-27 15:08:33 -07001111
reed1b55a962015-09-17 20:16:13 -07001112 typedef GrVertexBatch INHERITED;
cdalton6fd158e2015-05-27 15:08:33 -07001113 } testLCDCoverageBatch;
1114
ethannicholasff210322015-11-24 12:10:10 -08001115 GrPipelineOptimizations opts;
1116 testLCDCoverageBatch.getPipelineOptimizations(&opts);
1117 GrProcOptInfo colorPOI = opts.fColorPOI;
1118 GrProcOptInfo covPOI = opts.fCoveragePOI;
cdalton6fd158e2015-05-27 15:08:33 -07001119
1120 SkASSERT(kRGBA_GrColorComponentFlags == colorPOI.validFlags());
1121 SkASSERT(covPOI.isFourChannelOutput());
1122
Mike Reed7d954ad2016-10-28 15:42:34 -04001123 sk_sp<GrXPFactory> xpf(GrPorterDuffXPFactory::Make(SkBlendMode::kSrcOver));
cdalton3ccf2e72016-05-06 09:41:16 -07001124 TEST_ASSERT(!xpf->willNeedDstTexture(caps, opts));
cdalton6fd158e2015-05-27 15:08:33 -07001125
Hal Canary342b7ac2016-11-04 11:49:42 -04001126 sk_sp<GrXferProcessor> xp(xpf->createXferProcessor(opts, false, nullptr, caps));
cdalton6fd158e2015-05-27 15:08:33 -07001127 if (!xp) {
1128 ERRORF(reporter, "Failed to create an XP with LCD coverage.");
1129 return;
1130 }
1131
cdalton1fa45722015-06-02 10:43:39 -07001132 GrXPFactory::InvariantBlendedColor blendedColor;
1133 xpf->getInvariantBlendedColor(colorPOI, &blendedColor);
1134 TEST_ASSERT(blendedColor.fWillBlendWithDst);
1135 TEST_ASSERT(kNone_GrColorComponentFlags == blendedColor.fKnownColorFlags);
cdalton6fd158e2015-05-27 15:08:33 -07001136
1137 GrColor overrideColor;
ethannicholasde4166a2015-11-30 08:57:38 -08001138 xp->getOptimizations(opts, false, &overrideColor, caps);
cdalton6fd158e2015-05-27 15:08:33 -07001139
1140 GrXferProcessor::BlendInfo blendInfo;
1141 xp->getBlendInfo(&blendInfo);
1142 TEST_ASSERT(blendInfo.fWriteColor);
1143}
1144
kkinnunen15302832015-12-01 04:35:26 -08001145DEF_GPUTEST(PorterDuffNoDualSourceBlending, reporter, /*factory*/) {
cdalton6fd158e2015-05-27 15:08:33 -07001146 GrContextOptions opts;
1147 opts.fSuppressDualSourceBlending = true;
bsalomon3724e572016-03-30 18:56:19 -07001148 sk_gpu_test::GrContextFactory mockFactory(opts);
bsalomon85b4b532016-04-05 11:06:27 -07001149 GrContext* ctx = mockFactory.get(sk_gpu_test::GrContextFactory::kNullGL_ContextType);
cdalton6fd158e2015-05-27 15:08:33 -07001150 if (!ctx) {
1151 SkFAIL("Failed to create null context without ARB_blend_func_extended.");
1152 return;
1153 }
1154
bsalomon76228632015-05-29 08:02:10 -07001155 const GrCaps& caps = *ctx->caps();
cdalton6fd158e2015-05-27 15:08:33 -07001156 if (caps.shaderCaps()->dualSourceBlendingSupport()) {
1157 SkFAIL("Null context failed to honor request for no ARB_blend_func_extended.");
1158 return;
1159 }
1160
bsalomon091f60c2015-11-10 11:54:56 -08001161 GrBackendObject backendTex =
bungeman6bd52842016-10-27 09:30:08 -07001162 ctx->getGpu()->createTestingOnlyBackendTexture(nullptr, 100, 100, kRGBA_8888_GrPixelConfig);
cdalton6fd158e2015-05-27 15:08:33 -07001163 GrBackendTextureDesc fakeDesc;
1164 fakeDesc.fConfig = kRGBA_8888_GrPixelConfig;
1165 fakeDesc.fWidth = fakeDesc.fHeight = 100;
bsalomon091f60c2015-11-10 11:54:56 -08001166 fakeDesc.fTextureHandle = backendTex;
cdalton6fd158e2015-05-27 15:08:33 -07001167 GrXferProcessor::DstTexture fakeDstTexture;
bungeman6bd52842016-10-27 09:30:08 -07001168 fakeDstTexture.setTexture(
1169 ctx->textureProvider()->wrapBackendTexture(fakeDesc, kBorrow_GrWrapOwnership));
cdalton6fd158e2015-05-27 15:08:33 -07001170
1171 static const GrColor testColors[] = {
1172 0,
1173 GrColorPackRGBA(0, 82, 0, 255),
1174 GrColorPackA4(255)
1175 };
1176 static const GrColorComponentFlags testColorFlags[] = {
1177 kNone_GrColorComponentFlags,
1178 kG_GrColorComponentFlag | kA_GrColorComponentFlag,
1179 kRGBA_GrColorComponentFlags
1180 };
1181 GR_STATIC_ASSERT(SK_ARRAY_COUNT(testColors) == SK_ARRAY_COUNT(testColorFlags));
1182
1183 for (size_t c = 0; c < SK_ARRAY_COUNT(testColors); c++) {
ethannicholasde4166a2015-11-30 08:57:38 -08001184 GrPipelineOptimizations optimizations;
halcanary9d524f22016-03-29 09:03:52 -07001185 optimizations.fColorPOI.calcWithInitialValues(nullptr, 0, testColors[c], testColorFlags[c],
ethannicholasde4166a2015-11-30 08:57:38 -08001186 false);
cdalton6fd158e2015-05-27 15:08:33 -07001187 for (int f = 0; f <= 1; f++) {
cdalton6fd158e2015-05-27 15:08:33 -07001188 if (!f) {
halcanary9d524f22016-03-29 09:03:52 -07001189 optimizations.fCoveragePOI.calcWithInitialValues(nullptr, 0, 0,
ethannicholasde4166a2015-11-30 08:57:38 -08001190 kNone_GrColorComponentFlags, true);
cdalton6fd158e2015-05-27 15:08:33 -07001191 } else {
ethannicholasde4166a2015-11-30 08:57:38 -08001192 optimizations.fCoveragePOI.calcWithInitialValues(nullptr, 0, GrColorPackA4(255),
1193 kRGBA_GrColorComponentFlags, true);
cdalton6fd158e2015-05-27 15:08:33 -07001194 }
Mike Reed7d954ad2016-10-28 15:42:34 -04001195 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
1196 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
bungeman06ca8ec2016-06-09 08:01:03 -07001197 sk_sp<GrXPFactory> xpf(GrPorterDuffXPFactory::Make(xfermode));
cdalton86ae0a92015-06-08 15:11:04 -07001198 GrXferProcessor::DstTexture* dstTexture =
cdalton3ccf2e72016-05-06 09:41:16 -07001199 xpf->willNeedDstTexture(caps, optimizations) ? &fakeDstTexture : 0;
Hal Canary342b7ac2016-11-04 11:49:42 -04001200 sk_sp<GrXferProcessor> xp(
ethannicholasde4166a2015-11-30 08:57:38 -08001201 xpf->createXferProcessor(optimizations, false, dstTexture, caps));
cdalton6fd158e2015-05-27 15:08:33 -07001202 if (!xp) {
1203 ERRORF(reporter, "Failed to create an XP without dual source blending.");
1204 return;
1205 }
1206 TEST_ASSERT(!xp->hasSecondaryOutput());
ethannicholasde4166a2015-11-30 08:57:38 -08001207 xp->getOptimizations(optimizations, false, 0, caps);
cdalton6fd158e2015-05-27 15:08:33 -07001208 TEST_ASSERT(!xp->hasSecondaryOutput());
1209 }
1210 }
1211 }
bsalomon091f60c2015-11-10 11:54:56 -08001212 ctx->getGpu()->deleteTestingOnlyBackendTexture(backendTex);
cdalton6fd158e2015-05-27 15:08:33 -07001213}
1214
1215#endif