Home | History | Annotate | Download | only in tests
      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