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 "SkXfermode.h" 9 #include "Test.h" 10 11 #if SK_SUPPORT_GPU 12 13 #include "GrContextFactory.h" 14 #include "GrContextOptions.h" 15 #include "GrGpu.h" 16 #include "GrResourceProvider.h" 17 #include "GrXferProcessor.h" 18 #include "batches/GrVertexBatch.h" 19 #include "effects/GrPorterDuffXferProcessor.h" 20 #include "gl/GrGLCaps.h" 21 22 //////////////////////////////////////////////////////////////////////////////// 23 24 static void test_color_unknown_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps); 25 static void test_color_unknown_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps); 26 static void test_color_opaque_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps); 27 static void test_color_opaque_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps); 28 static void test_lcd_coverage(skiatest::Reporter* reporter, const GrCaps& caps); 29 static void test_lcd_coverage_fallback_case(skiatest::Reporter* reporter, const GrCaps& caps); 30 31 DEF_GPUTEST_FOR_NULL_CONTEXT(GrPorterDuff, reporter, context) { 32 const GrCaps& caps = *context->getGpu()->caps(); 33 if (!caps.shaderCaps()->dualSourceBlendingSupport()) { 34 SkFAIL("Null context does not support dual source blending."); 35 return; 36 } 37 38 test_color_unknown_with_coverage(reporter, caps); 39 test_color_unknown_no_coverage(reporter, caps); 40 test_color_opaque_with_coverage(reporter, caps); 41 test_color_opaque_no_coverage(reporter, caps); 42 test_lcd_coverage(reporter, caps); 43 test_lcd_coverage_fallback_case(reporter, caps); 44 } 45 46 //////////////////////////////////////////////////////////////////////////////// 47 48 #define TEST_ASSERT(...) REPORTER_ASSERT(reporter, __VA_ARGS__) 49 50 enum { 51 kNone_OutputType, 52 kCoverage_OutputType, 53 kModulate_OutputType, 54 kSAModulate_OutputType, 55 kISAModulate_OutputType, 56 kISCModulate_OutputType 57 }; 58 59 enum { 60 kNone_OptFlags = GrXferProcessor::kNone_OptFlags, 61 kSkipDraw_OptFlag = GrXferProcessor::kSkipDraw_OptFlag, 62 kIgnoreColor_OptFlag = GrXferProcessor::kIgnoreColor_OptFlag, 63 kIgnoreCoverage_OptFlag = GrXferProcessor::kIgnoreCoverage_OptFlag, 64 kCanTweakAlphaForCoverage_OptFlag = GrXferProcessor::kCanTweakAlphaForCoverage_OptFlag 65 }; 66 67 class GrPorterDuffTest { 68 public: 69 struct XPInfo { 70 XPInfo(skiatest::Reporter* reporter, SkXfermode::Mode xfermode, const GrCaps& caps, 71 const GrPipelineOptimizations& optimizations) { 72 SkAutoTUnref<GrXPFactory> xpf(GrPorterDuffXPFactory::Create(xfermode)); 73 SkAutoTUnref<GrXferProcessor> xp( 74 xpf->createXferProcessor(optimizations, false, nullptr, caps)); 75 TEST_ASSERT(!xpf->willNeedDstTexture(caps, optimizations, false)); 76 xpf->getInvariantBlendedColor(optimizations.fColorPOI, &fBlendedColor); 77 fOptFlags = xp->getOptimizations(optimizations, false, nullptr, caps); 78 GetXPOutputTypes(xp, &fPrimaryOutputType, &fSecondaryOutputType); 79 xp->getBlendInfo(&fBlendInfo); 80 TEST_ASSERT(!xp->willReadDstColor()); 81 TEST_ASSERT(xp->hasSecondaryOutput() == GrBlendCoeffRefsSrc2(fBlendInfo.fDstBlend)); 82 } 83 84 GrXPFactory::InvariantBlendedColor fBlendedColor; 85 int fOptFlags; 86 int fPrimaryOutputType; 87 int fSecondaryOutputType; 88 GrXferProcessor::BlendInfo fBlendInfo; 89 }; 90 91 static void GetXPOutputTypes(const GrXferProcessor* xp, int* outPrimary, int* outSecondary) { 92 GrPorterDuffXPFactory::TestGetXPOutputTypes(xp, outPrimary, outSecondary); 93 } 94 }; 95 96 static void test_lcd_coverage(skiatest::Reporter* reporter, const GrCaps& caps) { 97 GrPipelineOptimizations opt; 98 opt.fColorPOI.calcWithInitialValues(NULL, 0, 0, kNone_GrColorComponentFlags, false); 99 // Setting 2nd to last value to false and last to true will force covPOI to LCD coverage. 100 opt.fCoveragePOI.calcWithInitialValues(NULL, 0, 0, kNone_GrColorComponentFlags, false, true); 101 102 SkASSERT(!opt.fColorPOI.isOpaque()); 103 SkASSERT(!opt.fColorPOI.isSolidWhite()); 104 SkASSERT(!opt.fCoveragePOI.isSolidWhite()); 105 SkASSERT(opt.fCoveragePOI.isFourChannelOutput()); 106 107 for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) { 108 SkXfermode::Mode xfermode = static_cast<SkXfermode::Mode>(m); 109 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, opt); 110 111 switch (xfermode) { 112 case SkXfermode::kClear_Mode: 113 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst); 114 TEST_ASSERT(0 == xpi.fBlendedColor.fKnownColor); 115 TEST_ASSERT(kRGBA_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); 116 TEST_ASSERT((kIgnoreColor_OptFlag) == xpi.fOptFlags); 117 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType); 118 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); 119 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation); 120 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); 121 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); 122 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); 123 break; 124 case SkXfermode::kSrc_Mode: 125 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst); 126 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); 127 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags); 128 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); 129 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType); 130 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); 131 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); 132 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); 133 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); 134 break; 135 case SkXfermode::kDst_Mode: 136 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst); 137 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); 138 TEST_ASSERT((kSkipDraw_OptFlag | 139 kIgnoreColor_OptFlag | 140 kIgnoreCoverage_OptFlag | 141 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags); 142 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType); 143 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); 144 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); 145 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); 146 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); 147 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor); 148 break; 149 case SkXfermode::kSrcOver_Mode: 150 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst); 151 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); 152 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags); 153 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); 154 TEST_ASSERT(kSAModulate_OutputType == xpi.fSecondaryOutputType); 155 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); 156 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); 157 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); 158 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); 159 break; 160 case SkXfermode::kDstOver_Mode: 161 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst); 162 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); 163 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags); 164 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); 165 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); 166 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); 167 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); 168 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); 169 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); 170 break; 171 case SkXfermode::kSrcIn_Mode: 172 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst); 173 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); 174 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags); 175 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); 176 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType); 177 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); 178 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); 179 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); 180 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); 181 break; 182 case SkXfermode::kDstIn_Mode: 183 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst); 184 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); 185 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags); 186 TEST_ASSERT(kISAModulate_OutputType == xpi.fPrimaryOutputType); 187 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); 188 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation); 189 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); 190 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); 191 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); 192 break; 193 case SkXfermode::kSrcOut_Mode: 194 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst); 195 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); 196 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags); 197 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); 198 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType); 199 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); 200 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); 201 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); 202 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); 203 break; 204 case SkXfermode::kDstOut_Mode: 205 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst); 206 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); 207 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags); 208 TEST_ASSERT(kSAModulate_OutputType == xpi.fPrimaryOutputType); 209 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); 210 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); 211 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); 212 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); 213 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); 214 break; 215 case SkXfermode::kSrcATop_Mode: 216 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst); 217 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); 218 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags); 219 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); 220 TEST_ASSERT(kSAModulate_OutputType == xpi.fSecondaryOutputType); 221 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); 222 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); 223 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); 224 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); 225 break; 226 case SkXfermode::kDstATop_Mode: 227 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst); 228 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); 229 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags); 230 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); 231 TEST_ASSERT(kISAModulate_OutputType == xpi.fSecondaryOutputType); 232 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); 233 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); 234 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); 235 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); 236 break; 237 case SkXfermode::kXor_Mode: 238 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst); 239 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); 240 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags); 241 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); 242 TEST_ASSERT(kSAModulate_OutputType == xpi.fSecondaryOutputType); 243 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); 244 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); 245 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); 246 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); 247 break; 248 case SkXfermode::kPlus_Mode: 249 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst); 250 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); 251 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags); 252 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); 253 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); 254 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); 255 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); 256 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); 257 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); 258 break; 259 case SkXfermode::kModulate_Mode: 260 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst); 261 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); 262 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags); 263 TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType); 264 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); 265 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation); 266 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); 267 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); 268 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); 269 break; 270 case SkXfermode::kScreen_Mode: 271 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst); 272 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); 273 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags); 274 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); 275 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); 276 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); 277 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); 278 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); 279 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); 280 break; 281 default: 282 ERRORF(reporter, "Invalid xfermode."); 283 break; 284 } 285 } 286 } 287 static void test_color_unknown_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps) { 288 GrPipelineOptimizations optimizations; 289 optimizations.fColorPOI.calcWithInitialValues(nullptr, 0, 0, kNone_GrColorComponentFlags, 290 false); 291 optimizations.fCoveragePOI.calcWithInitialValues(nullptr, 0, 0, kNone_GrColorComponentFlags, 292 true); 293 294 SkASSERT(!optimizations.fColorPOI.isOpaque()); 295 SkASSERT(!optimizations.fColorPOI.isSolidWhite()); 296 SkASSERT(!optimizations.fCoveragePOI.isSolidWhite()); 297 SkASSERT(!optimizations.fCoveragePOI.isFourChannelOutput()); 298 299 for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) { 300 SkXfermode::Mode xfermode = static_cast<SkXfermode::Mode>(m); 301 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, optimizations); 302 303 304 switch (xfermode) { 305 case SkXfermode::kClear_Mode: 306 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst); 307 TEST_ASSERT(0 == xpi.fBlendedColor.fKnownColor); 308 TEST_ASSERT(kRGBA_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); 309 TEST_ASSERT((kIgnoreColor_OptFlag) == xpi.fOptFlags); 310 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType); 311 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); 312 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation); 313 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); 314 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); 315 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); 316 break; 317 case SkXfermode::kSrc_Mode: 318 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst); 319 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); 320 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags); 321 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); 322 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType); 323 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); 324 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); 325 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); 326 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); 327 break; 328 case SkXfermode::kDst_Mode: 329 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst); 330 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); 331 TEST_ASSERT((kSkipDraw_OptFlag | 332 kIgnoreColor_OptFlag | 333 kIgnoreCoverage_OptFlag | 334 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags); 335 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType); 336 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); 337 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); 338 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); 339 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); 340 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor); 341 break; 342 case SkXfermode::kSrcOver_Mode: 343 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst); 344 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); 345 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags); 346 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); 347 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); 348 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); 349 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); 350 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); 351 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); 352 break; 353 case SkXfermode::kDstOver_Mode: 354 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst); 355 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); 356 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags); 357 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); 358 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); 359 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); 360 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); 361 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); 362 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); 363 break; 364 case SkXfermode::kSrcIn_Mode: 365 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst); 366 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); 367 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags); 368 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); 369 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType); 370 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); 371 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); 372 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); 373 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); 374 break; 375 case SkXfermode::kDstIn_Mode: 376 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst); 377 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); 378 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags); 379 TEST_ASSERT(kISAModulate_OutputType == xpi.fPrimaryOutputType); 380 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); 381 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation); 382 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); 383 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); 384 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); 385 break; 386 case SkXfermode::kSrcOut_Mode: 387 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst); 388 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); 389 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags); 390 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); 391 TEST_ASSERT(kCoverage_OutputType == xpi.fSecondaryOutputType); 392 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); 393 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); 394 TEST_ASSERT(kIS2A_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); 395 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); 396 break; 397 case SkXfermode::kDstOut_Mode: 398 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst); 399 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); 400 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags); 401 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); 402 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); 403 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); 404 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); 405 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); 406 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); 407 break; 408 case SkXfermode::kSrcATop_Mode: 409 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst); 410 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); 411 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags); 412 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); 413 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); 414 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); 415 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); 416 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); 417 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); 418 break; 419 case SkXfermode::kDstATop_Mode: 420 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst); 421 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); 422 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags); 423 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); 424 TEST_ASSERT(kISAModulate_OutputType == xpi.fSecondaryOutputType); 425 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); 426 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); 427 TEST_ASSERT(kIS2C_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); 428 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); 429 break; 430 case SkXfermode::kXor_Mode: 431 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst); 432 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); 433 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags); 434 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); 435 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); 436 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); 437 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); 438 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); 439 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); 440 break; 441 case SkXfermode::kPlus_Mode: 442 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst); 443 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); 444 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags); 445 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); 446 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); 447 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); 448 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); 449 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); 450 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); 451 break; 452 case SkXfermode::kModulate_Mode: 453 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst); 454 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); 455 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags); 456 TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType); 457 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); 458 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation); 459 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); 460 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); 461 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); 462 break; 463 case SkXfermode::kScreen_Mode: 464 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst); 465 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); 466 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags); 467 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); 468 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); 469 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); 470 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); 471 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); 472 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); 473 break; 474 default: 475 ERRORF(reporter, "Invalid xfermode."); 476 break; 477 } 478 } 479 } 480 481 static void test_color_unknown_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps) { 482 GrPipelineOptimizations optimizations; 483 optimizations.fColorPOI.calcWithInitialValues(nullptr, 0, GrColorPackRGBA(229, 0, 154, 0), 484 kR_GrColorComponentFlag | kB_GrColorComponentFlag, false); 485 optimizations.fCoveragePOI.calcWithInitialValues(nullptr, 0, GrColorPackA4(255), 486 kRGBA_GrColorComponentFlags, true); 487 488 SkASSERT(!optimizations.fColorPOI.isOpaque()); 489 SkASSERT(!optimizations.fColorPOI.isSolidWhite()); 490 SkASSERT(optimizations.fCoveragePOI.isSolidWhite()); 491 SkASSERT(!optimizations.fCoveragePOI.isFourChannelOutput()); 492 493 for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) { 494 SkXfermode::Mode xfermode = static_cast<SkXfermode::Mode>(m); 495 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, optimizations); 496 497 switch (xfermode) { 498 case SkXfermode::kClear_Mode: 499 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst); 500 TEST_ASSERT(0 == xpi.fBlendedColor.fKnownColor); 501 TEST_ASSERT(kRGBA_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); 502 TEST_ASSERT((kIgnoreColor_OptFlag | 503 kIgnoreCoverage_OptFlag) == xpi.fOptFlags); 504 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType); 505 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); 506 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); 507 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); 508 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); 509 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); 510 break; 511 case SkXfermode::kSrc_Mode: 512 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst); 513 TEST_ASSERT(229 == GrColorUnpackR(xpi.fBlendedColor.fKnownColor)); 514 TEST_ASSERT(154 == GrColorUnpackB(xpi.fBlendedColor.fKnownColor)); 515 TEST_ASSERT((kR_GrColorComponentFlag | 516 kB_GrColorComponentFlag) == xpi.fBlendedColor.fKnownColorFlags); 517 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags); 518 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); 519 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); 520 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); 521 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); 522 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); 523 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); 524 break; 525 case SkXfermode::kDst_Mode: 526 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst); 527 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); 528 TEST_ASSERT((kSkipDraw_OptFlag | 529 kIgnoreColor_OptFlag | 530 kIgnoreCoverage_OptFlag | 531 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags); 532 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType); 533 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); 534 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); 535 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); 536 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); 537 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor); 538 break; 539 case SkXfermode::kSrcOver_Mode: 540 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst); 541 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); 542 TEST_ASSERT((kIgnoreCoverage_OptFlag | 543 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags); 544 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); 545 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); 546 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); 547 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); 548 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); 549 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); 550 break; 551 case SkXfermode::kDstOver_Mode: 552 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst); 553 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); 554 TEST_ASSERT((kIgnoreCoverage_OptFlag | 555 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags); 556 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); 557 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); 558 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); 559 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); 560 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); 561 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); 562 break; 563 case SkXfermode::kSrcIn_Mode: 564 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst); 565 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); 566 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags); 567 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); 568 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); 569 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); 570 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); 571 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); 572 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); 573 break; 574 case SkXfermode::kDstIn_Mode: 575 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst); 576 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); 577 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags); 578 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); 579 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); 580 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); 581 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); 582 TEST_ASSERT(kSA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); 583 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); 584 break; 585 case SkXfermode::kSrcOut_Mode: 586 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst); 587 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); 588 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags); 589 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); 590 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); 591 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); 592 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); 593 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); 594 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); 595 break; 596 case SkXfermode::kDstOut_Mode: 597 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst); 598 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); 599 TEST_ASSERT((kIgnoreCoverage_OptFlag | 600 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags); 601 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); 602 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); 603 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); 604 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); 605 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); 606 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); 607 break; 608 case SkXfermode::kSrcATop_Mode: 609 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst); 610 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); 611 TEST_ASSERT((kIgnoreCoverage_OptFlag | 612 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags); 613 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); 614 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); 615 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); 616 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); 617 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); 618 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); 619 break; 620 case SkXfermode::kDstATop_Mode: 621 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst); 622 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); 623 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags); 624 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); 625 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); 626 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); 627 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); 628 TEST_ASSERT(kSA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); 629 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); 630 break; 631 case SkXfermode::kXor_Mode: 632 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst); 633 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); 634 TEST_ASSERT((kIgnoreCoverage_OptFlag | 635 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags); 636 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); 637 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); 638 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); 639 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); 640 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); 641 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); 642 break; 643 case SkXfermode::kPlus_Mode: 644 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst); 645 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); 646 TEST_ASSERT((kIgnoreCoverage_OptFlag | 647 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags); 648 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); 649 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); 650 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); 651 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); 652 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); 653 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); 654 break; 655 case SkXfermode::kModulate_Mode: 656 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst); 657 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); 658 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags); 659 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); 660 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); 661 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); 662 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); 663 TEST_ASSERT(kSC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); 664 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); 665 break; 666 case SkXfermode::kScreen_Mode: 667 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst); 668 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); 669 TEST_ASSERT((kIgnoreCoverage_OptFlag | 670 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags); 671 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); 672 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); 673 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); 674 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); 675 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); 676 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); 677 break; 678 default: 679 ERRORF(reporter, "Invalid xfermode."); 680 break; 681 } 682 } 683 } 684 685 static void test_color_opaque_with_coverage(skiatest::Reporter* reporter, const GrCaps& caps) { 686 GrPipelineOptimizations optimizations; 687 optimizations.fColorPOI.calcWithInitialValues(nullptr, 0, GrColorPackA4(255), 688 kA_GrColorComponentFlag, false); 689 optimizations.fCoveragePOI.calcWithInitialValues(nullptr, 0, 0, kNone_GrColorComponentFlags, 690 true); 691 692 SkASSERT(optimizations.fColorPOI.isOpaque()); 693 SkASSERT(!optimizations.fColorPOI.isSolidWhite()); 694 SkASSERT(!optimizations.fCoveragePOI.isSolidWhite()); 695 SkASSERT(!optimizations.fCoveragePOI.isFourChannelOutput()); 696 697 for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) { 698 SkXfermode::Mode xfermode = static_cast<SkXfermode::Mode>(m); 699 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, optimizations); 700 701 switch (xfermode) { 702 case SkXfermode::kClear_Mode: 703 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst); 704 TEST_ASSERT(0 == xpi.fBlendedColor.fKnownColor); 705 TEST_ASSERT(kRGBA_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); 706 TEST_ASSERT((kIgnoreColor_OptFlag) == xpi.fOptFlags); 707 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType); 708 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); 709 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation); 710 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); 711 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); 712 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); 713 break; 714 case SkXfermode::kSrc_Mode: 715 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst); 716 TEST_ASSERT(255 == GrColorUnpackA(xpi.fBlendedColor.fKnownColor)); 717 TEST_ASSERT(kA_GrColorComponentFlag == xpi.fBlendedColor.fKnownColorFlags); 718 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags); 719 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); 720 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); 721 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); 722 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); 723 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); 724 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); 725 break; 726 case SkXfermode::kDst_Mode: 727 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst); 728 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); 729 TEST_ASSERT((kSkipDraw_OptFlag | 730 kIgnoreColor_OptFlag | 731 kIgnoreCoverage_OptFlag | 732 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags); 733 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; 740 case SkXfermode::kSrcOver_Mode: 741 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst); 742 TEST_ASSERT(255 == GrColorUnpackA(xpi.fBlendedColor.fKnownColor)); 743 TEST_ASSERT(kA_GrColorComponentFlag == xpi.fBlendedColor.fKnownColorFlags); 744 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags); 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(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); 749 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); 750 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); 751 break; 752 case SkXfermode::kDstOver_Mode: 753 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst); 754 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); 755 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags); 756 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); 757 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); 758 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); 759 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); 760 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); 761 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); 762 break; 763 case SkXfermode::kSrcIn_Mode: 764 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst); 765 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); 766 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags); 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 SkXfermode::kDstIn_Mode: 775 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst); 776 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); 777 TEST_ASSERT((kSkipDraw_OptFlag | 778 kIgnoreColor_OptFlag | 779 kIgnoreCoverage_OptFlag | 780 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags); 781 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType); 782 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); 783 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); 784 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); 785 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); 786 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor); 787 break; 788 case SkXfermode::kSrcOut_Mode: 789 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst); 790 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); 791 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags); 792 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); 793 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); 794 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); 795 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); 796 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); 797 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); 798 break; 799 case SkXfermode::kDstOut_Mode: 800 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst); 801 TEST_ASSERT(0 == xpi.fBlendedColor.fKnownColor); 802 TEST_ASSERT(kRGBA_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); 803 TEST_ASSERT((kIgnoreColor_OptFlag) == xpi.fOptFlags); 804 TEST_ASSERT(kCoverage_OutputType == xpi.fPrimaryOutputType); 805 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); 806 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation); 807 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); 808 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); 809 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); 810 break; 811 case SkXfermode::kSrcATop_Mode: 812 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst); 813 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); 814 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags); 815 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); 816 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); 817 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); 818 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); 819 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); 820 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); 821 break; 822 case SkXfermode::kDstATop_Mode: 823 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst); 824 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); 825 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags); 826 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); 827 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); 828 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); 829 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); 830 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); 831 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); 832 break; 833 case SkXfermode::kXor_Mode: 834 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst); 835 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); 836 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags); 837 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); 838 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); 839 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); 840 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); 841 TEST_ASSERT(kISA_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); 842 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); 843 break; 844 case SkXfermode::kPlus_Mode: 845 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst); 846 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); 847 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags); 848 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); 849 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); 850 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); 851 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); 852 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); 853 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); 854 break; 855 case SkXfermode::kModulate_Mode: 856 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst); 857 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); 858 TEST_ASSERT((kNone_OptFlags) == xpi.fOptFlags); 859 TEST_ASSERT(kISCModulate_OutputType == xpi.fPrimaryOutputType); 860 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); 861 TEST_ASSERT(kReverseSubtract_GrBlendEquation == xpi.fBlendInfo.fEquation); 862 TEST_ASSERT(kDC_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); 863 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); 864 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); 865 break; 866 case SkXfermode::kScreen_Mode: 867 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst); 868 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); 869 TEST_ASSERT((kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags); 870 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); 871 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); 872 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); 873 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); 874 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); 875 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); 876 break; 877 default: 878 ERRORF(reporter, "Invalid xfermode."); 879 break; 880 } 881 } 882 } 883 884 static void test_color_opaque_no_coverage(skiatest::Reporter* reporter, const GrCaps& caps) { 885 GrPipelineOptimizations optimizations; 886 optimizations.fColorPOI.calcWithInitialValues(nullptr, 0, GrColorPackRGBA(0, 82, 0, 255), 887 kG_GrColorComponentFlag | kA_GrColorComponentFlag, false); 888 optimizations.fCoveragePOI.calcWithInitialValues(nullptr, 0, GrColorPackA4(255), 889 kRGBA_GrColorComponentFlags, true); 890 891 SkASSERT(optimizations.fColorPOI.isOpaque()); 892 SkASSERT(!optimizations.fColorPOI.isSolidWhite()); 893 SkASSERT(optimizations.fCoveragePOI.isSolidWhite()); 894 SkASSERT(!optimizations.fCoveragePOI.isFourChannelOutput()); 895 896 for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) { 897 SkXfermode::Mode xfermode = static_cast<SkXfermode::Mode>(m); 898 const GrPorterDuffTest::XPInfo xpi(reporter, xfermode, caps, optimizations); 899 900 switch (xfermode) { 901 case SkXfermode::kClear_Mode: 902 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst); 903 TEST_ASSERT(0 == xpi.fBlendedColor.fKnownColor); 904 TEST_ASSERT(kRGBA_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); 905 TEST_ASSERT((kIgnoreColor_OptFlag | 906 kIgnoreCoverage_OptFlag) == xpi.fOptFlags); 907 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType); 908 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); 909 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); 910 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); 911 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); 912 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); 913 break; 914 case SkXfermode::kSrc_Mode: 915 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst); 916 TEST_ASSERT(82 == GrColorUnpackG(xpi.fBlendedColor.fKnownColor)); 917 TEST_ASSERT(255 == GrColorUnpackA(xpi.fBlendedColor.fKnownColor)); 918 TEST_ASSERT((kG_GrColorComponentFlag | 919 kA_GrColorComponentFlag) == xpi.fBlendedColor.fKnownColorFlags); 920 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags); 921 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); 922 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); 923 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); 924 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); 925 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); 926 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); 927 break; 928 case SkXfermode::kDst_Mode: 929 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst); 930 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); 931 TEST_ASSERT((kSkipDraw_OptFlag | 932 kIgnoreColor_OptFlag | 933 kIgnoreCoverage_OptFlag | 934 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags); 935 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType); 936 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); 937 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); 938 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); 939 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); 940 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor); 941 break; 942 case SkXfermode::kSrcOver_Mode: 943 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst); 944 TEST_ASSERT(82 == GrColorUnpackG(xpi.fBlendedColor.fKnownColor)); 945 TEST_ASSERT(255 == GrColorUnpackA(xpi.fBlendedColor.fKnownColor)); 946 TEST_ASSERT((kG_GrColorComponentFlag | 947 kA_GrColorComponentFlag) == xpi.fBlendedColor.fKnownColorFlags); 948 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags); 949 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); 950 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); 951 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); 952 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); 953 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); 954 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); 955 break; 956 case SkXfermode::kDstOver_Mode: 957 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst); 958 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); 959 TEST_ASSERT((kIgnoreCoverage_OptFlag | 960 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags); 961 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); 962 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); 963 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); 964 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); 965 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); 966 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); 967 break; 968 case SkXfermode::kSrcIn_Mode: 969 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst); 970 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); 971 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags); 972 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); 973 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); 974 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); 975 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); 976 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); 977 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); 978 break; 979 case SkXfermode::kDstIn_Mode: 980 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst); 981 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); 982 TEST_ASSERT((kSkipDraw_OptFlag | 983 kIgnoreColor_OptFlag | 984 kIgnoreCoverage_OptFlag | 985 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags); 986 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType); 987 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); 988 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); 989 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); 990 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); 991 TEST_ASSERT(!xpi.fBlendInfo.fWriteColor); 992 break; 993 case SkXfermode::kSrcOut_Mode: 994 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst); 995 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); 996 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags); 997 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); 998 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); 999 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); 1000 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); 1001 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); 1002 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); 1003 break; 1004 case SkXfermode::kDstOut_Mode: 1005 TEST_ASSERT(!xpi.fBlendedColor.fWillBlendWithDst); 1006 TEST_ASSERT(0 == xpi.fBlendedColor.fKnownColor); 1007 TEST_ASSERT(kRGBA_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); 1008 TEST_ASSERT((kIgnoreColor_OptFlag | 1009 kIgnoreCoverage_OptFlag) == xpi.fOptFlags); 1010 TEST_ASSERT(kNone_OutputType == xpi.fPrimaryOutputType); 1011 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); 1012 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); 1013 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); 1014 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); 1015 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); 1016 break; 1017 case SkXfermode::kSrcATop_Mode: 1018 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst); 1019 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); 1020 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags); 1021 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); 1022 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); 1023 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); 1024 TEST_ASSERT(kDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); 1025 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); 1026 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); 1027 break; 1028 case SkXfermode::kDstATop_Mode: 1029 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst); 1030 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); 1031 TEST_ASSERT((kIgnoreCoverage_OptFlag | 1032 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags); 1033 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); 1034 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); 1035 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); 1036 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); 1037 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); 1038 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); 1039 break; 1040 case SkXfermode::kXor_Mode: 1041 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst); 1042 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); 1043 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags); 1044 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); 1045 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); 1046 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); 1047 TEST_ASSERT(kIDA_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); 1048 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); 1049 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); 1050 break; 1051 case SkXfermode::kPlus_Mode: 1052 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst); 1053 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); 1054 TEST_ASSERT((kIgnoreCoverage_OptFlag | 1055 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags); 1056 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); 1057 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); 1058 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); 1059 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); 1060 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); 1061 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); 1062 break; 1063 case SkXfermode::kModulate_Mode: 1064 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst); 1065 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); 1066 TEST_ASSERT((kIgnoreCoverage_OptFlag) == xpi.fOptFlags); 1067 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); 1068 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); 1069 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); 1070 TEST_ASSERT(kZero_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); 1071 TEST_ASSERT(kSC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); 1072 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); 1073 break; 1074 case SkXfermode::kScreen_Mode: 1075 TEST_ASSERT(xpi.fBlendedColor.fWillBlendWithDst); 1076 TEST_ASSERT(kNone_GrColorComponentFlags == xpi.fBlendedColor.fKnownColorFlags); 1077 TEST_ASSERT((kIgnoreCoverage_OptFlag | 1078 kCanTweakAlphaForCoverage_OptFlag) == xpi.fOptFlags); 1079 TEST_ASSERT(kModulate_OutputType == xpi.fPrimaryOutputType); 1080 TEST_ASSERT(kNone_OutputType == xpi.fSecondaryOutputType); 1081 TEST_ASSERT(kAdd_GrBlendEquation == xpi.fBlendInfo.fEquation); 1082 TEST_ASSERT(kOne_GrBlendCoeff == xpi.fBlendInfo.fSrcBlend); 1083 TEST_ASSERT(kISC_GrBlendCoeff == xpi.fBlendInfo.fDstBlend); 1084 TEST_ASSERT(xpi.fBlendInfo.fWriteColor); 1085 break; 1086 default: 1087 ERRORF(reporter, "Invalid xfermode."); 1088 break; 1089 } 1090 } 1091 } 1092 1093 static void test_lcd_coverage_fallback_case(skiatest::Reporter* reporter, const GrCaps& caps) { 1094 class TestLCDCoverageBatch: public GrVertexBatch { 1095 public: 1096 DEFINE_BATCH_CLASS_ID 1097 1098 TestLCDCoverageBatch() : INHERITED(ClassID()) {} 1099 1100 private: 1101 void computePipelineOptimizations(GrInitInvariantOutput* color, 1102 GrInitInvariantOutput* coverage, 1103 GrBatchToXPOverrides* overrides) const override { 1104 color->setKnownFourComponents(GrColorPackRGBA(123, 45, 67, 221)); 1105 coverage->setUnknownFourComponents(); 1106 coverage->setUsingLCDCoverage(); } 1107 1108 const char* name() const override { return "Test LCD Text Batch"; } 1109 void initBatchTracker(const GrXPOverridesForBatch&) override {} 1110 bool onCombineIfPossible(GrBatch*, const GrCaps&) override { return false; } 1111 void onPrepareDraws(Target*) const override {}; 1112 1113 typedef GrVertexBatch INHERITED; 1114 } testLCDCoverageBatch; 1115 1116 GrPipelineOptimizations opts; 1117 testLCDCoverageBatch.getPipelineOptimizations(&opts); 1118 GrProcOptInfo colorPOI = opts.fColorPOI; 1119 GrProcOptInfo covPOI = opts.fCoveragePOI; 1120 1121 SkASSERT(kRGBA_GrColorComponentFlags == colorPOI.validFlags()); 1122 SkASSERT(covPOI.isFourChannelOutput()); 1123 1124 SkAutoTUnref<GrXPFactory> xpf(GrPorterDuffXPFactory::Create(SkXfermode::kSrcOver_Mode)); 1125 TEST_ASSERT(!xpf->willNeedDstTexture(caps, opts, false)); 1126 1127 SkAutoTUnref<GrXferProcessor> xp( 1128 xpf->createXferProcessor(opts, false, nullptr, caps)); 1129 if (!xp) { 1130 ERRORF(reporter, "Failed to create an XP with LCD coverage."); 1131 return; 1132 } 1133 1134 GrXPFactory::InvariantBlendedColor blendedColor; 1135 xpf->getInvariantBlendedColor(colorPOI, &blendedColor); 1136 TEST_ASSERT(blendedColor.fWillBlendWithDst); 1137 TEST_ASSERT(kNone_GrColorComponentFlags == blendedColor.fKnownColorFlags); 1138 1139 GrColor overrideColor; 1140 xp->getOptimizations(opts, false, &overrideColor, caps); 1141 1142 GrXferProcessor::BlendInfo blendInfo; 1143 xp->getBlendInfo(&blendInfo); 1144 TEST_ASSERT(blendInfo.fWriteColor); 1145 } 1146 1147 DEF_GPUTEST(PorterDuffNoDualSourceBlending, reporter, /*factory*/) { 1148 GrContextOptions opts; 1149 opts.fSuppressDualSourceBlending = true; 1150 GrContextFactory mockFactory(opts); 1151 GrContext* ctx = mockFactory.get(GrContextFactory::kNull_GLContextType); 1152 if (!ctx) { 1153 SkFAIL("Failed to create null context without ARB_blend_func_extended."); 1154 return; 1155 } 1156 1157 const GrCaps& caps = *ctx->caps(); 1158 if (caps.shaderCaps()->dualSourceBlendingSupport()) { 1159 SkFAIL("Null context failed to honor request for no ARB_blend_func_extended."); 1160 return; 1161 } 1162 1163 GrBackendObject backendTex = 1164 ctx->getGpu()->createTestingOnlyBackendTexture(nullptr, 100, 100, 1165 kRGBA_8888_GrPixelConfig); 1166 GrBackendTextureDesc fakeDesc; 1167 fakeDesc.fConfig = kRGBA_8888_GrPixelConfig; 1168 fakeDesc.fWidth = fakeDesc.fHeight = 100; 1169 fakeDesc.fTextureHandle = backendTex; 1170 SkAutoTUnref<GrTexture> fakeTexture(ctx->textureProvider()->wrapBackendTexture(fakeDesc, 1171 kBorrow_GrWrapOwnership)); 1172 GrXferProcessor::DstTexture fakeDstTexture; 1173 fakeDstTexture.setTexture(fakeTexture); 1174 1175 static const GrColor testColors[] = { 1176 0, 1177 GrColorPackRGBA(0, 82, 0, 255), 1178 GrColorPackA4(255) 1179 }; 1180 static const GrColorComponentFlags testColorFlags[] = { 1181 kNone_GrColorComponentFlags, 1182 kG_GrColorComponentFlag | kA_GrColorComponentFlag, 1183 kRGBA_GrColorComponentFlags 1184 }; 1185 GR_STATIC_ASSERT(SK_ARRAY_COUNT(testColors) == SK_ARRAY_COUNT(testColorFlags)); 1186 1187 for (size_t c = 0; c < SK_ARRAY_COUNT(testColors); c++) { 1188 GrPipelineOptimizations optimizations; 1189 optimizations.fColorPOI.calcWithInitialValues(nullptr, 0, testColors[c], testColorFlags[c], 1190 false); 1191 for (int f = 0; f <= 1; f++) { 1192 if (!f) { 1193 optimizations.fCoveragePOI.calcWithInitialValues(nullptr, 0, 0, 1194 kNone_GrColorComponentFlags, true); 1195 } else { 1196 optimizations.fCoveragePOI.calcWithInitialValues(nullptr, 0, GrColorPackA4(255), 1197 kRGBA_GrColorComponentFlags, true); 1198 } 1199 for (int m = 0; m <= SkXfermode::kLastCoeffMode; m++) { 1200 SkXfermode::Mode xfermode = static_cast<SkXfermode::Mode>(m); 1201 SkAutoTUnref<GrXPFactory> xpf(GrPorterDuffXPFactory::Create(xfermode)); 1202 GrXferProcessor::DstTexture* dstTexture = 1203 xpf->willNeedDstTexture(caps, optimizations, false) ? &fakeDstTexture : 0; 1204 SkAutoTUnref<GrXferProcessor> xp( 1205 xpf->createXferProcessor(optimizations, false, dstTexture, caps)); 1206 if (!xp) { 1207 ERRORF(reporter, "Failed to create an XP without dual source blending."); 1208 return; 1209 } 1210 TEST_ASSERT(!xp->hasSecondaryOutput()); 1211 xp->getOptimizations(optimizations, false, 0, caps); 1212 TEST_ASSERT(!xp->hasSecondaryOutput()); 1213 } 1214 } 1215 } 1216 ctx->getGpu()->deleteTestingOnlyBackendTexture(backendTex); 1217 } 1218 1219 #endif 1220 1221