blob: a2ba9167bb092f50f58628c68ac241692539abc9 [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"
17#include "effects/GrPorterDuffXferProcessor.h"
18#include "gl/GrGLCaps.h"
Brian Salomon89527432016-12-16 09:52:16 -050019#include "ops/GrMeshDrawOp.h"
cdalton6fd158e2015-05-27 15:08:33 -070020
21////////////////////////////////////////////////////////////////////////////////
22
23static void test_color_unknown_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps);
Brian Salomon31853842017-03-28 16:32:05 -040024static void test_color_not_opaque_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps);
cdalton6fd158e2015-05-27 15:08:33 -070025static 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);
Brian Salomon31853842017-03-28 16:32:05 -040038 test_color_not_opaque_no_coverage(reporter, caps);
cdalton6fd158e2015-05-27 15:08:33 -070039 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
cdalton6fd158e2015-05-27 15:08:33 -070058class GrPorterDuffTest {
59public:
60 struct XPInfo {
Mike Reed7d954ad2016-10-28 15:42:34 -040061 XPInfo(skiatest::Reporter* reporter, SkBlendMode xfermode, const GrCaps& caps,
Brian Salomona811b122017-03-30 08:21:32 -040062 GrProcessorAnalysisColor inputColor, GrProcessorAnalysisCoverage inputCoverage) {
Brian Salomona1633922017-01-09 11:46:10 -050063 const GrXPFactory* xpf = GrPorterDuffXPFactory::Get(xfermode);
Brian Salomona811b122017-03-30 08:21:32 -040064 GrProcessorSet::Analysis analysis(inputColor, inputCoverage, xpf, caps);
Brian Salomon31853842017-03-28 16:32:05 -040065 fCompatibleWithCoverageAsAlpha = analysis.isCompatibleWithCoverageAsAlpha();
66 fCanCombineOverlappedStencilAndCover = analysis.canCombineOverlappedStencilAndCover();
67 fIgnoresInputColor = analysis.isInputColorIgnored();
Brian Salomon1c6025c2017-03-29 14:25:04 -040068 sk_sp<GrXferProcessor> xp(
69 xpf->createXferProcessor(inputColor, inputCoverage, false, nullptr, caps));
Brian Salomon31853842017-03-28 16:32:05 -040070 TEST_ASSERT(!analysis.requiresDstTexture());
Hal Canary342b7ac2016-11-04 11:49:42 -040071 GetXPOutputTypes(xp.get(), &fPrimaryOutputType, &fSecondaryOutputType);
cdalton6fd158e2015-05-27 15:08:33 -070072 xp->getBlendInfo(&fBlendInfo);
73 TEST_ASSERT(!xp->willReadDstColor());
74 TEST_ASSERT(xp->hasSecondaryOutput() == GrBlendCoeffRefsSrc2(fBlendInfo.fDstBlend));
75 }
76
Brian Salomon54d212e2017-03-21 14:22:38 -040077 bool fCanCombineOverlappedStencilAndCover;
Brian Salomon31853842017-03-28 16:32:05 -040078 bool fCompatibleWithCoverageAsAlpha;
79 bool fIgnoresInputColor;
cdalton6fd158e2015-05-27 15:08:33 -070080 int fPrimaryOutputType;
81 int fSecondaryOutputType;
82 GrXferProcessor::BlendInfo fBlendInfo;
83 };
84
85 static void GetXPOutputTypes(const GrXferProcessor* xp, int* outPrimary, int* outSecondary) {
egdanielf2342722015-11-20 15:12:59 -080086 GrPorterDuffXPFactory::TestGetXPOutputTypes(xp, outPrimary, outSecondary);
cdalton6fd158e2015-05-27 15:08:33 -070087 }
88};
89
egdaniel723b0502015-09-15 09:31:40 -070090static void test_lcd_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomona811b122017-03-30 08:21:32 -040091 GrProcessorAnalysisColor inputColor = GrProcessorAnalysisColor::Opaque::kNo;
92 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kLCD;
egdaniel723b0502015-09-15 09:31:40 -070093
Mike Reed7d954ad2016-10-28 15:42:34 -040094 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
95 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon31853842017-03-28 16:32:05 -040096 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
egdaniel723b0502015-09-15 09:31:40 -070097 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -040098 case SkBlendMode::kClear:
Brian Salomon54d212e2017-03-21 14:22:38 -040099 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400100 TEST_ASSERT(xpi.fIgnoresInputColor);
101 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
egdaniel723b0502015-09-15 09:31:40 -0700102 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
103 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
104 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
105 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
106 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
107 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
108 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400109 case SkBlendMode::kSrc:
Brian Salomon54d212e2017-03-21 14:22:38 -0400110 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400111 TEST_ASSERT(!xpi.fIgnoresInputColor);
112 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
egdaniel723b0502015-09-15 09:31:40 -0700113 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
114 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
115 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
116 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
117 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
118 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
119 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400120 case SkBlendMode::kDst:
Brian Salomon54d212e2017-03-21 14:22:38 -0400121 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400122 TEST_ASSERT(xpi.fIgnoresInputColor);
123 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
egdaniel723b0502015-09-15 09:31:40 -0700124 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
125 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
126 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
127 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
128 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
129 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
130 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400131 case SkBlendMode::kSrcOver:
Brian Salomon54d212e2017-03-21 14:22:38 -0400132 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400133 TEST_ASSERT(!xpi.fIgnoresInputColor);
134 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
egdaniel723b0502015-09-15 09:31:40 -0700135 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
136 TEST_ASSERT(kSAModulate_OutputType == xpi.fSecondaryOutputType);
137 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
138 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
139 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
140 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
141 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400142 case SkBlendMode::kDstOver:
Brian Salomon54d212e2017-03-21 14:22:38 -0400143 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400144 TEST_ASSERT(!xpi.fIgnoresInputColor);
145 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
egdaniel723b0502015-09-15 09:31:40 -0700146 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
147 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
148 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
149 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
150 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
151 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
152 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400153 case SkBlendMode::kSrcIn:
Brian Salomon54d212e2017-03-21 14:22:38 -0400154 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400155 TEST_ASSERT(!xpi.fIgnoresInputColor);
156 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
egdaniel723b0502015-09-15 09:31:40 -0700157 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
158 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
159 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
160 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
161 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
162 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
163 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400164 case SkBlendMode::kDstIn:
Brian Salomon54d212e2017-03-21 14:22:38 -0400165 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400166 TEST_ASSERT(!xpi.fIgnoresInputColor);
167 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
egdaniel723b0502015-09-15 09:31:40 -0700168 TEST_ASSERT(kISAModulate_OutputType == xpi.fPrimaryOutputType);
169 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
170 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
171 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
172 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
173 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
174 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400175 case SkBlendMode::kSrcOut:
Brian Salomon54d212e2017-03-21 14:22:38 -0400176 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400177 TEST_ASSERT(!xpi.fIgnoresInputColor);
178 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
egdaniel723b0502015-09-15 09:31:40 -0700179 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
180 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
181 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
182 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
183 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
184 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
185 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400186 case SkBlendMode::kDstOut:
Brian Salomon54d212e2017-03-21 14:22:38 -0400187 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400188 TEST_ASSERT(!xpi.fIgnoresInputColor);
189 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
egdaniel723b0502015-09-15 09:31:40 -0700190 TEST_ASSERT(kSAModulate_OutputType == xpi.fPrimaryOutputType);
191 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
192 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
193 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
194 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
195 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
196 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400197 case SkBlendMode::kSrcATop:
Brian Salomon54d212e2017-03-21 14:22:38 -0400198 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400199 TEST_ASSERT(!xpi.fIgnoresInputColor);
200 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
egdaniel723b0502015-09-15 09:31:40 -0700201 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
202 TEST_ASSERT(kSAModulate_OutputType == xpi.fSecondaryOutputType);
203 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
204 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
205 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
206 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
207 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400208 case SkBlendMode::kDstATop:
Brian Salomon54d212e2017-03-21 14:22:38 -0400209 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400210 TEST_ASSERT(!xpi.fIgnoresInputColor);
211 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
egdaniel723b0502015-09-15 09:31:40 -0700212 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
213 TEST_ASSERT(kISAModulate_OutputType == xpi.fSecondaryOutputType);
214 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
215 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
216 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
217 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
218 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400219 case SkBlendMode::kXor:
Brian Salomon54d212e2017-03-21 14:22:38 -0400220 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400221 TEST_ASSERT(!xpi.fIgnoresInputColor);
222 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
egdaniel723b0502015-09-15 09:31:40 -0700223 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
224 TEST_ASSERT(kSAModulate_OutputType == xpi.fSecondaryOutputType);
225 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
226 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
227 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
228 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
229 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400230 case SkBlendMode::kPlus:
Brian Salomon54d212e2017-03-21 14:22:38 -0400231 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400232 TEST_ASSERT(!xpi.fIgnoresInputColor);
233 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
egdaniel723b0502015-09-15 09:31:40 -0700234 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
235 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
236 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
237 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
238 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
239 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
240 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400241 case SkBlendMode::kModulate:
Brian Salomon54d212e2017-03-21 14:22:38 -0400242 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400243 TEST_ASSERT(!xpi.fIgnoresInputColor);
244 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
egdaniel723b0502015-09-15 09:31:40 -0700245 TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType);
246 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
247 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
248 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
249 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
250 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
251 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400252 case SkBlendMode::kScreen:
Brian Salomon54d212e2017-03-21 14:22:38 -0400253 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400254 TEST_ASSERT(!xpi.fIgnoresInputColor);
255 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
egdaniel723b0502015-09-15 09:31:40 -0700256 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
257 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
258 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
259 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
260 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
261 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
262 break;
263 default:
264 ERRORF(reporter, "Invalid xfermode.");
265 break;
266 }
267 }
268}
cdalton6fd158e2015-05-27 15:08:33 -0700269static void test_color_unknown_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomona811b122017-03-30 08:21:32 -0400270 GrProcessorAnalysisColor inputColor = GrProcessorAnalysisColor::Opaque::kNo;
271 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kSingleChannel;
cdalton6fd158e2015-05-27 15:08:33 -0700272
Mike Reed7d954ad2016-10-28 15:42:34 -0400273 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
274 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon31853842017-03-28 16:32:05 -0400275 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
cdalton6fd158e2015-05-27 15:08:33 -0700276 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400277 case SkBlendMode::kClear:
Brian Salomon54d212e2017-03-21 14:22:38 -0400278 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400279 TEST_ASSERT(xpi.fIgnoresInputColor);
280 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700281 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
282 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
283 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
284 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
285 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
286 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
287 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400288 case SkBlendMode::kSrc:
Brian Salomon54d212e2017-03-21 14:22:38 -0400289 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400290 TEST_ASSERT(!xpi.fIgnoresInputColor);
291 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700292 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
293 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
294 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
295 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
296 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
297 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
298 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400299 case SkBlendMode::kDst:
Brian Salomon54d212e2017-03-21 14:22:38 -0400300 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400301 TEST_ASSERT(xpi.fIgnoresInputColor);
302 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700303 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
304 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
305 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
306 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
307 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
308 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
309 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400310 case SkBlendMode::kSrcOver:
Brian Salomon54d212e2017-03-21 14:22:38 -0400311 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400312 TEST_ASSERT(!xpi.fIgnoresInputColor);
313 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700314 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
315 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
316 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
317 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
318 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
319 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
320 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400321 case SkBlendMode::kDstOver:
Brian Salomon54d212e2017-03-21 14:22:38 -0400322 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400323 TEST_ASSERT(!xpi.fIgnoresInputColor);
324 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700325 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
326 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
327 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
328 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
329 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
330 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
331 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400332 case SkBlendMode::kSrcIn:
Brian Salomon54d212e2017-03-21 14:22:38 -0400333 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400334 TEST_ASSERT(!xpi.fIgnoresInputColor);
335 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700336 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
337 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
338 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
339 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
340 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
341 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
342 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400343 case SkBlendMode::kDstIn:
Brian Salomon54d212e2017-03-21 14:22:38 -0400344 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400345 TEST_ASSERT(!xpi.fIgnoresInputColor);
346 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700347 TEST_ASSERT(kISAModulate_OutputType == xpi.fPrimaryOutputType);
348 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
349 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
350 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
351 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
352 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
353 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400354 case SkBlendMode::kSrcOut:
Brian Salomon54d212e2017-03-21 14:22:38 -0400355 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400356 TEST_ASSERT(!xpi.fIgnoresInputColor);
357 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700358 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
359 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
360 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
361 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
362 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
363 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
364 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400365 case SkBlendMode::kDstOut:
Brian Salomon54d212e2017-03-21 14:22:38 -0400366 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400367 TEST_ASSERT(!xpi.fIgnoresInputColor);
368 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700369 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
370 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
371 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
372 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
373 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
374 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
375 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400376 case SkBlendMode::kSrcATop:
Brian Salomon54d212e2017-03-21 14:22:38 -0400377 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400378 TEST_ASSERT(!xpi.fIgnoresInputColor);
379 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700380 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
381 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
382 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
383 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
384 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
385 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
386 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400387 case SkBlendMode::kDstATop:
Brian Salomon54d212e2017-03-21 14:22:38 -0400388 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400389 TEST_ASSERT(!xpi.fIgnoresInputColor);
390 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700391 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
392 TEST_ASSERT(kISAModulate_OutputType == xpi.fSecondaryOutputType);
393 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
394 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
395 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
396 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
397 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400398 case SkBlendMode::kXor:
Brian Salomon54d212e2017-03-21 14:22:38 -0400399 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400400 TEST_ASSERT(!xpi.fIgnoresInputColor);
401 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700402 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
403 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
404 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
405 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
406 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
407 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
408 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400409 case SkBlendMode::kPlus:
Brian Salomon54d212e2017-03-21 14:22:38 -0400410 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400411 TEST_ASSERT(!xpi.fIgnoresInputColor);
412 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700413 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
414 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
415 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
416 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
417 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
418 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
419 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400420 case SkBlendMode::kModulate:
Brian Salomon54d212e2017-03-21 14:22:38 -0400421 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400422 TEST_ASSERT(!xpi.fIgnoresInputColor);
423 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700424 TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType);
425 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
426 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
427 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
428 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
429 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
430 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400431 case SkBlendMode::kScreen:
Brian Salomon54d212e2017-03-21 14:22:38 -0400432 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400433 TEST_ASSERT(!xpi.fIgnoresInputColor);
434 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700435 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
436 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
437 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
438 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
439 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
440 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
441 break;
442 default:
443 ERRORF(reporter, "Invalid xfermode.");
444 break;
445 }
446 }
447}
448
Brian Salomon31853842017-03-28 16:32:05 -0400449static void test_color_not_opaque_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomona811b122017-03-30 08:21:32 -0400450 GrProcessorAnalysisColor inputColor(GrColorPackRGBA(229, 0, 154, 240));
451 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kNone;
cdalton6fd158e2015-05-27 15:08:33 -0700452
Mike Reed7d954ad2016-10-28 15:42:34 -0400453 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
454 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon31853842017-03-28 16:32:05 -0400455 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
cdalton6fd158e2015-05-27 15:08:33 -0700456 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400457 case SkBlendMode::kClear:
Brian Salomon54d212e2017-03-21 14:22:38 -0400458 TEST_ASSERT(xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400459 TEST_ASSERT(xpi.fIgnoresInputColor);
460 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700461 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
462 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
463 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
464 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
465 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
466 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
467 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400468 case SkBlendMode::kSrc:
Brian Salomon54d212e2017-03-21 14:22:38 -0400469 TEST_ASSERT(xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400470 TEST_ASSERT(!xpi.fIgnoresInputColor);
471 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700472 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
473 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
474 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
475 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
476 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
477 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
478 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400479 case SkBlendMode::kDst:
Brian Salomon54d212e2017-03-21 14:22:38 -0400480 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400481 TEST_ASSERT(xpi.fIgnoresInputColor);
482 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700483 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
484 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
485 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
486 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
487 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
488 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
489 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400490 case SkBlendMode::kSrcOver:
Brian Salomon54d212e2017-03-21 14:22:38 -0400491 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400492 TEST_ASSERT(!xpi.fIgnoresInputColor);
493 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700494 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
495 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
496 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
497 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
498 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
499 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
500 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400501 case SkBlendMode::kDstOver:
Brian Salomon54d212e2017-03-21 14:22:38 -0400502 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400503 TEST_ASSERT(!xpi.fIgnoresInputColor);
504 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700505 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
506 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
507 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
508 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
509 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
510 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
511 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400512 case SkBlendMode::kSrcIn:
Brian Salomon54d212e2017-03-21 14:22:38 -0400513 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400514 TEST_ASSERT(!xpi.fIgnoresInputColor);
515 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700516 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
517 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
518 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
519 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
520 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
521 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
522 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400523 case SkBlendMode::kDstIn:
Brian Salomon54d212e2017-03-21 14:22:38 -0400524 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400525 TEST_ASSERT(!xpi.fIgnoresInputColor);
526 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700527 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
528 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
529 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
530 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
531 TEST_ASSERT(kSA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
532 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
533 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400534 case SkBlendMode::kSrcOut:
Brian Salomon54d212e2017-03-21 14:22:38 -0400535 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400536 TEST_ASSERT(!xpi.fIgnoresInputColor);
537 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700538 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
539 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
540 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
541 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
542 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
543 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
544 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400545 case SkBlendMode::kDstOut:
Brian Salomon54d212e2017-03-21 14:22:38 -0400546 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400547 TEST_ASSERT(!xpi.fIgnoresInputColor);
548 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700549 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
550 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
551 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
552 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
553 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
554 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
555 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400556 case SkBlendMode::kSrcATop:
Brian Salomon54d212e2017-03-21 14:22:38 -0400557 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400558 TEST_ASSERT(!xpi.fIgnoresInputColor);
559 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700560 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
561 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
562 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
563 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
564 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
565 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
566 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400567 case SkBlendMode::kDstATop:
Brian Salomon54d212e2017-03-21 14:22:38 -0400568 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400569 TEST_ASSERT(!xpi.fIgnoresInputColor);
570 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700571 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
572 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
573 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
574 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
575 TEST_ASSERT(kSA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
576 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
577 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400578 case SkBlendMode::kXor:
Brian Salomon54d212e2017-03-21 14:22:38 -0400579 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400580 TEST_ASSERT(!xpi.fIgnoresInputColor);
581 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700582 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
583 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
584 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
585 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
586 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
587 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
588 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400589 case SkBlendMode::kPlus:
Brian Salomon54d212e2017-03-21 14:22:38 -0400590 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400591 TEST_ASSERT(!xpi.fIgnoresInputColor);
592 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700593 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
594 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
595 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
596 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
597 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
598 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
599 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400600 case SkBlendMode::kModulate:
Brian Salomon54d212e2017-03-21 14:22:38 -0400601 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400602 TEST_ASSERT(!xpi.fIgnoresInputColor);
603 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700604 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
605 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
606 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
607 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
608 TEST_ASSERT(kSC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
609 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
610 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400611 case SkBlendMode::kScreen:
Brian Salomon54d212e2017-03-21 14:22:38 -0400612 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400613 TEST_ASSERT(!xpi.fIgnoresInputColor);
614 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700615 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
616 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
617 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
618 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
619 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
620 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
621 break;
622 default:
623 ERRORF(reporter, "Invalid xfermode.");
624 break;
625 }
626 }
627}
628
629static void test_color_opaque_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomona811b122017-03-30 08:21:32 -0400630 GrProcessorAnalysisColor inputColor = GrProcessorAnalysisColor::Opaque::kYes;
631 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kSingleChannel;
cdalton6fd158e2015-05-27 15:08:33 -0700632
Mike Reed7d954ad2016-10-28 15:42:34 -0400633 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
634 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon31853842017-03-28 16:32:05 -0400635 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
cdalton6fd158e2015-05-27 15:08:33 -0700636 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400637 case SkBlendMode::kClear:
Brian Salomon54d212e2017-03-21 14:22:38 -0400638 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400639 TEST_ASSERT(xpi.fIgnoresInputColor);
640 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700641 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
642 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
643 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
644 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
645 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
646 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
647 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400648 case SkBlendMode::kSrc:
Brian Salomon54d212e2017-03-21 14:22:38 -0400649 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400650 TEST_ASSERT(!xpi.fIgnoresInputColor);
651 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700652 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
653 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
654 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
655 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
656 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
657 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
658 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400659 case SkBlendMode::kDst:
Brian Salomon54d212e2017-03-21 14:22:38 -0400660 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400661 TEST_ASSERT(xpi.fIgnoresInputColor);
662 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700663 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
664 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
665 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
666 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
667 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
668 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
669 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400670 case SkBlendMode::kSrcOver:
Brian Salomon54d212e2017-03-21 14:22:38 -0400671 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400672 TEST_ASSERT(!xpi.fIgnoresInputColor);
673 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700674 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
675 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
676 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
677 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
678 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
679 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
680 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400681 case SkBlendMode::kDstOver:
Brian Salomon54d212e2017-03-21 14:22:38 -0400682 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400683 TEST_ASSERT(!xpi.fIgnoresInputColor);
684 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700685 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
686 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
687 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
688 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
689 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
690 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
691 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400692 case SkBlendMode::kSrcIn:
Brian Salomon54d212e2017-03-21 14:22:38 -0400693 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400694 TEST_ASSERT(!xpi.fIgnoresInputColor);
695 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700696 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
697 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
698 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
699 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
700 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
701 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
702 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400703 case SkBlendMode::kDstIn:
Brian Salomon54d212e2017-03-21 14:22:38 -0400704 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400705 TEST_ASSERT(xpi.fIgnoresInputColor);
706 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700707 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(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
712 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
713 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400714 case SkBlendMode::kSrcOut:
Brian Salomon54d212e2017-03-21 14:22:38 -0400715 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400716 TEST_ASSERT(!xpi.fIgnoresInputColor);
717 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700718 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
719 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
720 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
721 TEST_ASSERT(kIDA_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::kDstOut:
Brian Salomon54d212e2017-03-21 14:22:38 -0400726 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400727 TEST_ASSERT(xpi.fIgnoresInputColor);
728 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700729 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
730 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
731 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
732 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
733 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
734 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
735 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400736 case SkBlendMode::kSrcATop:
Brian Salomon54d212e2017-03-21 14:22:38 -0400737 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400738 TEST_ASSERT(!xpi.fIgnoresInputColor);
739 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700740 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
741 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
742 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
743 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
744 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
745 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
746 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400747 case SkBlendMode::kDstATop:
Brian Salomon54d212e2017-03-21 14:22:38 -0400748 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400749 TEST_ASSERT(!xpi.fIgnoresInputColor);
750 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700751 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
752 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
753 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
754 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
755 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
756 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
757 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400758 case SkBlendMode::kXor:
Brian Salomon54d212e2017-03-21 14:22:38 -0400759 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400760 TEST_ASSERT(!xpi.fIgnoresInputColor);
761 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700762 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
763 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
764 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
765 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
766 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
767 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
768 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400769 case SkBlendMode::kPlus:
Brian Salomon54d212e2017-03-21 14:22:38 -0400770 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400771 TEST_ASSERT(!xpi.fIgnoresInputColor);
772 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700773 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
774 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
775 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
776 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
777 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
778 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
779 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400780 case SkBlendMode::kModulate:
Brian Salomon54d212e2017-03-21 14:22:38 -0400781 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400782 TEST_ASSERT(!xpi.fIgnoresInputColor);
cdalton6fd158e2015-05-27 15:08:33 -0700783 TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType);
784 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
785 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
786 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
787 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
788 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
789 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400790 case SkBlendMode::kScreen:
Brian Salomon54d212e2017-03-21 14:22:38 -0400791 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400792 TEST_ASSERT(!xpi.fIgnoresInputColor);
793 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700794 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
795 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
796 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
797 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
798 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
799 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
800 break;
801 default:
802 ERRORF(reporter, "Invalid xfermode.");
803 break;
804 }
805 }
806}
807
808static void test_color_opaque_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomona811b122017-03-30 08:21:32 -0400809 GrProcessorAnalysisColor inputColor = GrProcessorAnalysisColor::Opaque::kYes;
810 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kNone;
cdalton6fd158e2015-05-27 15:08:33 -0700811
Mike Reed7d954ad2016-10-28 15:42:34 -0400812 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
813 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon31853842017-03-28 16:32:05 -0400814 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
cdalton6fd158e2015-05-27 15:08:33 -0700815
816 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400817 case SkBlendMode::kClear:
Brian Salomon54d212e2017-03-21 14:22:38 -0400818 TEST_ASSERT(xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400819 TEST_ASSERT(xpi.fIgnoresInputColor);
820 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700821 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
822 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
823 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
824 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
825 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
826 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
827 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400828 case SkBlendMode::kSrc:
Brian Salomon54d212e2017-03-21 14:22:38 -0400829 TEST_ASSERT(xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400830 TEST_ASSERT(!xpi.fIgnoresInputColor);
831 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700832 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
833 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
834 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
835 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
836 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
837 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
838 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400839 case SkBlendMode::kDst:
Brian Salomon54d212e2017-03-21 14:22:38 -0400840 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400841 TEST_ASSERT(xpi.fIgnoresInputColor);
842 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700843 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
844 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
845 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
846 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
847 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
848 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
849 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400850 case SkBlendMode::kSrcOver:
Brian Salomon54d212e2017-03-21 14:22:38 -0400851 TEST_ASSERT(xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400852 TEST_ASSERT(!xpi.fIgnoresInputColor);
853 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700854 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
855 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
856 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
857 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
858 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
859 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
860 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400861 case SkBlendMode::kDstOver:
Brian Salomon54d212e2017-03-21 14:22:38 -0400862 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400863 TEST_ASSERT(!xpi.fIgnoresInputColor);
864 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700865 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
866 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
867 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
868 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
869 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
870 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
871 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400872 case SkBlendMode::kSrcIn:
Brian Salomon54d212e2017-03-21 14:22:38 -0400873 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400874 TEST_ASSERT(!xpi.fIgnoresInputColor);
875 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700876 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
877 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
878 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
879 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
880 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
881 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
882 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400883 case SkBlendMode::kDstIn:
Brian Salomon54d212e2017-03-21 14:22:38 -0400884 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400885 TEST_ASSERT(xpi.fIgnoresInputColor);
886 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700887 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
888 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
889 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
890 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
891 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
892 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
893 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400894 case SkBlendMode::kSrcOut:
Brian Salomon54d212e2017-03-21 14:22:38 -0400895 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400896 TEST_ASSERT(!xpi.fIgnoresInputColor);
897 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700898 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
899 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
900 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
901 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
902 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
903 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
904 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400905 case SkBlendMode::kDstOut:
Brian Salomon54d212e2017-03-21 14:22:38 -0400906 TEST_ASSERT(xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400907 TEST_ASSERT(xpi.fIgnoresInputColor);
908 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700909 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
910 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
911 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
912 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
913 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
914 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
915 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400916 case SkBlendMode::kSrcATop:
Brian Salomon54d212e2017-03-21 14:22:38 -0400917 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400918 TEST_ASSERT(!xpi.fIgnoresInputColor);
919 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700920 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
921 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
922 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
923 TEST_ASSERT(kDA_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::kDstATop:
Brian Salomon54d212e2017-03-21 14:22:38 -0400928 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400929 TEST_ASSERT(!xpi.fIgnoresInputColor);
930 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700931 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
932 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
933 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
934 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
935 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
936 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
937 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400938 case SkBlendMode::kXor:
Brian Salomon54d212e2017-03-21 14:22:38 -0400939 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400940 TEST_ASSERT(!xpi.fIgnoresInputColor);
941 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700942 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
943 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
944 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
945 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
946 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
947 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
948 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400949 case SkBlendMode::kPlus:
Brian Salomon54d212e2017-03-21 14:22:38 -0400950 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400951 TEST_ASSERT(!xpi.fIgnoresInputColor);
952 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700953 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
954 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
955 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
956 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
957 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
958 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
959 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400960 case SkBlendMode::kModulate:
Brian Salomon54d212e2017-03-21 14:22:38 -0400961 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400962 TEST_ASSERT(!xpi.fIgnoresInputColor);
963 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700964 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
965 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
966 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
967 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
968 TEST_ASSERT(kSC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
969 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
970 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400971 case SkBlendMode::kScreen:
Brian Salomon54d212e2017-03-21 14:22:38 -0400972 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400973 TEST_ASSERT(!xpi.fIgnoresInputColor);
974 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700975 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
976 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
977 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
978 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
979 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
980 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
981 break;
982 default:
983 ERRORF(reporter, "Invalid xfermode.");
984 break;
985 }
986 }
987}
988
egdaniel723b0502015-09-15 09:31:40 -0700989static void test_lcd_coverage_fallback_case(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomon31853842017-03-28 16:32:05 -0400990 const GrXPFactory* xpf = GrPorterDuffXPFactory::Get(SkBlendMode::kSrcOver);
Brian Salomona811b122017-03-30 08:21:32 -0400991 GrProcessorAnalysisColor color = GrColorPackRGBA(123, 45, 67, 221);
992 GrProcessorAnalysisCoverage coverage = GrProcessorAnalysisCoverage::kLCD;
Brian Salomon1c6025c2017-03-29 14:25:04 -0400993 SkASSERT(!(GrXPFactory::GetAnalysisProperties(xpf, color, coverage, caps) &
994 GrXPFactory::AnalysisProperties::kRequiresDstTexture));
995 sk_sp<GrXferProcessor> xp(xpf->createXferProcessor(color, coverage, false, nullptr, caps));
cdalton6fd158e2015-05-27 15:08:33 -0700996 if (!xp) {
997 ERRORF(reporter, "Failed to create an XP with LCD coverage.");
998 return;
999 }
1000
cdalton6fd158e2015-05-27 15:08:33 -07001001 GrXferProcessor::BlendInfo blendInfo;
1002 xp->getBlendInfo(&blendInfo);
1003 TEST_ASSERT(blendInfo.fWriteColor);
1004}
1005
kkinnunen15302832015-12-01 04:35:26 -08001006DEF_GPUTEST(PorterDuffNoDualSourceBlending, reporter, /*factory*/) {
cdalton6fd158e2015-05-27 15:08:33 -07001007 GrContextOptions opts;
1008 opts.fSuppressDualSourceBlending = true;
bsalomon3724e572016-03-30 18:56:19 -07001009 sk_gpu_test::GrContextFactory mockFactory(opts);
bsalomon85b4b532016-04-05 11:06:27 -07001010 GrContext* ctx = mockFactory.get(sk_gpu_test::GrContextFactory::kNullGL_ContextType);
cdalton6fd158e2015-05-27 15:08:33 -07001011 if (!ctx) {
1012 SkFAIL("Failed to create null context without ARB_blend_func_extended.");
1013 return;
1014 }
1015
bsalomon76228632015-05-29 08:02:10 -07001016 const GrCaps& caps = *ctx->caps();
cdalton6fd158e2015-05-27 15:08:33 -07001017 if (caps.shaderCaps()->dualSourceBlendingSupport()) {
1018 SkFAIL("Null context failed to honor request for no ARB_blend_func_extended.");
1019 return;
1020 }
1021
bsalomon091f60c2015-11-10 11:54:56 -08001022 GrBackendObject backendTex =
bungeman6bd52842016-10-27 09:30:08 -07001023 ctx->getGpu()->createTestingOnlyBackendTexture(nullptr, 100, 100, kRGBA_8888_GrPixelConfig);
cdalton6fd158e2015-05-27 15:08:33 -07001024 GrBackendTextureDesc fakeDesc;
1025 fakeDesc.fConfig = kRGBA_8888_GrPixelConfig;
1026 fakeDesc.fWidth = fakeDesc.fHeight = 100;
bsalomon091f60c2015-11-10 11:54:56 -08001027 fakeDesc.fTextureHandle = backendTex;
cdalton6fd158e2015-05-27 15:08:33 -07001028 GrXferProcessor::DstTexture fakeDstTexture;
bungeman6bd52842016-10-27 09:30:08 -07001029 fakeDstTexture.setTexture(
Brian Osman32342f02017-03-04 08:12:46 -05001030 ctx->resourceProvider()->wrapBackendTexture(fakeDesc, kBorrow_GrWrapOwnership));
cdalton6fd158e2015-05-27 15:08:33 -07001031
Brian Salomona811b122017-03-30 08:21:32 -04001032 static const GrProcessorAnalysisColor colorInputs[] = {
1033 GrProcessorAnalysisColor::Opaque::kNo, GrProcessorAnalysisColor::Opaque::kYes,
1034 GrProcessorAnalysisColor(GrColorPackRGBA(0, 82, 17, 100)),
1035 GrProcessorAnalysisColor(GrColorPackRGBA(0, 82, 17, 255))};
cdalton6fd158e2015-05-27 15:08:33 -07001036
Brian Salomonc6b71462017-02-14 11:33:01 -05001037 for (const auto& colorInput : colorInputs) {
Brian Salomona811b122017-03-30 08:21:32 -04001038 for (GrProcessorAnalysisCoverage coverageType :
1039 {GrProcessorAnalysisCoverage::kSingleChannel, GrProcessorAnalysisCoverage::kNone}) {
Mike Reed7d954ad2016-10-28 15:42:34 -04001040 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
1041 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomona1633922017-01-09 11:46:10 -05001042 const GrXPFactory* xpf = GrPorterDuffXPFactory::Get(xfermode);
Brian Salomona811b122017-03-30 08:21:32 -04001043 GrProcessorSet::Analysis analysis;
1044 analysis = GrProcessorSet::Analysis(colorInput, coverageType, xpf, caps);
cdalton86ae0a92015-06-08 15:11:04 -07001045 GrXferProcessor::DstTexture* dstTexture =
Brian Salomon31853842017-03-28 16:32:05 -04001046 analysis.requiresDstTexture() ? &fakeDstTexture : nullptr;
Brian Salomon1c6025c2017-03-29 14:25:04 -04001047 sk_sp<GrXferProcessor> xp(xpf->createXferProcessor(colorInput, coverageType, false,
1048 dstTexture, caps));
cdalton6fd158e2015-05-27 15:08:33 -07001049 if (!xp) {
1050 ERRORF(reporter, "Failed to create an XP without dual source blending.");
1051 return;
1052 }
1053 TEST_ASSERT(!xp->hasSecondaryOutput());
cdalton6fd158e2015-05-27 15:08:33 -07001054 }
1055 }
1056 }
bsalomon091f60c2015-11-10 11:54:56 -08001057 ctx->getGpu()->deleteTestingOnlyBackendTexture(backendTex);
cdalton6fd158e2015-05-27 15:08:33 -07001058}
1059
1060#endif