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