blob: ddfcdef602318653e0d577b2b63f352504f67c5c [file] [log] [blame]
cdalton6fd158e2015-05-27 15:08:33 -07001/*
2 * Copyright 2015 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
cdalton6fd158e2015-05-27 15:08:33 -07008#include "Test.h"
9
10#if SK_SUPPORT_GPU
11
cdalton6fd158e2015-05-27 15:08:33 -070012#include "GrContextFactory.h"
13#include "GrContextOptions.h"
Greg Daniel7ef28f32017-04-20 16:41:55 +000014#include "GrContextPriv.h"
cdalton6fd158e2015-05-27 15:08:33 -070015#include "GrGpu.h"
Greg Daniel7ef28f32017-04-20 16:41:55 +000016#include "GrTest.h"
cdalton6fd158e2015-05-27 15:08:33 -070017#include "GrXferProcessor.h"
18#include "effects/GrPorterDuffXferProcessor.h"
19#include "gl/GrGLCaps.h"
Brian Salomon89527432016-12-16 09:52:16 -050020#include "ops/GrMeshDrawOp.h"
cdalton6fd158e2015-05-27 15:08:33 -070021
22////////////////////////////////////////////////////////////////////////////////
23
24static void test_color_unknown_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps);
Brian Salomon31853842017-03-28 16:32:05 -040025static void test_color_not_opaque_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps);
cdalton6fd158e2015-05-27 15:08:33 -070026static void test_color_opaque_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps);
27static void test_color_opaque_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps);
28static void test_lcd_coverage(skiatest::Reporter* reporter, const GrCaps& caps);
egdaniel723b0502015-09-15 09:31:40 -070029static void test_lcd_coverage_fallback_case(skiatest::Reporter* reporter, const GrCaps& caps);
cdalton6fd158e2015-05-27 15:08:33 -070030
bsalomon758586c2016-04-06 14:02:39 -070031DEF_GPUTEST_FOR_NULLGL_CONTEXT(GrPorterDuff, reporter, ctxInfo) {
bsalomon8b7451a2016-05-11 06:33:06 -070032 const GrCaps& caps = *ctxInfo.grContext()->getGpu()->caps();
cdalton6fd158e2015-05-27 15:08:33 -070033 if (!caps.shaderCaps()->dualSourceBlendingSupport()) {
Ben Wagnerb4aab9a2017-08-16 10:53:04 -040034 SK_ABORT("Null context does not support dual source blending.");
cdalton6fd158e2015-05-27 15:08:33 -070035 return;
36 }
37
38 test_color_unknown_with_coverage(reporter, caps);
Brian Salomon31853842017-03-28 16:32:05 -040039 test_color_not_opaque_no_coverage(reporter, caps);
cdalton6fd158e2015-05-27 15:08:33 -070040 test_color_opaque_with_coverage(reporter, caps);
41 test_color_opaque_no_coverage(reporter, caps);
42 test_lcd_coverage(reporter, caps);
egdaniel723b0502015-09-15 09:31:40 -070043 test_lcd_coverage_fallback_case(reporter, caps);
cdalton6fd158e2015-05-27 15:08:33 -070044}
45
46////////////////////////////////////////////////////////////////////////////////
47
48#define TEST_ASSERT(...) REPORTER_ASSERT(reporter, __VA_ARGS__)
49
50enum {
51 kNone_OutputType,
52 kCoverage_OutputType,
53 kModulate_OutputType,
egdaniel723b0502015-09-15 09:31:40 -070054 kSAModulate_OutputType,
cdalton6fd158e2015-05-27 15:08:33 -070055 kISAModulate_OutputType,
56 kISCModulate_OutputType
57};
Greg Daniel79cdf282017-05-22 15:56:22 -040058static const int kInvalid_OutputType = -1;
cdalton6fd158e2015-05-27 15:08:33 -070059
Brian Salomon48d1b4c2017-04-08 07:38:53 -040060static GrProcessorSet::Analysis do_analysis(const GrXPFactory* xpf,
61 const GrProcessorAnalysisColor& colorInput,
62 GrProcessorAnalysisCoverage coverageInput,
63 const GrCaps& caps) {
64 GrPaint paint;
65 paint.setXPFactory(xpf);
66 GrProcessorSet procs(std::move(paint));
67 GrColor overrideColor;
68 GrProcessorSet::Analysis analysis =
Brian Osman9a725dd2017-09-20 09:53:22 -040069 procs.finalize(colorInput, coverageInput, nullptr, false, caps,
70 GrPixelConfigIsClamped::kYes, &overrideColor);
Brian Salomon48d1b4c2017-04-08 07:38:53 -040071 return analysis;
72}
73
cdalton6fd158e2015-05-27 15:08:33 -070074class GrPorterDuffTest {
75public:
76 struct XPInfo {
Mike Reed7d954ad2016-10-28 15:42:34 -040077 XPInfo(skiatest::Reporter* reporter, SkBlendMode xfermode, const GrCaps& caps,
Brian Salomona811b122017-03-30 08:21:32 -040078 GrProcessorAnalysisColor inputColor, GrProcessorAnalysisCoverage inputCoverage) {
Brian Salomona1633922017-01-09 11:46:10 -050079 const GrXPFactory* xpf = GrPorterDuffXPFactory::Get(xfermode);
Brian Salomon48d1b4c2017-04-08 07:38:53 -040080
Greg Daniel79cdf282017-05-22 15:56:22 -040081 bool isLCD = GrProcessorAnalysisCoverage::kLCD == inputCoverage;
82
Brian Salomon48d1b4c2017-04-08 07:38:53 -040083 GrProcessorSet::Analysis analysis = do_analysis(xpf, inputColor, inputCoverage, caps);
Brian Salomon31853842017-03-28 16:32:05 -040084 fCompatibleWithCoverageAsAlpha = analysis.isCompatibleWithCoverageAsAlpha();
85 fCanCombineOverlappedStencilAndCover = analysis.canCombineOverlappedStencilAndCover();
Brian Salomon48d1b4c2017-04-08 07:38:53 -040086 fIgnoresInputColor = analysis.inputColorIsIgnored();
Brian Salomond61c9d92017-04-10 10:54:25 -040087 sk_sp<const GrXferProcessor> xp(
Brian Osman9a725dd2017-09-20 09:53:22 -040088 GrXPFactory::MakeXferProcessor(xpf, inputColor, inputCoverage, false, caps,
89 GrPixelConfigIsClamped::kYes));
Greg Daniel79cdf282017-05-22 15:56:22 -040090 TEST_ASSERT(!analysis.requiresDstTexture() ||
91 (isLCD &&
92 !caps.shaderCaps()->dstReadInShaderSupport() &&
93 (SkBlendMode::kSrcOver != xfermode ||
94 !inputColor.isOpaque())));
Hal Canary342b7ac2016-11-04 11:49:42 -040095 GetXPOutputTypes(xp.get(), &fPrimaryOutputType, &fSecondaryOutputType);
cdalton6fd158e2015-05-27 15:08:33 -070096 xp->getBlendInfo(&fBlendInfo);
Greg Daniel79cdf282017-05-22 15:56:22 -040097 TEST_ASSERT(!xp->willReadDstColor() ||
98 (isLCD && (SkBlendMode::kSrcOver != xfermode ||
99 !inputColor.isOpaque())));
cdalton6fd158e2015-05-27 15:08:33 -0700100 TEST_ASSERT(xp->hasSecondaryOutput() == GrBlendCoeffRefsSrc2(fBlendInfo.fDstBlend));
101 }
102
Brian Salomon54d212e2017-03-21 14:22:38 -0400103 bool fCanCombineOverlappedStencilAndCover;
Brian Salomon31853842017-03-28 16:32:05 -0400104 bool fCompatibleWithCoverageAsAlpha;
105 bool fIgnoresInputColor;
cdalton6fd158e2015-05-27 15:08:33 -0700106 int fPrimaryOutputType;
107 int fSecondaryOutputType;
108 GrXferProcessor::BlendInfo fBlendInfo;
109 };
110
111 static void GetXPOutputTypes(const GrXferProcessor* xp, int* outPrimary, int* outSecondary) {
egdanielf2342722015-11-20 15:12:59 -0800112 GrPorterDuffXPFactory::TestGetXPOutputTypes(xp, outPrimary, outSecondary);
cdalton6fd158e2015-05-27 15:08:33 -0700113 }
114};
115
egdaniel723b0502015-09-15 09:31:40 -0700116static void test_lcd_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Greg Daniel6ebe4b92017-05-19 10:56:46 -0400117 GrProcessorAnalysisColor inputColor = GrProcessorAnalysisColor::Opaque::kYes;
Brian Salomona811b122017-03-30 08:21:32 -0400118 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kLCD;
egdaniel723b0502015-09-15 09:31:40 -0700119
Mike Reed7d954ad2016-10-28 15:42:34 -0400120 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
121 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon31853842017-03-28 16:32:05 -0400122 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
egdaniel723b0502015-09-15 09:31:40 -0700123 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400124 case SkBlendMode::kClear:
Brian Salomon54d212e2017-03-21 14:22:38 -0400125 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400126 TEST_ASSERT(xpi.fIgnoresInputColor);
127 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400128 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
129 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
130 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
131 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
132 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700133 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
134 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400135 case SkBlendMode::kSrc:
Brian Salomon54d212e2017-03-21 14:22:38 -0400136 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400137 TEST_ASSERT(!xpi.fIgnoresInputColor);
138 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400139 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
140 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700141 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
142 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
Greg Daniel79cdf282017-05-22 15:56:22 -0400143 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700144 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
145 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400146 case SkBlendMode::kDst:
Brian Salomon54d212e2017-03-21 14:22:38 -0400147 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400148 TEST_ASSERT(xpi.fIgnoresInputColor);
149 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400150 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
151 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700152 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400153 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
154 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
155 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
egdaniel723b0502015-09-15 09:31:40 -0700156 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400157 case SkBlendMode::kSrcOver:
Brian Salomon54d212e2017-03-21 14:22:38 -0400158 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400159 TEST_ASSERT(!xpi.fIgnoresInputColor);
160 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
egdaniel723b0502015-09-15 09:31:40 -0700161 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
162 TEST_ASSERT(kSAModulate_OutputType == xpi.fSecondaryOutputType);
163 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
164 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
165 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
166 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
167 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400168 case SkBlendMode::kDstOver:
Brian Salomon54d212e2017-03-21 14:22:38 -0400169 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400170 TEST_ASSERT(!xpi.fIgnoresInputColor);
171 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400172 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
173 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700174 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400175 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
176 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700177 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
178 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400179 case SkBlendMode::kSrcIn:
Brian Salomon54d212e2017-03-21 14:22:38 -0400180 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400181 TEST_ASSERT(!xpi.fIgnoresInputColor);
182 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400183 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
184 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700185 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400186 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
187 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700188 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
189 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400190 case SkBlendMode::kDstIn:
Brian Salomon54d212e2017-03-21 14:22:38 -0400191 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400192 TEST_ASSERT(!xpi.fIgnoresInputColor);
193 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400194 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
195 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
196 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
197 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
198 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700199 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
200 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400201 case SkBlendMode::kSrcOut:
Brian Salomon54d212e2017-03-21 14:22:38 -0400202 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400203 TEST_ASSERT(!xpi.fIgnoresInputColor);
204 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400205 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
206 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700207 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400208 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
209 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700210 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
211 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400212 case SkBlendMode::kDstOut:
Brian Salomon54d212e2017-03-21 14:22:38 -0400213 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400214 TEST_ASSERT(!xpi.fIgnoresInputColor);
215 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400216 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
217 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700218 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400219 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
220 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700221 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
222 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400223 case SkBlendMode::kSrcATop:
Brian Salomon54d212e2017-03-21 14:22:38 -0400224 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400225 TEST_ASSERT(!xpi.fIgnoresInputColor);
226 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400227 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
228 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700229 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400230 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
231 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700232 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
233 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400234 case SkBlendMode::kDstATop:
Brian Salomon54d212e2017-03-21 14:22:38 -0400235 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400236 TEST_ASSERT(!xpi.fIgnoresInputColor);
237 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400238 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
239 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700240 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400241 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
242 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700243 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
244 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400245 case SkBlendMode::kXor:
Brian Salomon54d212e2017-03-21 14:22:38 -0400246 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400247 TEST_ASSERT(!xpi.fIgnoresInputColor);
248 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400249 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
250 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700251 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
Greg Daniel79cdf282017-05-22 15:56:22 -0400252 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
253 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700254 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
255 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400256 case SkBlendMode::kPlus:
Brian Salomon54d212e2017-03-21 14:22:38 -0400257 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400258 TEST_ASSERT(!xpi.fIgnoresInputColor);
259 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400260 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
261 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700262 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
263 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
Greg Daniel79cdf282017-05-22 15:56:22 -0400264 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700265 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
266 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400267 case SkBlendMode::kModulate:
Brian Salomon54d212e2017-03-21 14:22:38 -0400268 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400269 TEST_ASSERT(!xpi.fIgnoresInputColor);
270 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400271 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
272 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
273 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
274 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
275 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700276 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
277 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400278 case SkBlendMode::kScreen:
Brian Salomon54d212e2017-03-21 14:22:38 -0400279 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400280 TEST_ASSERT(!xpi.fIgnoresInputColor);
281 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
Greg Daniel79cdf282017-05-22 15:56:22 -0400282 TEST_ASSERT(kInvalid_OutputType == xpi.fPrimaryOutputType);
283 TEST_ASSERT(kInvalid_OutputType == xpi.fSecondaryOutputType);
egdaniel723b0502015-09-15 09:31:40 -0700284 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
285 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
Greg Daniel79cdf282017-05-22 15:56:22 -0400286 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
egdaniel723b0502015-09-15 09:31:40 -0700287 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
288 break;
289 default:
290 ERRORF(reporter, "Invalid xfermode.");
291 break;
292 }
293 }
294}
cdalton6fd158e2015-05-27 15:08:33 -0700295static void test_color_unknown_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomona811b122017-03-30 08:21:32 -0400296 GrProcessorAnalysisColor inputColor = GrProcessorAnalysisColor::Opaque::kNo;
297 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kSingleChannel;
cdalton6fd158e2015-05-27 15:08:33 -0700298
Mike Reed7d954ad2016-10-28 15:42:34 -0400299 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
300 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon31853842017-03-28 16:32:05 -0400301 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
cdalton6fd158e2015-05-27 15:08:33 -0700302 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400303 case SkBlendMode::kClear:
Brian Salomon54d212e2017-03-21 14:22:38 -0400304 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400305 TEST_ASSERT(xpi.fIgnoresInputColor);
306 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700307 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
308 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
309 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
310 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
311 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
312 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
313 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400314 case SkBlendMode::kSrc:
Brian Salomon54d212e2017-03-21 14:22:38 -0400315 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400316 TEST_ASSERT(!xpi.fIgnoresInputColor);
317 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700318 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
319 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
320 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
321 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
322 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
323 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
324 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400325 case SkBlendMode::kDst:
Brian Salomon54d212e2017-03-21 14:22:38 -0400326 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400327 TEST_ASSERT(xpi.fIgnoresInputColor);
328 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700329 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
330 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
331 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
332 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
333 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
334 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
335 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400336 case SkBlendMode::kSrcOver:
Brian Salomon54d212e2017-03-21 14:22:38 -0400337 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400338 TEST_ASSERT(!xpi.fIgnoresInputColor);
339 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700340 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
341 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
342 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
343 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
344 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
345 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
346 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400347 case SkBlendMode::kDstOver:
Brian Salomon54d212e2017-03-21 14:22:38 -0400348 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400349 TEST_ASSERT(!xpi.fIgnoresInputColor);
350 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700351 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
352 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
353 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
354 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
355 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
356 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
357 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400358 case SkBlendMode::kSrcIn:
Brian Salomon54d212e2017-03-21 14:22:38 -0400359 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400360 TEST_ASSERT(!xpi.fIgnoresInputColor);
361 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700362 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
363 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
364 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
365 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
366 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
367 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
368 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400369 case SkBlendMode::kDstIn:
Brian Salomon54d212e2017-03-21 14:22:38 -0400370 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400371 TEST_ASSERT(!xpi.fIgnoresInputColor);
372 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700373 TEST_ASSERT(kISAModulate_OutputType == xpi.fPrimaryOutputType);
374 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
375 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
376 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
377 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
378 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
379 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400380 case SkBlendMode::kSrcOut:
Brian Salomon54d212e2017-03-21 14:22:38 -0400381 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400382 TEST_ASSERT(!xpi.fIgnoresInputColor);
383 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700384 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
385 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType);
386 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
387 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
388 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
389 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
390 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400391 case SkBlendMode::kDstOut:
Brian Salomon54d212e2017-03-21 14:22:38 -0400392 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400393 TEST_ASSERT(!xpi.fIgnoresInputColor);
394 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700395 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
396 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
397 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
398 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
399 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
400 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
401 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400402 case SkBlendMode::kSrcATop:
Brian Salomon54d212e2017-03-21 14:22:38 -0400403 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400404 TEST_ASSERT(!xpi.fIgnoresInputColor);
405 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700406 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
407 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
408 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
409 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
410 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
411 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
412 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400413 case SkBlendMode::kDstATop:
Brian Salomon54d212e2017-03-21 14:22:38 -0400414 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400415 TEST_ASSERT(!xpi.fIgnoresInputColor);
416 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700417 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
418 TEST_ASSERT(kISAModulate_OutputType == xpi.fSecondaryOutputType);
419 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
420 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
421 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
422 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
423 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400424 case SkBlendMode::kXor:
Brian Salomon54d212e2017-03-21 14:22:38 -0400425 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400426 TEST_ASSERT(!xpi.fIgnoresInputColor);
427 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700428 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
429 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
430 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
431 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
432 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
433 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
434 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400435 case SkBlendMode::kPlus:
Brian Salomon54d212e2017-03-21 14:22:38 -0400436 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400437 TEST_ASSERT(!xpi.fIgnoresInputColor);
438 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700439 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
440 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
441 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
442 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
443 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
444 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
445 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400446 case SkBlendMode::kModulate:
Brian Salomon54d212e2017-03-21 14:22:38 -0400447 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400448 TEST_ASSERT(!xpi.fIgnoresInputColor);
449 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700450 TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType);
451 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
452 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
453 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
454 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
455 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
456 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400457 case SkBlendMode::kScreen:
Brian Salomon54d212e2017-03-21 14:22:38 -0400458 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400459 TEST_ASSERT(!xpi.fIgnoresInputColor);
460 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700461 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
462 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
463 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
464 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
465 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
466 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
467 break;
468 default:
469 ERRORF(reporter, "Invalid xfermode.");
470 break;
471 }
472 }
473}
474
Brian Salomon31853842017-03-28 16:32:05 -0400475static void test_color_not_opaque_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomona811b122017-03-30 08:21:32 -0400476 GrProcessorAnalysisColor inputColor(GrColorPackRGBA(229, 0, 154, 240));
477 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kNone;
cdalton6fd158e2015-05-27 15:08:33 -0700478
Mike Reed7d954ad2016-10-28 15:42:34 -0400479 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
480 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon31853842017-03-28 16:32:05 -0400481 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
cdalton6fd158e2015-05-27 15:08:33 -0700482 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400483 case SkBlendMode::kClear:
Brian Salomon54d212e2017-03-21 14:22:38 -0400484 TEST_ASSERT(xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400485 TEST_ASSERT(xpi.fIgnoresInputColor);
486 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700487 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
488 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
489 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
490 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
491 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
492 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
493 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400494 case SkBlendMode::kSrc:
Brian Salomon54d212e2017-03-21 14:22:38 -0400495 TEST_ASSERT(xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400496 TEST_ASSERT(!xpi.fIgnoresInputColor);
497 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700498 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
499 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
500 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
501 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
502 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
503 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
504 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400505 case SkBlendMode::kDst:
Brian Salomon54d212e2017-03-21 14:22:38 -0400506 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400507 TEST_ASSERT(xpi.fIgnoresInputColor);
508 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700509 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
510 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
511 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
512 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
513 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
514 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
515 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400516 case SkBlendMode::kSrcOver:
Brian Salomon54d212e2017-03-21 14:22:38 -0400517 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400518 TEST_ASSERT(!xpi.fIgnoresInputColor);
519 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700520 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
521 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
522 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
523 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
524 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
525 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
526 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400527 case SkBlendMode::kDstOver:
Brian Salomon54d212e2017-03-21 14:22:38 -0400528 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400529 TEST_ASSERT(!xpi.fIgnoresInputColor);
530 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700531 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
532 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
533 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
534 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
535 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
536 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
537 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400538 case SkBlendMode::kSrcIn:
Brian Salomon54d212e2017-03-21 14:22:38 -0400539 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400540 TEST_ASSERT(!xpi.fIgnoresInputColor);
541 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700542 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
543 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
544 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
545 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
546 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
547 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
548 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400549 case SkBlendMode::kDstIn:
Brian Salomon54d212e2017-03-21 14:22:38 -0400550 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400551 TEST_ASSERT(!xpi.fIgnoresInputColor);
552 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700553 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
554 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
555 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
556 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
557 TEST_ASSERT(kSA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
558 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
559 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400560 case SkBlendMode::kSrcOut:
Brian Salomon54d212e2017-03-21 14:22:38 -0400561 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400562 TEST_ASSERT(!xpi.fIgnoresInputColor);
563 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700564 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
565 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
566 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
567 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
568 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
569 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
570 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400571 case SkBlendMode::kDstOut:
Brian Salomon54d212e2017-03-21 14:22:38 -0400572 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400573 TEST_ASSERT(!xpi.fIgnoresInputColor);
574 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700575 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
576 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
577 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
578 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
579 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
580 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
581 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400582 case SkBlendMode::kSrcATop:
Brian Salomon54d212e2017-03-21 14:22:38 -0400583 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400584 TEST_ASSERT(!xpi.fIgnoresInputColor);
585 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700586 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
587 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
588 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
589 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
590 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
591 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
592 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400593 case SkBlendMode::kDstATop:
Brian Salomon54d212e2017-03-21 14:22:38 -0400594 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400595 TEST_ASSERT(!xpi.fIgnoresInputColor);
596 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700597 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
598 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
599 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
600 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
601 TEST_ASSERT(kSA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
602 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
603 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400604 case SkBlendMode::kXor:
Brian Salomon54d212e2017-03-21 14:22:38 -0400605 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400606 TEST_ASSERT(!xpi.fIgnoresInputColor);
607 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700608 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
609 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
610 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
611 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
612 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
613 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
614 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400615 case SkBlendMode::kPlus:
Brian Salomon54d212e2017-03-21 14:22:38 -0400616 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400617 TEST_ASSERT(!xpi.fIgnoresInputColor);
618 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700619 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
620 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
621 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
622 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
623 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
624 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
625 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400626 case SkBlendMode::kModulate:
Brian Salomon54d212e2017-03-21 14:22:38 -0400627 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400628 TEST_ASSERT(!xpi.fIgnoresInputColor);
629 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700630 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
631 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
632 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
633 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
634 TEST_ASSERT(kSC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
635 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
636 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400637 case SkBlendMode::kScreen:
Brian Salomon54d212e2017-03-21 14:22:38 -0400638 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400639 TEST_ASSERT(!xpi.fIgnoresInputColor);
640 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700641 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
642 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
643 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
644 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
645 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
646 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
647 break;
648 default:
649 ERRORF(reporter, "Invalid xfermode.");
650 break;
651 }
652 }
653}
654
655static void test_color_opaque_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomona811b122017-03-30 08:21:32 -0400656 GrProcessorAnalysisColor inputColor = GrProcessorAnalysisColor::Opaque::kYes;
657 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kSingleChannel;
cdalton6fd158e2015-05-27 15:08:33 -0700658
Mike Reed7d954ad2016-10-28 15:42:34 -0400659 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
660 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon31853842017-03-28 16:32:05 -0400661 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
cdalton6fd158e2015-05-27 15:08:33 -0700662 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400663 case SkBlendMode::kClear:
Brian Salomon54d212e2017-03-21 14:22:38 -0400664 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400665 TEST_ASSERT(xpi.fIgnoresInputColor);
666 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700667 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
668 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
669 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
670 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
671 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
672 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
673 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400674 case SkBlendMode::kSrc:
Brian Salomon54d212e2017-03-21 14:22:38 -0400675 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400676 TEST_ASSERT(!xpi.fIgnoresInputColor);
677 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700678 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
679 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
680 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
681 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
682 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
683 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
684 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400685 case SkBlendMode::kDst:
Brian Salomon54d212e2017-03-21 14:22:38 -0400686 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400687 TEST_ASSERT(xpi.fIgnoresInputColor);
688 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700689 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
690 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
691 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
692 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
693 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
694 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
695 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400696 case SkBlendMode::kSrcOver:
Brian Salomon54d212e2017-03-21 14:22:38 -0400697 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400698 TEST_ASSERT(!xpi.fIgnoresInputColor);
699 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700700 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
701 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
702 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
703 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
704 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
705 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
706 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400707 case SkBlendMode::kDstOver:
Brian Salomon54d212e2017-03-21 14:22:38 -0400708 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400709 TEST_ASSERT(!xpi.fIgnoresInputColor);
710 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700711 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
712 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
713 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
714 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
715 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
716 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
717 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400718 case SkBlendMode::kSrcIn:
Brian Salomon54d212e2017-03-21 14:22:38 -0400719 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400720 TEST_ASSERT(!xpi.fIgnoresInputColor);
721 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700722 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
723 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
724 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
725 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
726 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
727 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
728 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400729 case SkBlendMode::kDstIn:
Brian Salomon54d212e2017-03-21 14:22:38 -0400730 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400731 TEST_ASSERT(xpi.fIgnoresInputColor);
732 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700733 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
734 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
735 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
736 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
737 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
738 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
739 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400740 case SkBlendMode::kSrcOut:
Brian Salomon54d212e2017-03-21 14:22:38 -0400741 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400742 TEST_ASSERT(!xpi.fIgnoresInputColor);
743 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700744 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
745 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
746 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
747 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
748 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
749 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
750 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400751 case SkBlendMode::kDstOut:
Brian Salomon54d212e2017-03-21 14:22:38 -0400752 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400753 TEST_ASSERT(xpi.fIgnoresInputColor);
754 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700755 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType);
756 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
757 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
758 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
759 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
760 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
761 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400762 case SkBlendMode::kSrcATop:
Brian Salomon54d212e2017-03-21 14:22:38 -0400763 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400764 TEST_ASSERT(!xpi.fIgnoresInputColor);
765 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700766 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
767 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
768 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
769 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
770 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
771 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
772 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400773 case SkBlendMode::kDstATop:
Brian Salomon54d212e2017-03-21 14:22:38 -0400774 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400775 TEST_ASSERT(!xpi.fIgnoresInputColor);
776 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700777 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
778 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
779 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
780 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
781 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
782 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
783 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400784 case SkBlendMode::kXor:
Brian Salomon54d212e2017-03-21 14:22:38 -0400785 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400786 TEST_ASSERT(!xpi.fIgnoresInputColor);
787 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700788 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
789 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
790 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
791 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
792 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
793 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
794 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400795 case SkBlendMode::kPlus:
Brian Salomon54d212e2017-03-21 14:22:38 -0400796 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400797 TEST_ASSERT(!xpi.fIgnoresInputColor);
798 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700799 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
800 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
801 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
802 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
803 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
804 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
805 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400806 case SkBlendMode::kModulate:
Brian Salomon54d212e2017-03-21 14:22:38 -0400807 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400808 TEST_ASSERT(!xpi.fIgnoresInputColor);
cdalton6fd158e2015-05-27 15:08:33 -0700809 TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType);
810 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
811 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation);
812 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
813 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
814 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
815 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400816 case SkBlendMode::kScreen:
Brian Salomon54d212e2017-03-21 14:22:38 -0400817 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400818 TEST_ASSERT(!xpi.fIgnoresInputColor);
819 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700820 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
821 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
822 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
823 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
824 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
825 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
826 break;
827 default:
828 ERRORF(reporter, "Invalid xfermode.");
829 break;
830 }
831 }
832}
833
834static void test_color_opaque_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomona811b122017-03-30 08:21:32 -0400835 GrProcessorAnalysisColor inputColor = GrProcessorAnalysisColor::Opaque::kYes;
836 GrProcessorAnalysisCoverage inputCoverage = GrProcessorAnalysisCoverage::kNone;
cdalton6fd158e2015-05-27 15:08:33 -0700837
Mike Reed7d954ad2016-10-28 15:42:34 -0400838 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
839 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomon31853842017-03-28 16:32:05 -0400840 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, inputColor, inputCoverage);
cdalton6fd158e2015-05-27 15:08:33 -0700841
842 switch (xfermode) {
Mike Reed7d954ad2016-10-28 15:42:34 -0400843 case SkBlendMode::kClear:
Brian Salomon54d212e2017-03-21 14:22:38 -0400844 TEST_ASSERT(xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400845 TEST_ASSERT(xpi.fIgnoresInputColor);
846 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700847 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
848 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
849 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
850 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
851 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
852 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
853 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400854 case SkBlendMode::kSrc:
Brian Salomon54d212e2017-03-21 14:22:38 -0400855 TEST_ASSERT(xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400856 TEST_ASSERT(!xpi.fIgnoresInputColor);
857 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700858 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
859 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
860 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
861 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
862 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
863 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
864 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400865 case SkBlendMode::kDst:
Brian Salomon54d212e2017-03-21 14:22:38 -0400866 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400867 TEST_ASSERT(xpi.fIgnoresInputColor);
868 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700869 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
870 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
871 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
872 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
873 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
874 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
875 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400876 case SkBlendMode::kSrcOver:
Brian Salomon28207df2017-06-05 12:25:13 -0400877 // We don't specialize opaque src-over. See note in GrPorterDuffXferProcessor.cpp
878 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400879 TEST_ASSERT(!xpi.fIgnoresInputColor);
Brian Salomon28207df2017-06-05 12:25:13 -0400880 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700881 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
882 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
883 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
884 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
Brian Salomon28207df2017-06-05 12:25:13 -0400885 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
cdalton6fd158e2015-05-27 15:08:33 -0700886 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
887 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400888 case SkBlendMode::kDstOver:
Brian Salomon54d212e2017-03-21 14:22:38 -0400889 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400890 TEST_ASSERT(!xpi.fIgnoresInputColor);
891 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700892 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
893 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
894 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
895 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
896 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
897 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
898 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400899 case SkBlendMode::kSrcIn:
Brian Salomon54d212e2017-03-21 14:22:38 -0400900 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400901 TEST_ASSERT(!xpi.fIgnoresInputColor);
902 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700903 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
904 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
905 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
906 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
907 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
908 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
909 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400910 case SkBlendMode::kDstIn:
Brian Salomon54d212e2017-03-21 14:22:38 -0400911 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400912 TEST_ASSERT(xpi.fIgnoresInputColor);
913 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700914 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
915 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
916 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
917 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
918 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
919 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor);
920 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400921 case SkBlendMode::kSrcOut:
Brian Salomon54d212e2017-03-21 14:22:38 -0400922 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400923 TEST_ASSERT(!xpi.fIgnoresInputColor);
924 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700925 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
926 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
927 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
928 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
929 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
930 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
931 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400932 case SkBlendMode::kDstOut:
Brian Salomon54d212e2017-03-21 14:22:38 -0400933 TEST_ASSERT(xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400934 TEST_ASSERT(xpi.fIgnoresInputColor);
935 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700936 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType);
937 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
938 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
939 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
940 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
941 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
942 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400943 case SkBlendMode::kSrcATop:
Brian Salomon54d212e2017-03-21 14:22:38 -0400944 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400945 TEST_ASSERT(!xpi.fIgnoresInputColor);
946 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700947 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
948 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
949 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
950 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
951 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
952 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
953 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400954 case SkBlendMode::kDstATop:
Brian Salomon54d212e2017-03-21 14:22:38 -0400955 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400956 TEST_ASSERT(!xpi.fIgnoresInputColor);
957 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700958 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
959 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
960 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
961 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
962 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
963 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
964 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400965 case SkBlendMode::kXor:
Brian Salomon54d212e2017-03-21 14:22:38 -0400966 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400967 TEST_ASSERT(!xpi.fIgnoresInputColor);
968 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700969 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
970 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
971 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
972 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
973 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
974 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
975 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400976 case SkBlendMode::kPlus:
Brian Salomon54d212e2017-03-21 14:22:38 -0400977 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400978 TEST_ASSERT(!xpi.fIgnoresInputColor);
979 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700980 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
981 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
982 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
983 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
984 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
985 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
986 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400987 case SkBlendMode::kModulate:
Brian Salomon54d212e2017-03-21 14:22:38 -0400988 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -0400989 TEST_ASSERT(!xpi.fIgnoresInputColor);
990 TEST_ASSERT(!xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -0700991 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
992 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
993 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
994 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
995 TEST_ASSERT(kSC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
996 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
997 break;
Mike Reed7d954ad2016-10-28 15:42:34 -0400998 case SkBlendMode::kScreen:
Brian Salomon54d212e2017-03-21 14:22:38 -0400999 TEST_ASSERT(!xpi.fCanCombineOverlappedStencilAndCover);
Brian Salomon31853842017-03-28 16:32:05 -04001000 TEST_ASSERT(!xpi.fIgnoresInputColor);
1001 TEST_ASSERT(xpi.fCompatibleWithCoverageAsAlpha);
cdalton6fd158e2015-05-27 15:08:33 -07001002 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType);
1003 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType);
1004 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation);
1005 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend);
1006 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend);
1007 TEST_ASSERT(xpi.fBlendInfo.fWriteColor);
1008 break;
1009 default:
1010 ERRORF(reporter, "Invalid xfermode.");
1011 break;
1012 }
1013 }
1014}
1015
egdaniel723b0502015-09-15 09:31:40 -07001016static void test_lcd_coverage_fallback_case(skiatest::Reporter* reporter, const GrCaps& caps) {
Brian Salomon31853842017-03-28 16:32:05 -04001017 const GrXPFactory* xpf = GrPorterDuffXPFactory::Get(SkBlendMode::kSrcOver);
Greg Daniel6ebe4b92017-05-19 10:56:46 -04001018 GrProcessorAnalysisColor color = GrColorPackRGBA(123, 45, 67, 255);
Brian Salomona811b122017-03-30 08:21:32 -04001019 GrProcessorAnalysisCoverage coverage = GrProcessorAnalysisCoverage::kLCD;
Brian Osman9a725dd2017-09-20 09:53:22 -04001020 TEST_ASSERT(!(GrXPFactory::GetAnalysisProperties(xpf, color, coverage, caps,
1021 GrPixelConfigIsClamped::kYes) &
Greg Daniel6ebe4b92017-05-19 10:56:46 -04001022 GrXPFactory::AnalysisProperties::kRequiresDstTexture));
1023 sk_sp<const GrXferProcessor> xp_opaque(
Brian Osman9a725dd2017-09-20 09:53:22 -04001024 GrXPFactory::MakeXferProcessor(xpf, color, coverage, false, caps,
1025 GrPixelConfigIsClamped::kYes));
Greg Daniel6ebe4b92017-05-19 10:56:46 -04001026 if (!xp_opaque) {
1027 ERRORF(reporter, "Failed to create an XP with LCD coverage.");
1028 return;
1029 }
1030
1031 GrXferProcessor::BlendInfo blendInfo;
1032 xp_opaque->getBlendInfo(&blendInfo);
1033 TEST_ASSERT(blendInfo.fWriteColor);
1034
1035 // Test with non-opaque alpha
1036 color = GrColorPackRGBA(123, 45, 67, 221);
1037 coverage = GrProcessorAnalysisCoverage::kLCD;
Brian Osman9a725dd2017-09-20 09:53:22 -04001038 TEST_ASSERT(!(GrXPFactory::GetAnalysisProperties(xpf, color, coverage, caps,
1039 GrPixelConfigIsClamped::kYes) &
Greg Danield7b11592017-06-14 13:37:12 -04001040 GrXPFactory::AnalysisProperties::kRequiresDstTexture));
Brian Salomond61c9d92017-04-10 10:54:25 -04001041 sk_sp<const GrXferProcessor> xp(
Brian Osman9a725dd2017-09-20 09:53:22 -04001042 GrXPFactory::MakeXferProcessor(xpf, color, coverage, false, caps,
1043 GrPixelConfigIsClamped::kYes));
cdalton6fd158e2015-05-27 15:08:33 -07001044 if (!xp) {
1045 ERRORF(reporter, "Failed to create an XP with LCD coverage.");
1046 return;
1047 }
1048
cdalton6fd158e2015-05-27 15:08:33 -07001049 xp->getBlendInfo(&blendInfo);
1050 TEST_ASSERT(blendInfo.fWriteColor);
1051}
1052
Brian Salomondcfca432017-11-15 15:48:03 -05001053DEF_GPUTEST(PorterDuffNoDualSourceBlending, reporter, options) {
1054 GrContextOptions opts = options;
cdalton6fd158e2015-05-27 15:08:33 -07001055 opts.fSuppressDualSourceBlending = true;
bsalomon3724e572016-03-30 18:56:19 -07001056 sk_gpu_test::GrContextFactory mockFactory(opts);
bsalomon85b4b532016-04-05 11:06:27 -07001057 GrContext* ctx = mockFactory.get(sk_gpu_test::GrContextFactory::kNullGL_ContextType);
cdalton6fd158e2015-05-27 15:08:33 -07001058 if (!ctx) {
Ben Wagnerb4aab9a2017-08-16 10:53:04 -04001059 SK_ABORT("Failed to create null context without ARB_blend_func_extended.");
cdalton6fd158e2015-05-27 15:08:33 -07001060 return;
1061 }
1062
bsalomon76228632015-05-29 08:02:10 -07001063 const GrCaps& caps = *ctx->caps();
cdalton6fd158e2015-05-27 15:08:33 -07001064 if (caps.shaderCaps()->dualSourceBlendingSupport()) {
Ben Wagnerb4aab9a2017-08-16 10:53:04 -04001065 SK_ABORT("Null context failed to honor request for no ARB_blend_func_extended.");
cdalton6fd158e2015-05-27 15:08:33 -07001066 return;
1067 }
1068
Greg Daniel7ef28f32017-04-20 16:41:55 +00001069 GrBackendObject backendTexHandle =
bungeman6bd52842016-10-27 09:30:08 -07001070 ctx->getGpu()->createTestingOnlyBackendTexture(nullptr, 100, 100, kRGBA_8888_GrPixelConfig);
Greg Daniel7ef28f32017-04-20 16:41:55 +00001071 GrBackendTexture backendTex = GrTest::CreateBackendTexture(ctx->contextPriv().getBackend(),
1072 100,
1073 100,
1074 kRGBA_8888_GrPixelConfig,
Greg Daniel177e6952017-10-12 12:27:11 -04001075 GrMipMapped::kNo,
Greg Daniel7ef28f32017-04-20 16:41:55 +00001076 backendTexHandle);
1077
Robert Phillipsbb581ce2017-05-29 15:05:15 -04001078 GrXferProcessor::DstProxy fakeDstProxy;
1079 {
1080 sk_sp<GrTextureProxy> proxy = GrSurfaceProxy::MakeWrappedBackend(ctx, backendTex,
1081 kTopLeft_GrSurfaceOrigin);
1082 fakeDstProxy.setProxy(std::move(proxy));
1083 }
cdalton6fd158e2015-05-27 15:08:33 -07001084
Brian Salomona811b122017-03-30 08:21:32 -04001085 static const GrProcessorAnalysisColor colorInputs[] = {
1086 GrProcessorAnalysisColor::Opaque::kNo, GrProcessorAnalysisColor::Opaque::kYes,
1087 GrProcessorAnalysisColor(GrColorPackRGBA(0, 82, 17, 100)),
1088 GrProcessorAnalysisColor(GrColorPackRGBA(0, 82, 17, 255))};
cdalton6fd158e2015-05-27 15:08:33 -07001089
Brian Salomonc6b71462017-02-14 11:33:01 -05001090 for (const auto& colorInput : colorInputs) {
Brian Salomona811b122017-03-30 08:21:32 -04001091 for (GrProcessorAnalysisCoverage coverageType :
1092 {GrProcessorAnalysisCoverage::kSingleChannel, GrProcessorAnalysisCoverage::kNone}) {
Mike Reed7d954ad2016-10-28 15:42:34 -04001093 for (int m = 0; m <= (int)SkBlendMode::kLastCoeffMode; m++) {
1094 SkBlendMode xfermode = static_cast<SkBlendMode>(m);
Brian Salomona1633922017-01-09 11:46:10 -05001095 const GrXPFactory* xpf = GrPorterDuffXPFactory::Get(xfermode);
Brian Salomond61c9d92017-04-10 10:54:25 -04001096 sk_sp<const GrXferProcessor> xp(
Brian Osman9a725dd2017-09-20 09:53:22 -04001097 GrXPFactory::MakeXferProcessor(xpf, colorInput, coverageType, false, caps,
1098 GrPixelConfigIsClamped::kYes));
cdalton6fd158e2015-05-27 15:08:33 -07001099 if (!xp) {
1100 ERRORF(reporter, "Failed to create an XP without dual source blending.");
1101 return;
1102 }
1103 TEST_ASSERT(!xp->hasSecondaryOutput());
cdalton6fd158e2015-05-27 15:08:33 -07001104 }
1105 }
1106 }
Greg Daniel7ef28f32017-04-20 16:41:55 +00001107 ctx->getGpu()->deleteTestingOnlyBackendTexture(backendTexHandle);
cdalton6fd158e2015-05-27 15:08:33 -07001108}
1109
1110#endif