1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2015 Google Inc.
3*c8dee2aaSAndroid Build Coastguard Worker *
4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker */
7*c8dee2aaSAndroid Build Coastguard Worker
8*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkBlendMode.h"
9*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkColorType.h"
10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h"
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/GpuTypes.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrBackendSurface.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrContextOptions.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrDirectContext.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrTypes.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/mock/GrMockTypes.h"
18*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/SkColorData.h"
19*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/gpu/ganesh/GrTypesPriv.h"
20*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/Blend.h"
21*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/Swizzle.h"
22*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrCaps.h"
23*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrColor.h"
24*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrDirectContextPriv.h"
25*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrDstProxyView.h"
26*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrGpu.h"
27*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrPaint.h"
28*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrProcessorAnalysis.h"
29*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrProcessorSet.h"
30*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrProxyProvider.h"
31*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrShaderCaps.h"
32*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrSurfaceProxy.h"
33*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrUserStencilSettings.h"
34*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrXferProcessor.h"
35*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/effects/GrPorterDuffXferProcessor.h"
36*c8dee2aaSAndroid Build Coastguard Worker #include "tests/CtsEnforcement.h"
37*c8dee2aaSAndroid Build Coastguard Worker #include "tests/Test.h"
38*c8dee2aaSAndroid Build Coastguard Worker #include "tools/gpu/ContextType.h"
39*c8dee2aaSAndroid Build Coastguard Worker #include "tools/gpu/ManagedBackendTexture.h"
40*c8dee2aaSAndroid Build Coastguard Worker
41*c8dee2aaSAndroid Build Coastguard Worker #include <initializer_list>
42*c8dee2aaSAndroid Build Coastguard Worker #include <utility>
43*c8dee2aaSAndroid Build Coastguard Worker
44*c8dee2aaSAndroid Build Coastguard Worker class GrTextureProxy;
45*c8dee2aaSAndroid Build Coastguard Worker
46*c8dee2aaSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
47*c8dee2aaSAndroid Build Coastguard Worker
48*c8dee2aaSAndroid Build Coastguard Worker static void test_color_unknown_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps);
49*c8dee2aaSAndroid Build Coastguard Worker static void test_color_not_opaque_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps);
50*c8dee2aaSAndroid Build Coastguard Worker static void test_color_opaque_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps);
51*c8dee2aaSAndroid Build Coastguard Worker static void test_color_opaque_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps);
52*c8dee2aaSAndroid Build Coastguard Worker static void test_lcd_coverage(skiatest::Reporter* reporter, const GrCaps& caps);
53*c8dee2aaSAndroid Build Coastguard Worker static void test_lcd_coverage_fallback_case(skiatest::Reporter* reporter, const GrCaps& caps);
54*c8dee2aaSAndroid Build Coastguard Worker
55*c8dee2aaSAndroid Build Coastguard Worker DEF_GANESH_TEST(GrPorterDuff, reporter, /*ctxInfo*/, CtsEnforcement::kApiLevel_T) {
56*c8dee2aaSAndroid Build Coastguard Worker GrMockOptions mockOptions;
57*c8dee2aaSAndroid Build Coastguard Worker mockOptions.fDualSourceBlendingSupport = true;
58*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrDirectContext> context = GrDirectContext::MakeMock(&mockOptions, GrContextOptions());
59*c8dee2aaSAndroid Build Coastguard Worker const GrCaps& caps = *context->priv().getGpu()->caps();
60*c8dee2aaSAndroid Build Coastguard Worker
61*c8dee2aaSAndroid Build Coastguard Worker if (!caps.shaderCaps()->fDualSourceBlendingSupport) {
62*c8dee2aaSAndroid Build Coastguard Worker SK_ABORT("Null context does not support dual source blending.");
63*c8dee2aaSAndroid Build Coastguard Worker }
64*c8dee2aaSAndroid Build Coastguard Worker
65*c8dee2aaSAndroid Build Coastguard Worker test_color_unknown_with_coverage(reporter, caps);
66*c8dee2aaSAndroid Build Coastguard Worker test_color_not_opaque_no_coverage(reporter, caps);
67*c8dee2aaSAndroid Build Coastguard Worker test_color_opaque_with_coverage(reporter, caps);
68*c8dee2aaSAndroid Build Coastguard Worker test_color_opaque_no_coverage(reporter, caps);
69*c8dee2aaSAndroid Build Coastguard Worker test_lcd_coverage(reporter, caps);
70*c8dee2aaSAndroid Build Coastguard Worker test_lcd_coverage_fallback_case(reporter, caps);
71*c8dee2aaSAndroid Build Coastguard Worker }
72*c8dee2aaSAndroid Build Coastguard Worker
73*c8dee2aaSAndroid Build Coastguard Worker ////////////////////////////////////////////////////////////////////////////////
74*c8dee2aaSAndroid Build Coastguard Worker
75*c8dee2aaSAndroid Build Coastguard Worker #define TEST_ASSERT(...) REPORTER_ASSERT(reporter, __VA_ARGS__)
76*c8dee2aaSAndroid Build Coastguard Worker
77*c8dee2aaSAndroid Build Coastguard Worker enum {
78*c8dee2aaSAndroid Build Coastguard Worker kNone_OutputType,
79*c8dee2aaSAndroid Build Coastguard Worker kCoverage_OutputType,
80*c8dee2aaSAndroid Build Coastguard Worker kModulate_OutputType,
81*c8dee2aaSAndroid Build Coastguard Worker kSAModulate_OutputType,
82*c8dee2aaSAndroid Build Coastguard Worker kISAModulate_OutputType,
83*c8dee2aaSAndroid Build Coastguard Worker kISCModulate_OutputType
84*c8dee2aaSAndroid Build Coastguard Worker };
85*c8dee2aaSAndroid Build Coastguard Worker static const int kInvalid_OutputType = -1;
86*c8dee2aaSAndroid Build Coastguard Worker
do_analysis(const GrXPFactory * xpf,const GrProcessorAnalysisColor & colorInput,GrProcessorAnalysisCoverage coverageInput,const GrCaps & caps)87*c8dee2aaSAndroid Build Coastguard Worker static GrProcessorSet::Analysis do_analysis(const GrXPFactory* xpf,
88*c8dee2aaSAndroid Build Coastguard Worker const GrProcessorAnalysisColor& colorInput,
89*c8dee2aaSAndroid Build Coastguard Worker GrProcessorAnalysisCoverage coverageInput,
90*c8dee2aaSAndroid Build Coastguard Worker const GrCaps& caps) {
91*c8dee2aaSAndroid Build Coastguard Worker GrPaint paint;
92*c8dee2aaSAndroid Build Coastguard Worker paint.setXPFactory(xpf);
93*c8dee2aaSAndroid Build Coastguard Worker GrProcessorSet procs(std::move(paint));
94*c8dee2aaSAndroid Build Coastguard Worker SkPMColor4f overrideColor;
95*c8dee2aaSAndroid Build Coastguard Worker GrProcessorSet::Analysis analysis = procs.finalize(
96*c8dee2aaSAndroid Build Coastguard Worker colorInput, coverageInput, nullptr, &GrUserStencilSettings::kUnused, caps,
97*c8dee2aaSAndroid Build Coastguard Worker GrClampType::kAuto, &overrideColor);
98*c8dee2aaSAndroid Build Coastguard Worker return analysis;
99*c8dee2aaSAndroid Build Coastguard Worker }
100*c8dee2aaSAndroid Build Coastguard Worker
101*c8dee2aaSAndroid Build Coastguard Worker class GrPorterDuffTest {
102*c8dee2aaSAndroid Build Coastguard Worker public:
103*c8dee2aaSAndroid Build Coastguard Worker struct XPInfo {
XPInfoGrPorterDuffTest::XPInfo104*c8dee2aaSAndroid Build Coastguard Worker XPInfo(skiatest::Reporter* reporter, SkBlendMode xfermode, const GrCaps& caps,
105*c8dee2aaSAndroid Build Coastguard Worker GrProcessorAnalysisColor inputColor, GrProcessorAnalysisCoverage inputCoverage) {
106*c8dee2aaSAndroid Build Coastguard Worker const GrXPFactory* xpf = GrPorterDuffXPFactory::Get(xfermode);
107*c8dee2aaSAndroid Build Coastguard Worker
108*c8dee2aaSAndroid Build Coastguard Worker bool isLCD = GrProcessorAnalysisCoverage::kLCD == inputCoverage;
109*c8dee2aaSAndroid Build Coastguard Worker
110*c8dee2aaSAndroid Build Coastguard Worker GrProcessorSet::Analysis analysis = do_analysis(xpf, inputColor, inputCoverage, caps);
111*c8dee2aaSAndroid Build Coastguard Worker fCompatibleWithCoverageAsAlpha = analysis.isCompatibleWithCoverageAsAlpha();
112*c8dee2aaSAndroid Build Coastguard Worker fUnaffectedByDstValue = analysis.unaffectedByDstValue();
113*c8dee2aaSAndroid Build Coastguard Worker fIgnoresInputColor = analysis.inputColorIsIgnored();
114*c8dee2aaSAndroid Build Coastguard Worker sk_sp<const GrXferProcessor> xp(
115*c8dee2aaSAndroid Build Coastguard Worker GrXPFactory::MakeXferProcessor(xpf, inputColor, inputCoverage, caps,
116*c8dee2aaSAndroid Build Coastguard Worker GrClampType::kAuto));
117*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!analysis.requiresDstTexture() ||
118*c8dee2aaSAndroid Build Coastguard Worker (isLCD &&
119*c8dee2aaSAndroid Build Coastguard Worker !caps.shaderCaps()->fDstReadInShaderSupport &&
120*c8dee2aaSAndroid Build Coastguard Worker (SkBlendMode::kSrcOver != xfermode ||
121*c8dee2aaSAndroid Build Coastguard Worker !inputColor.isOpaque())));
122*c8dee2aaSAndroid Build Coastguard Worker // Porter Duff modes currently only use fixed-function or shader blending, and Ganesh
123*c8dee2aaSAndroid Build Coastguard Worker // doesn't yet make use of framebuffer fetches that require a barrier
124*c8dee2aaSAndroid Build Coastguard Worker // (e.g., QCOM_shader_framebuffer_fetch_noncoherent). So dst textures and xfer barriers
125*c8dee2aaSAndroid Build Coastguard Worker // should always go hand in hand for Porter Duff modes.
126*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(analysis.requiresDstTexture() == analysis.requiresNonOverlappingDraws());
127*c8dee2aaSAndroid Build Coastguard Worker GetXPOutputTypes(xp.get(), &fPrimaryOutputType, &fSecondaryOutputType);
128*c8dee2aaSAndroid Build Coastguard Worker fBlendInfo = xp->getBlendInfo();
129*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xp->willReadDstColor() ||
130*c8dee2aaSAndroid Build Coastguard Worker (isLCD && (SkBlendMode::kSrcOver != xfermode ||
131*c8dee2aaSAndroid Build Coastguard Worker !inputColor.isOpaque())));
132*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xp->hasSecondaryOutput() ==
133*c8dee2aaSAndroid Build Coastguard Worker skgpu::BlendCoeffRefsSrc2(fBlendInfo.fDstBlend));
134*c8dee2aaSAndroid Build Coastguard Worker }
135*c8dee2aaSAndroid Build Coastguard Worker
136*c8dee2aaSAndroid Build Coastguard Worker bool fCompatibleWithCoverageAsAlpha;
137*c8dee2aaSAndroid Build Coastguard Worker bool fUnaffectedByDstValue;
138*c8dee2aaSAndroid Build Coastguard Worker bool fIgnoresInputColor;
139*c8dee2aaSAndroid Build Coastguard Worker int fPrimaryOutputType;
140*c8dee2aaSAndroid Build Coastguard Worker int fSecondaryOutputType;
141*c8dee2aaSAndroid Build Coastguard Worker skgpu::BlendInfo fBlendInfo;
142*c8dee2aaSAndroid Build Coastguard Worker };
143*c8dee2aaSAndroid Build Coastguard Worker
GetXPOutputTypes(const GrXferProcessor * xp,int * outPrimary,int * outSecondary)144*c8dee2aaSAndroid Build Coastguard Worker static void GetXPOutputTypes(const GrXferProcessor* xp, int* outPrimary, int* outSecondary) {
145*c8dee2aaSAndroid Build Coastguard Worker GrPorterDuffXPFactory::TestGetXPOutputTypes(xp, outPrimary, outSecondary);
146*c8dee2aaSAndroid Build Coastguard Worker }
147*c8dee2aaSAndroid Build Coastguard Worker };
148*c8dee2aaSAndroid Build Coastguard Worker
test_lcd_coverage(skiatest::Reporter * reporter,const GrCaps & caps)149*c8dee2aaSAndroid Build Coastguard Worker static void test_lcd_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
150*c8dee2aaSAndroid Build Coastguard Worker GrProcessorAnalysisColor inputColor = GrProcessorAnalysisColor::Opaque::kYes;
151*c8dee2aaSAndroid Build Coastguard Worker GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kLCD;
152*c8dee2aaSAndroid Build Coastguard Worker
153*c8dee2aaSAndroid Build Coastguard Worker for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
154*c8dee2aaSAndroid Build Coastguard Worker SkBlendMode xfermode = static_cast<SkBlendMode>(m);
155*c8dee2aaSAndroid Build Coastguard Worker const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
156*c8dee2aaSAndroid Build Coastguard Worker switch (xfermode) {
157*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kClear:
158*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fIgnoresInputColor);
159*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
160*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fUnaffectedByDstValue);
161*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
162*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
163*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendEquation::kAdd == xpi.fBlendInfo.fEquation);
164*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kOne == xpi.fBlendInfo.fSrcBlend);
165*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kZero == xpi.fBlendInfo.fDstBlend);
166*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fBlendInfo.fWritesColor);
167*c8dee2aaSAndroid Build Coastguard Worker break;
168*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kSrc:
169*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fIgnoresInputColor);
170*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
171*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fUnaffectedByDstValue);
172*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
173*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
174*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendEquation::kAdd == xpi.fBlendInfo.fEquation);
175*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kOne == xpi.fBlendInfo.fSrcBlend);
176*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kZero == xpi.fBlendInfo.fDstBlend);
177*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fBlendInfo.fWritesColor);
178*c8dee2aaSAndroid Build Coastguard Worker break;
179*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kDst:
180*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fIgnoresInputColor);
181*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
182*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fUnaffectedByDstValue);
183*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
184*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
185*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendEquation::kAdd == xpi.fBlendInfo.fEquation);
186*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kOne == xpi.fBlendInfo.fSrcBlend);
187*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kZero == xpi.fBlendInfo.fDstBlend);
188*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fBlendInfo.fWritesColor);
189*c8dee2aaSAndroid Build Coastguard Worker break;
190*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kSrcOver:
191*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fIgnoresInputColor);
192*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
193*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fUnaffectedByDstValue);
194*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
195*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kSAModulate_OutputType == xpi.fSecondaryOutputType);
196*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendEquation::kAdd == xpi.fBlendInfo.fEquation);
197*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kOne == xpi.fBlendInfo.fSrcBlend);
198*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kIS2C == xpi.fBlendInfo.fDstBlend);
199*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fBlendInfo.fWritesColor);
200*c8dee2aaSAndroid Build Coastguard Worker break;
201*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kDstOver:
202*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fIgnoresInputColor);
203*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
204*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fUnaffectedByDstValue);
205*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
206*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
207*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendEquation::kAdd == xpi.fBlendInfo.fEquation);
208*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kOne == xpi.fBlendInfo.fSrcBlend);
209*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kZero == xpi.fBlendInfo.fDstBlend);
210*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fBlendInfo.fWritesColor);
211*c8dee2aaSAndroid Build Coastguard Worker break;
212*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kSrcIn:
213*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fIgnoresInputColor);
214*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
215*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fUnaffectedByDstValue);
216*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
217*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
218*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendEquation::kAdd == xpi.fBlendInfo.fEquation);
219*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kOne == xpi.fBlendInfo.fSrcBlend);
220*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kZero == xpi.fBlendInfo.fDstBlend);
221*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fBlendInfo.fWritesColor);
222*c8dee2aaSAndroid Build Coastguard Worker break;
223*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kDstIn:
224*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fIgnoresInputColor);
225*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
226*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fUnaffectedByDstValue);
227*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
228*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
229*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendEquation::kAdd == xpi.fBlendInfo.fEquation);
230*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kOne == xpi.fBlendInfo.fSrcBlend);
231*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kZero == xpi.fBlendInfo.fDstBlend);
232*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fBlendInfo.fWritesColor);
233*c8dee2aaSAndroid Build Coastguard Worker break;
234*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kSrcOut:
235*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fIgnoresInputColor);
236*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
237*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fUnaffectedByDstValue);
238*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
239*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
240*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendEquation::kAdd == xpi.fBlendInfo.fEquation);
241*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kOne == xpi.fBlendInfo.fSrcBlend);
242*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kZero == xpi.fBlendInfo.fDstBlend);
243*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fBlendInfo.fWritesColor);
244*c8dee2aaSAndroid Build Coastguard Worker break;
245*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kDstOut:
246*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fIgnoresInputColor);
247*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
248*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fUnaffectedByDstValue);
249*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
250*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
251*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendEquation::kAdd == xpi.fBlendInfo.fEquation);
252*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kOne == xpi.fBlendInfo.fSrcBlend);
253*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kZero == xpi.fBlendInfo.fDstBlend);
254*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fBlendInfo.fWritesColor);
255*c8dee2aaSAndroid Build Coastguard Worker break;
256*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kSrcATop:
257*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fIgnoresInputColor);
258*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
259*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fUnaffectedByDstValue);
260*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
261*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
262*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendEquation::kAdd == xpi.fBlendInfo.fEquation);
263*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kOne == xpi.fBlendInfo.fSrcBlend);
264*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kZero == xpi.fBlendInfo.fDstBlend);
265*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fBlendInfo.fWritesColor);
266*c8dee2aaSAndroid Build Coastguard Worker break;
267*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kDstATop:
268*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fIgnoresInputColor);
269*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
270*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fUnaffectedByDstValue);
271*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
272*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
273*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendEquation::kAdd == xpi.fBlendInfo.fEquation);
274*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kOne == xpi.fBlendInfo.fSrcBlend);
275*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kZero == xpi.fBlendInfo.fDstBlend);
276*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fBlendInfo.fWritesColor);
277*c8dee2aaSAndroid Build Coastguard Worker break;
278*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kXor:
279*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fIgnoresInputColor);
280*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
281*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fUnaffectedByDstValue);
282*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
283*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
284*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendEquation::kAdd == xpi.fBlendInfo.fEquation);
285*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kOne == xpi.fBlendInfo.fSrcBlend);
286*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kZero == xpi.fBlendInfo.fDstBlend);
287*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fBlendInfo.fWritesColor);
288*c8dee2aaSAndroid Build Coastguard Worker break;
289*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kPlus:
290*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fIgnoresInputColor);
291*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
292*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fUnaffectedByDstValue);
293*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
294*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
295*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendEquation::kAdd == xpi.fBlendInfo.fEquation);
296*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kOne == xpi.fBlendInfo.fSrcBlend);
297*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kZero == xpi.fBlendInfo.fDstBlend);
298*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fBlendInfo.fWritesColor);
299*c8dee2aaSAndroid Build Coastguard Worker break;
300*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kModulate:
301*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fIgnoresInputColor);
302*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
303*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fUnaffectedByDstValue);
304*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
305*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
306*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendEquation::kAdd == xpi.fBlendInfo.fEquation);
307*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kOne == xpi.fBlendInfo.fSrcBlend);
308*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kZero == xpi.fBlendInfo.fDstBlend);
309*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fBlendInfo.fWritesColor);
310*c8dee2aaSAndroid Build Coastguard Worker break;
311*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kScreen:
312*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fIgnoresInputColor);
313*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
314*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fUnaffectedByDstValue);
315*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
316*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
317*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendEquation::kAdd == xpi.fBlendInfo.fEquation);
318*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kOne == xpi.fBlendInfo.fSrcBlend);
319*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kZero == xpi.fBlendInfo.fDstBlend);
320*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fBlendInfo.fWritesColor);
321*c8dee2aaSAndroid Build Coastguard Worker break;
322*c8dee2aaSAndroid Build Coastguard Worker default:
323*c8dee2aaSAndroid Build Coastguard Worker ERRORF(reporter, "Invalid xfermode.");
324*c8dee2aaSAndroid Build Coastguard Worker break;
325*c8dee2aaSAndroid Build Coastguard Worker }
326*c8dee2aaSAndroid Build Coastguard Worker }
327*c8dee2aaSAndroid Build Coastguard Worker }
test_color_unknown_with_coverage(skiatest::Reporter * reporter,const GrCaps & caps)328*c8dee2aaSAndroid Build Coastguard Worker static void test_color_unknown_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
329*c8dee2aaSAndroid Build Coastguard Worker GrProcessorAnalysisColor inputColor = GrProcessorAnalysisColor::Opaque::kNo;
330*c8dee2aaSAndroid Build Coastguard Worker GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kSingleChannel;
331*c8dee2aaSAndroid Build Coastguard Worker
332*c8dee2aaSAndroid Build Coastguard Worker for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
333*c8dee2aaSAndroid Build Coastguard Worker SkBlendMode xfermode = static_cast<SkBlendMode>(m);
334*c8dee2aaSAndroid Build Coastguard Worker const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
335*c8dee2aaSAndroid Build Coastguard Worker switch (xfermode) {
336*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kClear:
337*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fIgnoresInputColor);
338*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
339*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fUnaffectedByDstValue);
340*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
341*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
342*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendEquation::kReverseSubtract == xpi.fBlendInfo.fEquation);
343*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kDC == xpi.fBlendInfo.fSrcBlend);
344*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kOne == xpi.fBlendInfo.fDstBlend);
345*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fBlendInfo.fWritesColor);
346*c8dee2aaSAndroid Build Coastguard Worker break;
347*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kSrc:
348*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fIgnoresInputColor);
349*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
350*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fUnaffectedByDstValue);
351*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
352*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
353*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendEquation::kAdd == xpi.fBlendInfo.fEquation);
354*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kOne == xpi.fBlendInfo.fSrcBlend);
355*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kIS2A == xpi.fBlendInfo.fDstBlend);
356*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fBlendInfo.fWritesColor);
357*c8dee2aaSAndroid Build Coastguard Worker break;
358*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kDst:
359*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fIgnoresInputColor);
360*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
361*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fUnaffectedByDstValue);
362*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
363*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
364*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendEquation::kAdd == xpi.fBlendInfo.fEquation);
365*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kZero == xpi.fBlendInfo.fSrcBlend);
366*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kOne == xpi.fBlendInfo.fDstBlend);
367*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fBlendInfo.fWritesColor);
368*c8dee2aaSAndroid Build Coastguard Worker break;
369*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kSrcOver:
370*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fIgnoresInputColor);
371*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
372*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fUnaffectedByDstValue);
373*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
374*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
375*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendEquation::kAdd == xpi.fBlendInfo.fEquation);
376*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kOne == xpi.fBlendInfo.fSrcBlend);
377*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kISA == xpi.fBlendInfo.fDstBlend);
378*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fBlendInfo.fWritesColor);
379*c8dee2aaSAndroid Build Coastguard Worker break;
380*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kDstOver:
381*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fIgnoresInputColor);
382*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
383*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fUnaffectedByDstValue);
384*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
385*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
386*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendEquation::kAdd == xpi.fBlendInfo.fEquation);
387*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kIDA == xpi.fBlendInfo.fSrcBlend);
388*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kOne == xpi.fBlendInfo.fDstBlend);
389*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fBlendInfo.fWritesColor);
390*c8dee2aaSAndroid Build Coastguard Worker break;
391*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kSrcIn:
392*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fIgnoresInputColor);
393*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
394*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fUnaffectedByDstValue);
395*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
396*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
397*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendEquation::kAdd == xpi.fBlendInfo.fEquation);
398*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kDA == xpi.fBlendInfo.fSrcBlend);
399*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kIS2A == xpi.fBlendInfo.fDstBlend);
400*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fBlendInfo.fWritesColor);
401*c8dee2aaSAndroid Build Coastguard Worker break;
402*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kDstIn:
403*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fIgnoresInputColor);
404*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
405*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fUnaffectedByDstValue);
406*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kISAModulate_OutputType == xpi.fPrimaryOutputType);
407*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
408*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendEquation::kReverseSubtract == xpi.fBlendInfo.fEquation);
409*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kDC == xpi.fBlendInfo.fSrcBlend);
410*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kOne == xpi.fBlendInfo.fDstBlend);
411*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fBlendInfo.fWritesColor);
412*c8dee2aaSAndroid Build Coastguard Worker break;
413*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kSrcOut:
414*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fIgnoresInputColor);
415*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
416*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fUnaffectedByDstValue);
417*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
418*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
419*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendEquation::kAdd == xpi.fBlendInfo.fEquation);
420*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kIDA == xpi.fBlendInfo.fSrcBlend);
421*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kIS2A == xpi.fBlendInfo.fDstBlend);
422*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fBlendInfo.fWritesColor);
423*c8dee2aaSAndroid Build Coastguard Worker break;
424*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kDstOut:
425*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fIgnoresInputColor);
426*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
427*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fUnaffectedByDstValue);
428*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
429*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
430*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendEquation::kAdd == xpi.fBlendInfo.fEquation);
431*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kZero == xpi.fBlendInfo.fSrcBlend);
432*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kISA == xpi.fBlendInfo.fDstBlend);
433*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fBlendInfo.fWritesColor);
434*c8dee2aaSAndroid Build Coastguard Worker break;
435*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kSrcATop:
436*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fIgnoresInputColor);
437*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
438*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fUnaffectedByDstValue);
439*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
440*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
441*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendEquation::kAdd == xpi.fBlendInfo.fEquation);
442*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kDA == xpi.fBlendInfo.fSrcBlend);
443*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kISA == xpi.fBlendInfo.fDstBlend);
444*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fBlendInfo.fWritesColor);
445*c8dee2aaSAndroid Build Coastguard Worker break;
446*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kDstATop:
447*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fIgnoresInputColor);
448*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
449*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fUnaffectedByDstValue);
450*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
451*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kISAModulate_OutputType == xpi.fSecondaryOutputType);
452*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendEquation::kAdd == xpi.fBlendInfo.fEquation);
453*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kIDA == xpi.fBlendInfo.fSrcBlend);
454*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kIS2C == xpi.fBlendInfo.fDstBlend);
455*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fBlendInfo.fWritesColor);
456*c8dee2aaSAndroid Build Coastguard Worker break;
457*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kXor:
458*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fIgnoresInputColor);
459*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
460*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fUnaffectedByDstValue);
461*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
462*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
463*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendEquation::kAdd == xpi.fBlendInfo.fEquation);
464*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kIDA == xpi.fBlendInfo.fSrcBlend);
465*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kISA == xpi.fBlendInfo.fDstBlend);
466*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fBlendInfo.fWritesColor);
467*c8dee2aaSAndroid Build Coastguard Worker break;
468*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kPlus:
469*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fIgnoresInputColor);
470*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
471*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fUnaffectedByDstValue);
472*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
473*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
474*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendEquation::kAdd == xpi.fBlendInfo.fEquation);
475*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kOne == xpi.fBlendInfo.fSrcBlend);
476*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kOne == xpi.fBlendInfo.fDstBlend);
477*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fBlendInfo.fWritesColor);
478*c8dee2aaSAndroid Build Coastguard Worker break;
479*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kModulate:
480*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fIgnoresInputColor);
481*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
482*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fUnaffectedByDstValue);
483*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType);
484*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
485*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendEquation::kReverseSubtract == xpi.fBlendInfo.fEquation);
486*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kDC == xpi.fBlendInfo.fSrcBlend);
487*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kOne == xpi.fBlendInfo.fDstBlend);
488*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fBlendInfo.fWritesColor);
489*c8dee2aaSAndroid Build Coastguard Worker break;
490*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kScreen:
491*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fIgnoresInputColor);
492*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
493*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fUnaffectedByDstValue);
494*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
495*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
496*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendEquation::kAdd == xpi.fBlendInfo.fEquation);
497*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kOne == xpi.fBlendInfo.fSrcBlend);
498*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kISC == xpi.fBlendInfo.fDstBlend);
499*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fBlendInfo.fWritesColor);
500*c8dee2aaSAndroid Build Coastguard Worker break;
501*c8dee2aaSAndroid Build Coastguard Worker default:
502*c8dee2aaSAndroid Build Coastguard Worker ERRORF(reporter, "Invalid xfermode.");
503*c8dee2aaSAndroid Build Coastguard Worker break;
504*c8dee2aaSAndroid Build Coastguard Worker }
505*c8dee2aaSAndroid Build Coastguard Worker }
506*c8dee2aaSAndroid Build Coastguard Worker }
507*c8dee2aaSAndroid Build Coastguard Worker
test_color_not_opaque_no_coverage(skiatest::Reporter * reporter,const GrCaps & caps)508*c8dee2aaSAndroid Build Coastguard Worker static void test_color_not_opaque_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
509*c8dee2aaSAndroid Build Coastguard Worker GrProcessorAnalysisColor inputColor(
510*c8dee2aaSAndroid Build Coastguard Worker SkPMColor4f::FromBytes_RGBA(GrColorPackRGBA(229, 0, 154, 240)));
511*c8dee2aaSAndroid Build Coastguard Worker GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kNone;
512*c8dee2aaSAndroid Build Coastguard Worker
513*c8dee2aaSAndroid Build Coastguard Worker for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
514*c8dee2aaSAndroid Build Coastguard Worker SkBlendMode xfermode = static_cast<SkBlendMode>(m);
515*c8dee2aaSAndroid Build Coastguard Worker const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
516*c8dee2aaSAndroid Build Coastguard Worker switch (xfermode) {
517*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kClear:
518*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fIgnoresInputColor);
519*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
520*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fUnaffectedByDstValue);
521*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
522*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
523*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendEquation::kAdd == xpi.fBlendInfo.fEquation);
524*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kZero == xpi.fBlendInfo.fSrcBlend);
525*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kZero == xpi.fBlendInfo.fDstBlend);
526*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fBlendInfo.fWritesColor);
527*c8dee2aaSAndroid Build Coastguard Worker break;
528*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kSrc:
529*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fIgnoresInputColor);
530*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
531*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fUnaffectedByDstValue);
532*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
533*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
534*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendEquation::kAdd == xpi.fBlendInfo.fEquation);
535*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kOne == xpi.fBlendInfo.fSrcBlend);
536*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kZero == xpi.fBlendInfo.fDstBlend);
537*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fBlendInfo.fWritesColor);
538*c8dee2aaSAndroid Build Coastguard Worker break;
539*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kDst:
540*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fIgnoresInputColor);
541*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
542*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fUnaffectedByDstValue);
543*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
544*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
545*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendEquation::kAdd == xpi.fBlendInfo.fEquation);
546*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kZero == xpi.fBlendInfo.fSrcBlend);
547*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kOne == xpi.fBlendInfo.fDstBlend);
548*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fBlendInfo.fWritesColor);
549*c8dee2aaSAndroid Build Coastguard Worker break;
550*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kSrcOver:
551*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fIgnoresInputColor);
552*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
553*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fUnaffectedByDstValue);
554*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
555*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
556*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendEquation::kAdd == xpi.fBlendInfo.fEquation);
557*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kOne == xpi.fBlendInfo.fSrcBlend);
558*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kISA == xpi.fBlendInfo.fDstBlend);
559*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fBlendInfo.fWritesColor);
560*c8dee2aaSAndroid Build Coastguard Worker break;
561*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kDstOver:
562*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fIgnoresInputColor);
563*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
564*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fUnaffectedByDstValue);
565*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
566*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
567*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendEquation::kAdd == xpi.fBlendInfo.fEquation);
568*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kIDA == xpi.fBlendInfo.fSrcBlend);
569*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kOne == xpi.fBlendInfo.fDstBlend);
570*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fBlendInfo.fWritesColor);
571*c8dee2aaSAndroid Build Coastguard Worker break;
572*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kSrcIn:
573*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fIgnoresInputColor);
574*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
575*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fUnaffectedByDstValue);
576*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
577*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
578*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendEquation::kAdd == xpi.fBlendInfo.fEquation);
579*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kDA == xpi.fBlendInfo.fSrcBlend);
580*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kZero == xpi.fBlendInfo.fDstBlend);
581*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fBlendInfo.fWritesColor);
582*c8dee2aaSAndroid Build Coastguard Worker break;
583*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kDstIn:
584*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fIgnoresInputColor);
585*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
586*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fUnaffectedByDstValue);
587*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
588*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
589*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendEquation::kAdd == xpi.fBlendInfo.fEquation);
590*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kZero == xpi.fBlendInfo.fSrcBlend);
591*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kSA == xpi.fBlendInfo.fDstBlend);
592*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fBlendInfo.fWritesColor);
593*c8dee2aaSAndroid Build Coastguard Worker break;
594*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kSrcOut:
595*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fIgnoresInputColor);
596*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
597*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fUnaffectedByDstValue);
598*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
599*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
600*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendEquation::kAdd == xpi.fBlendInfo.fEquation);
601*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kIDA == xpi.fBlendInfo.fSrcBlend);
602*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kZero == xpi.fBlendInfo.fDstBlend);
603*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fBlendInfo.fWritesColor);
604*c8dee2aaSAndroid Build Coastguard Worker break;
605*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kDstOut:
606*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fIgnoresInputColor);
607*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
608*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fUnaffectedByDstValue);
609*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
610*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
611*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendEquation::kAdd == xpi.fBlendInfo.fEquation);
612*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kZero == xpi.fBlendInfo.fSrcBlend);
613*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kISA == xpi.fBlendInfo.fDstBlend);
614*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fBlendInfo.fWritesColor);
615*c8dee2aaSAndroid Build Coastguard Worker break;
616*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kSrcATop:
617*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fIgnoresInputColor);
618*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
619*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fUnaffectedByDstValue);
620*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
621*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
622*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendEquation::kAdd == xpi.fBlendInfo.fEquation);
623*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kDA == xpi.fBlendInfo.fSrcBlend);
624*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kISA == xpi.fBlendInfo.fDstBlend);
625*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fBlendInfo.fWritesColor);
626*c8dee2aaSAndroid Build Coastguard Worker break;
627*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kDstATop:
628*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fIgnoresInputColor);
629*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
630*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fUnaffectedByDstValue);
631*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
632*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
633*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendEquation::kAdd == xpi.fBlendInfo.fEquation);
634*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kIDA == xpi.fBlendInfo.fSrcBlend);
635*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kSA == xpi.fBlendInfo.fDstBlend);
636*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fBlendInfo.fWritesColor);
637*c8dee2aaSAndroid Build Coastguard Worker break;
638*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kXor:
639*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fIgnoresInputColor);
640*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
641*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fUnaffectedByDstValue);
642*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
643*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
644*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendEquation::kAdd == xpi.fBlendInfo.fEquation);
645*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kIDA == xpi.fBlendInfo.fSrcBlend);
646*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kISA == xpi.fBlendInfo.fDstBlend);
647*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fBlendInfo.fWritesColor);
648*c8dee2aaSAndroid Build Coastguard Worker break;
649*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kPlus:
650*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fIgnoresInputColor);
651*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
652*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fUnaffectedByDstValue);
653*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
654*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
655*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendEquation::kAdd == xpi.fBlendInfo.fEquation);
656*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kOne == xpi.fBlendInfo.fSrcBlend);
657*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kOne == xpi.fBlendInfo.fDstBlend);
658*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fBlendInfo.fWritesColor);
659*c8dee2aaSAndroid Build Coastguard Worker break;
660*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kModulate:
661*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fIgnoresInputColor);
662*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
663*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fUnaffectedByDstValue);
664*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
665*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
666*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendEquation::kAdd == xpi.fBlendInfo.fEquation);
667*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kZero == xpi.fBlendInfo.fSrcBlend);
668*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kSC == xpi.fBlendInfo.fDstBlend);
669*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fBlendInfo.fWritesColor);
670*c8dee2aaSAndroid Build Coastguard Worker break;
671*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kScreen:
672*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fIgnoresInputColor);
673*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
674*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fUnaffectedByDstValue);
675*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
676*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
677*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendEquation::kAdd == xpi.fBlendInfo.fEquation);
678*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kOne == xpi.fBlendInfo.fSrcBlend);
679*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kISC == xpi.fBlendInfo.fDstBlend);
680*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fBlendInfo.fWritesColor);
681*c8dee2aaSAndroid Build Coastguard Worker break;
682*c8dee2aaSAndroid Build Coastguard Worker default:
683*c8dee2aaSAndroid Build Coastguard Worker ERRORF(reporter, "Invalid xfermode.");
684*c8dee2aaSAndroid Build Coastguard Worker break;
685*c8dee2aaSAndroid Build Coastguard Worker }
686*c8dee2aaSAndroid Build Coastguard Worker }
687*c8dee2aaSAndroid Build Coastguard Worker }
688*c8dee2aaSAndroid Build Coastguard Worker
test_color_opaque_with_coverage(skiatest::Reporter * reporter,const GrCaps & caps)689*c8dee2aaSAndroid Build Coastguard Worker static void test_color_opaque_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
690*c8dee2aaSAndroid Build Coastguard Worker GrProcessorAnalysisColor inputColor = GrProcessorAnalysisColor::Opaque::kYes;
691*c8dee2aaSAndroid Build Coastguard Worker GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kSingleChannel;
692*c8dee2aaSAndroid Build Coastguard Worker
693*c8dee2aaSAndroid Build Coastguard Worker for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
694*c8dee2aaSAndroid Build Coastguard Worker SkBlendMode xfermode = static_cast<SkBlendMode>(m);
695*c8dee2aaSAndroid Build Coastguard Worker const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
696*c8dee2aaSAndroid Build Coastguard Worker switch (xfermode) {
697*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kClear:
698*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fIgnoresInputColor);
699*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
700*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fUnaffectedByDstValue);
701*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
702*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
703*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendEquation::kReverseSubtract == xpi.fBlendInfo.fEquation);
704*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kDC == xpi.fBlendInfo.fSrcBlend);
705*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kOne == xpi.fBlendInfo.fDstBlend);
706*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fBlendInfo.fWritesColor);
707*c8dee2aaSAndroid Build Coastguard Worker break;
708*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kSrc:
709*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fIgnoresInputColor);
710*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
711*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fUnaffectedByDstValue);
712*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
713*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
714*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendEquation::kAdd == xpi.fBlendInfo.fEquation);
715*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kOne == xpi.fBlendInfo.fSrcBlend);
716*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kISA == xpi.fBlendInfo.fDstBlend);
717*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fBlendInfo.fWritesColor);
718*c8dee2aaSAndroid Build Coastguard Worker break;
719*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kDst:
720*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fIgnoresInputColor);
721*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
722*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fUnaffectedByDstValue);
723*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
724*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
725*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendEquation::kAdd == xpi.fBlendInfo.fEquation);
726*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kZero == xpi.fBlendInfo.fSrcBlend);
727*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kOne == xpi.fBlendInfo.fDstBlend);
728*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fBlendInfo.fWritesColor);
729*c8dee2aaSAndroid Build Coastguard Worker break;
730*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kSrcOver:
731*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fIgnoresInputColor);
732*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
733*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fUnaffectedByDstValue);
734*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
735*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
736*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendEquation::kAdd == xpi.fBlendInfo.fEquation);
737*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kOne == xpi.fBlendInfo.fSrcBlend);
738*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kISA == xpi.fBlendInfo.fDstBlend);
739*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fBlendInfo.fWritesColor);
740*c8dee2aaSAndroid Build Coastguard Worker break;
741*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kDstOver:
742*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fIgnoresInputColor);
743*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
744*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fUnaffectedByDstValue);
745*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
746*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
747*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendEquation::kAdd == xpi.fBlendInfo.fEquation);
748*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kIDA == xpi.fBlendInfo.fSrcBlend);
749*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kOne == xpi.fBlendInfo.fDstBlend);
750*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fBlendInfo.fWritesColor);
751*c8dee2aaSAndroid Build Coastguard Worker break;
752*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kSrcIn:
753*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fIgnoresInputColor);
754*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
755*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fUnaffectedByDstValue);
756*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
757*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
758*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendEquation::kAdd == xpi.fBlendInfo.fEquation);
759*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kDA == xpi.fBlendInfo.fSrcBlend);
760*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kISA == xpi.fBlendInfo.fDstBlend);
761*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fBlendInfo.fWritesColor);
762*c8dee2aaSAndroid Build Coastguard Worker break;
763*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kDstIn:
764*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fIgnoresInputColor);
765*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
766*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fUnaffectedByDstValue);
767*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
768*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
769*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendEquation::kAdd == xpi.fBlendInfo.fEquation);
770*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kZero == xpi.fBlendInfo.fSrcBlend);
771*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kOne == xpi.fBlendInfo.fDstBlend);
772*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fBlendInfo.fWritesColor);
773*c8dee2aaSAndroid Build Coastguard Worker break;
774*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kSrcOut:
775*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fIgnoresInputColor);
776*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
777*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fUnaffectedByDstValue);
778*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
779*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
780*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendEquation::kAdd == xpi.fBlendInfo.fEquation);
781*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kIDA == xpi.fBlendInfo.fSrcBlend);
782*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kISA == xpi.fBlendInfo.fDstBlend);
783*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fBlendInfo.fWritesColor);
784*c8dee2aaSAndroid Build Coastguard Worker break;
785*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kDstOut:
786*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fIgnoresInputColor);
787*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
788*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fUnaffectedByDstValue);
789*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
790*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
791*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendEquation::kReverseSubtract == xpi.fBlendInfo.fEquation);
792*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kDC == xpi.fBlendInfo.fSrcBlend);
793*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kOne == xpi.fBlendInfo.fDstBlend);
794*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fBlendInfo.fWritesColor);
795*c8dee2aaSAndroid Build Coastguard Worker break;
796*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kSrcATop:
797*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fIgnoresInputColor);
798*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
799*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fUnaffectedByDstValue);
800*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
801*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
802*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendEquation::kAdd == xpi.fBlendInfo.fEquation);
803*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kDA == xpi.fBlendInfo.fSrcBlend);
804*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kISA == xpi.fBlendInfo.fDstBlend);
805*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fBlendInfo.fWritesColor);
806*c8dee2aaSAndroid Build Coastguard Worker break;
807*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kDstATop:
808*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fIgnoresInputColor);
809*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
810*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fUnaffectedByDstValue);
811*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
812*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
813*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendEquation::kAdd == xpi.fBlendInfo.fEquation);
814*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kIDA == xpi.fBlendInfo.fSrcBlend);
815*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kOne == xpi.fBlendInfo.fDstBlend);
816*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fBlendInfo.fWritesColor);
817*c8dee2aaSAndroid Build Coastguard Worker break;
818*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kXor:
819*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fIgnoresInputColor);
820*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
821*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fUnaffectedByDstValue);
822*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
823*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
824*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendEquation::kAdd == xpi.fBlendInfo.fEquation);
825*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kIDA == xpi.fBlendInfo.fSrcBlend);
826*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kISA == xpi.fBlendInfo.fDstBlend);
827*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fBlendInfo.fWritesColor);
828*c8dee2aaSAndroid Build Coastguard Worker break;
829*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kPlus:
830*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fIgnoresInputColor);
831*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
832*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fUnaffectedByDstValue);
833*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
834*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
835*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendEquation::kAdd == xpi.fBlendInfo.fEquation);
836*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kOne == xpi.fBlendInfo.fSrcBlend);
837*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kOne == xpi.fBlendInfo.fDstBlend);
838*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fBlendInfo.fWritesColor);
839*c8dee2aaSAndroid Build Coastguard Worker break;
840*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kModulate:
841*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fIgnoresInputColor);
842*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType);
843*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
844*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendEquation::kReverseSubtract == xpi.fBlendInfo.fEquation);
845*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kDC == xpi.fBlendInfo.fSrcBlend);
846*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kOne == xpi.fBlendInfo.fDstBlend);
847*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fBlendInfo.fWritesColor);
848*c8dee2aaSAndroid Build Coastguard Worker break;
849*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kScreen:
850*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fIgnoresInputColor);
851*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
852*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fUnaffectedByDstValue);
853*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
854*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
855*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendEquation::kAdd == xpi.fBlendInfo.fEquation);
856*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kOne == xpi.fBlendInfo.fSrcBlend);
857*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kISC == xpi.fBlendInfo.fDstBlend);
858*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fBlendInfo.fWritesColor);
859*c8dee2aaSAndroid Build Coastguard Worker break;
860*c8dee2aaSAndroid Build Coastguard Worker default:
861*c8dee2aaSAndroid Build Coastguard Worker ERRORF(reporter, "Invalid xfermode.");
862*c8dee2aaSAndroid Build Coastguard Worker break;
863*c8dee2aaSAndroid Build Coastguard Worker }
864*c8dee2aaSAndroid Build Coastguard Worker }
865*c8dee2aaSAndroid Build Coastguard Worker }
866*c8dee2aaSAndroid Build Coastguard Worker
test_color_opaque_no_coverage(skiatest::Reporter * reporter,const GrCaps & caps)867*c8dee2aaSAndroid Build Coastguard Worker static void test_color_opaque_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
868*c8dee2aaSAndroid Build Coastguard Worker GrProcessorAnalysisColor inputColor = GrProcessorAnalysisColor::Opaque::kYes;
869*c8dee2aaSAndroid Build Coastguard Worker GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kNone;
870*c8dee2aaSAndroid Build Coastguard Worker
871*c8dee2aaSAndroid Build Coastguard Worker for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
872*c8dee2aaSAndroid Build Coastguard Worker SkBlendMode xfermode = static_cast<SkBlendMode>(m);
873*c8dee2aaSAndroid Build Coastguard Worker const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
874*c8dee2aaSAndroid Build Coastguard Worker
875*c8dee2aaSAndroid Build Coastguard Worker switch (xfermode) {
876*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kClear:
877*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fIgnoresInputColor);
878*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
879*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fUnaffectedByDstValue);
880*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
881*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
882*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendEquation::kAdd == xpi.fBlendInfo.fEquation);
883*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kZero == xpi.fBlendInfo.fSrcBlend);
884*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kZero == xpi.fBlendInfo.fDstBlend);
885*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fBlendInfo.fWritesColor);
886*c8dee2aaSAndroid Build Coastguard Worker break;
887*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kSrc:
888*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fIgnoresInputColor);
889*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
890*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fUnaffectedByDstValue);
891*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
892*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
893*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendEquation::kAdd == xpi.fBlendInfo.fEquation);
894*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kOne == xpi.fBlendInfo.fSrcBlend);
895*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kZero == xpi.fBlendInfo.fDstBlend);
896*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fBlendInfo.fWritesColor);
897*c8dee2aaSAndroid Build Coastguard Worker break;
898*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kDst:
899*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fIgnoresInputColor);
900*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
901*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fUnaffectedByDstValue);
902*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
903*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
904*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendEquation::kAdd == xpi.fBlendInfo.fEquation);
905*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kZero == xpi.fBlendInfo.fSrcBlend);
906*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kOne == xpi.fBlendInfo.fDstBlend);
907*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fBlendInfo.fWritesColor);
908*c8dee2aaSAndroid Build Coastguard Worker break;
909*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kSrcOver:
910*c8dee2aaSAndroid Build Coastguard Worker // We don't specialize opaque src-over. See note in GrPorterDuffXferProcessor.cpp
911*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fIgnoresInputColor);
912*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
913*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fUnaffectedByDstValue);
914*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
915*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
916*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendEquation::kAdd == xpi.fBlendInfo.fEquation);
917*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kOne == xpi.fBlendInfo.fSrcBlend);
918*c8dee2aaSAndroid Build Coastguard Worker if (caps.shouldCollapseSrcOverToSrcWhenAble()) {
919*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kZero == xpi.fBlendInfo.fDstBlend);
920*c8dee2aaSAndroid Build Coastguard Worker } else {
921*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kISA == xpi.fBlendInfo.fDstBlend);
922*c8dee2aaSAndroid Build Coastguard Worker }
923*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fBlendInfo.fWritesColor);
924*c8dee2aaSAndroid Build Coastguard Worker break;
925*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kDstOver:
926*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fIgnoresInputColor);
927*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
928*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fUnaffectedByDstValue);
929*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
930*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
931*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendEquation::kAdd == xpi.fBlendInfo.fEquation);
932*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kIDA == xpi.fBlendInfo.fSrcBlend);
933*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kOne == xpi.fBlendInfo.fDstBlend);
934*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fBlendInfo.fWritesColor);
935*c8dee2aaSAndroid Build Coastguard Worker break;
936*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kSrcIn:
937*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fIgnoresInputColor);
938*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
939*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fUnaffectedByDstValue);
940*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
941*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
942*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendEquation::kAdd == xpi.fBlendInfo.fEquation);
943*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kDA == xpi.fBlendInfo.fSrcBlend);
944*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kZero == xpi.fBlendInfo.fDstBlend);
945*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fBlendInfo.fWritesColor);
946*c8dee2aaSAndroid Build Coastguard Worker break;
947*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kDstIn:
948*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fIgnoresInputColor);
949*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
950*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fUnaffectedByDstValue);
951*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
952*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
953*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendEquation::kAdd == xpi.fBlendInfo.fEquation);
954*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kZero == xpi.fBlendInfo.fSrcBlend);
955*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kOne == xpi.fBlendInfo.fDstBlend);
956*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fBlendInfo.fWritesColor);
957*c8dee2aaSAndroid Build Coastguard Worker break;
958*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kSrcOut:
959*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fIgnoresInputColor);
960*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
961*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fUnaffectedByDstValue);
962*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
963*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
964*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendEquation::kAdd == xpi.fBlendInfo.fEquation);
965*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kIDA == xpi.fBlendInfo.fSrcBlend);
966*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kZero == xpi.fBlendInfo.fDstBlend);
967*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fBlendInfo.fWritesColor);
968*c8dee2aaSAndroid Build Coastguard Worker break;
969*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kDstOut:
970*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fIgnoresInputColor);
971*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
972*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fUnaffectedByDstValue);
973*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
974*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
975*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendEquation::kAdd == xpi.fBlendInfo.fEquation);
976*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kZero == xpi.fBlendInfo.fSrcBlend);
977*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kZero == xpi.fBlendInfo.fDstBlend);
978*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fBlendInfo.fWritesColor);
979*c8dee2aaSAndroid Build Coastguard Worker break;
980*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kSrcATop:
981*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fIgnoresInputColor);
982*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
983*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fUnaffectedByDstValue);
984*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
985*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
986*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendEquation::kAdd == xpi.fBlendInfo.fEquation);
987*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kDA == xpi.fBlendInfo.fSrcBlend);
988*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kZero == xpi.fBlendInfo.fDstBlend);
989*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fBlendInfo.fWritesColor);
990*c8dee2aaSAndroid Build Coastguard Worker break;
991*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kDstATop:
992*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fIgnoresInputColor);
993*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
994*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fUnaffectedByDstValue);
995*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
996*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
997*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendEquation::kAdd == xpi.fBlendInfo.fEquation);
998*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kIDA == xpi.fBlendInfo.fSrcBlend);
999*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kOne == xpi.fBlendInfo.fDstBlend);
1000*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fBlendInfo.fWritesColor);
1001*c8dee2aaSAndroid Build Coastguard Worker break;
1002*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kXor:
1003*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fIgnoresInputColor);
1004*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
1005*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fUnaffectedByDstValue);
1006*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
1007*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
1008*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendEquation::kAdd == xpi.fBlendInfo.fEquation);
1009*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kIDA == xpi.fBlendInfo.fSrcBlend);
1010*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kZero == xpi.fBlendInfo.fDstBlend);
1011*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fBlendInfo.fWritesColor);
1012*c8dee2aaSAndroid Build Coastguard Worker break;
1013*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kPlus:
1014*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fIgnoresInputColor);
1015*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
1016*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fUnaffectedByDstValue);
1017*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
1018*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
1019*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendEquation::kAdd == xpi.fBlendInfo.fEquation);
1020*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kOne == xpi.fBlendInfo.fSrcBlend);
1021*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kOne == xpi.fBlendInfo.fDstBlend);
1022*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fBlendInfo.fWritesColor);
1023*c8dee2aaSAndroid Build Coastguard Worker break;
1024*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kModulate:
1025*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fIgnoresInputColor);
1026*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
1027*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fUnaffectedByDstValue);
1028*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
1029*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
1030*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendEquation::kAdd == xpi.fBlendInfo.fEquation);
1031*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kZero == xpi.fBlendInfo.fSrcBlend);
1032*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kSC == xpi.fBlendInfo.fDstBlend);
1033*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fBlendInfo.fWritesColor);
1034*c8dee2aaSAndroid Build Coastguard Worker break;
1035*c8dee2aaSAndroid Build Coastguard Worker case SkBlendMode::kScreen:
1036*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fIgnoresInputColor);
1037*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
1038*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xpi.fUnaffectedByDstValue);
1039*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
1040*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
1041*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendEquation::kAdd == xpi.fBlendInfo.fEquation);
1042*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kOne == xpi.fBlendInfo.fSrcBlend);
1043*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(skgpu::BlendCoeff::kISC == xpi.fBlendInfo.fDstBlend);
1044*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(xpi.fBlendInfo.fWritesColor);
1045*c8dee2aaSAndroid Build Coastguard Worker break;
1046*c8dee2aaSAndroid Build Coastguard Worker default:
1047*c8dee2aaSAndroid Build Coastguard Worker ERRORF(reporter, "Invalid xfermode.");
1048*c8dee2aaSAndroid Build Coastguard Worker break;
1049*c8dee2aaSAndroid Build Coastguard Worker }
1050*c8dee2aaSAndroid Build Coastguard Worker }
1051*c8dee2aaSAndroid Build Coastguard Worker }
1052*c8dee2aaSAndroid Build Coastguard Worker
test_lcd_coverage_fallback_case(skiatest::Reporter * reporter,const GrCaps & caps)1053*c8dee2aaSAndroid Build Coastguard Worker static void test_lcd_coverage_fallback_case(skiatest::Reporter* reporter, const GrCaps& caps) {
1054*c8dee2aaSAndroid Build Coastguard Worker constexpr GrClampType autoClamp = GrClampType::kAuto;
1055*c8dee2aaSAndroid Build Coastguard Worker const GrXPFactory* xpf = GrPorterDuffXPFactory::Get(SkBlendMode::kSrcOver);
1056*c8dee2aaSAndroid Build Coastguard Worker GrProcessorAnalysisColor color = SkPMColor4f::FromBytes_RGBA(GrColorPackRGBA(123, 45, 67, 255));
1057*c8dee2aaSAndroid Build Coastguard Worker GrProcessorAnalysisCoverage coverage = GrProcessorAnalysisCoverage::kLCD;
1058*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!(GrXPFactory::GetAnalysisProperties(xpf, color, coverage, caps, autoClamp) &
1059*c8dee2aaSAndroid Build Coastguard Worker GrXPFactory::AnalysisProperties::kRequiresDstTexture));
1060*c8dee2aaSAndroid Build Coastguard Worker sk_sp<const GrXferProcessor> xp_opaque(
1061*c8dee2aaSAndroid Build Coastguard Worker GrXPFactory::MakeXferProcessor(xpf, color, coverage, caps, autoClamp));
1062*c8dee2aaSAndroid Build Coastguard Worker if (!xp_opaque) {
1063*c8dee2aaSAndroid Build Coastguard Worker ERRORF(reporter, "Failed to create an XP with LCD coverage.");
1064*c8dee2aaSAndroid Build Coastguard Worker return;
1065*c8dee2aaSAndroid Build Coastguard Worker }
1066*c8dee2aaSAndroid Build Coastguard Worker
1067*c8dee2aaSAndroid Build Coastguard Worker skgpu::BlendInfo blendInfo = xp_opaque->getBlendInfo();
1068*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(blendInfo.fWritesColor);
1069*c8dee2aaSAndroid Build Coastguard Worker
1070*c8dee2aaSAndroid Build Coastguard Worker // Test with non-opaque alpha
1071*c8dee2aaSAndroid Build Coastguard Worker color = SkPMColor4f::FromBytes_RGBA(GrColorPackRGBA(123, 45, 67, 221));
1072*c8dee2aaSAndroid Build Coastguard Worker coverage = GrProcessorAnalysisCoverage::kLCD;
1073*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!(GrXPFactory::GetAnalysisProperties(xpf, color, coverage, caps, autoClamp) &
1074*c8dee2aaSAndroid Build Coastguard Worker GrXPFactory::AnalysisProperties::kRequiresDstTexture));
1075*c8dee2aaSAndroid Build Coastguard Worker sk_sp<const GrXferProcessor> xp(
1076*c8dee2aaSAndroid Build Coastguard Worker GrXPFactory::MakeXferProcessor(xpf, color, coverage, caps, autoClamp));
1077*c8dee2aaSAndroid Build Coastguard Worker if (!xp) {
1078*c8dee2aaSAndroid Build Coastguard Worker ERRORF(reporter, "Failed to create an XP with LCD coverage.");
1079*c8dee2aaSAndroid Build Coastguard Worker return;
1080*c8dee2aaSAndroid Build Coastguard Worker }
1081*c8dee2aaSAndroid Build Coastguard Worker
1082*c8dee2aaSAndroid Build Coastguard Worker blendInfo = xp->getBlendInfo();
1083*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(blendInfo.fWritesColor);
1084*c8dee2aaSAndroid Build Coastguard Worker }
1085*c8dee2aaSAndroid Build Coastguard Worker
DEF_GANESH_TEST(PorterDuffNoDualSourceBlending,reporter,options,CtsEnforcement::kApiLevel_T)1086*c8dee2aaSAndroid Build Coastguard Worker DEF_GANESH_TEST(PorterDuffNoDualSourceBlending, reporter, options, CtsEnforcement::kApiLevel_T) {
1087*c8dee2aaSAndroid Build Coastguard Worker GrContextOptions opts = options;
1088*c8dee2aaSAndroid Build Coastguard Worker opts.fSuppressDualSourceBlending = true;
1089*c8dee2aaSAndroid Build Coastguard Worker sk_gpu_test::GrContextFactory mockFactory(opts);
1090*c8dee2aaSAndroid Build Coastguard Worker auto ctx = mockFactory.get(skgpu::ContextType::kMock);
1091*c8dee2aaSAndroid Build Coastguard Worker if (!ctx) {
1092*c8dee2aaSAndroid Build Coastguard Worker SK_ABORT("Failed to create mock context without ARB_blend_func_extended.");
1093*c8dee2aaSAndroid Build Coastguard Worker }
1094*c8dee2aaSAndroid Build Coastguard Worker
1095*c8dee2aaSAndroid Build Coastguard Worker GrProxyProvider* proxyProvider = ctx->priv().proxyProvider();
1096*c8dee2aaSAndroid Build Coastguard Worker const GrCaps& caps = *ctx->priv().caps();
1097*c8dee2aaSAndroid Build Coastguard Worker if (caps.shaderCaps()->fDualSourceBlendingSupport) {
1098*c8dee2aaSAndroid Build Coastguard Worker SK_ABORT("Mock context failed to honor request for no ARB_blend_func_extended.");
1099*c8dee2aaSAndroid Build Coastguard Worker }
1100*c8dee2aaSAndroid Build Coastguard Worker
1101*c8dee2aaSAndroid Build Coastguard Worker auto mbet = sk_gpu_test::ManagedBackendTexture::MakeWithoutData(
1102*c8dee2aaSAndroid Build Coastguard Worker ctx, 100, 100, kRGBA_8888_SkColorType, skgpu::Mipmapped::kNo, GrRenderable::kNo);
1103*c8dee2aaSAndroid Build Coastguard Worker if (!mbet) {
1104*c8dee2aaSAndroid Build Coastguard Worker ERRORF(reporter, "Could not make texture.");
1105*c8dee2aaSAndroid Build Coastguard Worker return;
1106*c8dee2aaSAndroid Build Coastguard Worker }
1107*c8dee2aaSAndroid Build Coastguard Worker GrDstProxyView fakeDstProxyView;
1108*c8dee2aaSAndroid Build Coastguard Worker {
1109*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrTextureProxy> proxy = proxyProvider->wrapBackendTexture(
1110*c8dee2aaSAndroid Build Coastguard Worker mbet->texture(), kBorrow_GrWrapOwnership, GrWrapCacheable::kNo, kRead_GrIOType,
1111*c8dee2aaSAndroid Build Coastguard Worker mbet->refCountedCallback());
1112*c8dee2aaSAndroid Build Coastguard Worker skgpu::Swizzle swizzle =
1113*c8dee2aaSAndroid Build Coastguard Worker caps.getReadSwizzle(mbet->texture().getBackendFormat(), GrColorType::kRGBA_8888);
1114*c8dee2aaSAndroid Build Coastguard Worker fakeDstProxyView.setProxyView({std::move(proxy), kTopLeft_GrSurfaceOrigin, swizzle});
1115*c8dee2aaSAndroid Build Coastguard Worker }
1116*c8dee2aaSAndroid Build Coastguard Worker
1117*c8dee2aaSAndroid Build Coastguard Worker static const GrProcessorAnalysisColor colorInputs[] = {
1118*c8dee2aaSAndroid Build Coastguard Worker GrProcessorAnalysisColor::Opaque::kNo, GrProcessorAnalysisColor::Opaque::kYes,
1119*c8dee2aaSAndroid Build Coastguard Worker GrProcessorAnalysisColor(SkPMColor4f::FromBytes_RGBA(GrColorPackRGBA(0, 82, 17, 100))),
1120*c8dee2aaSAndroid Build Coastguard Worker GrProcessorAnalysisColor(SkPMColor4f::FromBytes_RGBA(GrColorPackRGBA(0, 82, 17, 255)))};
1121*c8dee2aaSAndroid Build Coastguard Worker
1122*c8dee2aaSAndroid Build Coastguard Worker for (const auto& colorInput : colorInputs) {
1123*c8dee2aaSAndroid Build Coastguard Worker for (GrProcessorAnalysisCoverage coverageType :
1124*c8dee2aaSAndroid Build Coastguard Worker {GrProcessorAnalysisCoverage::kSingleChannel, GrProcessorAnalysisCoverage::kNone}) {
1125*c8dee2aaSAndroid Build Coastguard Worker for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
1126*c8dee2aaSAndroid Build Coastguard Worker SkBlendMode xfermode = static_cast<SkBlendMode>(m);
1127*c8dee2aaSAndroid Build Coastguard Worker const GrXPFactory* xpf = GrPorterDuffXPFactory::Get(xfermode);
1128*c8dee2aaSAndroid Build Coastguard Worker sk_sp<const GrXferProcessor> xp(
1129*c8dee2aaSAndroid Build Coastguard Worker GrXPFactory::MakeXferProcessor(xpf, colorInput, coverageType, caps,
1130*c8dee2aaSAndroid Build Coastguard Worker GrClampType::kAuto));
1131*c8dee2aaSAndroid Build Coastguard Worker if (!xp) {
1132*c8dee2aaSAndroid Build Coastguard Worker ERRORF(reporter, "Failed to create an XP without dual source blending.");
1133*c8dee2aaSAndroid Build Coastguard Worker return;
1134*c8dee2aaSAndroid Build Coastguard Worker }
1135*c8dee2aaSAndroid Build Coastguard Worker TEST_ASSERT(!xp->hasSecondaryOutput());
1136*c8dee2aaSAndroid Build Coastguard Worker }
1137*c8dee2aaSAndroid Build Coastguard Worker }
1138*c8dee2aaSAndroid Build Coastguard Worker }
1139*c8dee2aaSAndroid Build Coastguard Worker }
1140