1378092f3d10b1dd62967f419c35cfefec7c10ee7egdaniel/*
2378092f3d10b1dd62967f419c35cfefec7c10ee7egdaniel * Copyright 2014 Google Inc.
3378092f3d10b1dd62967f419c35cfefec7c10ee7egdaniel *
4378092f3d10b1dd62967f419c35cfefec7c10ee7egdaniel * Use of this source code is governed by a BSD-style license that can be
5378092f3d10b1dd62967f419c35cfefec7c10ee7egdaniel * found in the LICENSE file.
6378092f3d10b1dd62967f419c35cfefec7c10ee7egdaniel */
7378092f3d10b1dd62967f419c35cfefec7c10ee7egdaniel
8378092f3d10b1dd62967f419c35cfefec7c10ee7egdaniel#ifndef GrPorterDuffXferProcessor_DEFINED
9378092f3d10b1dd62967f419c35cfefec7c10ee7egdaniel#define GrPorterDuffXferProcessor_DEFINED
10378092f3d10b1dd62967f419c35cfefec7c10ee7egdaniel
11378092f3d10b1dd62967f419c35cfefec7c10ee7egdaniel#include "GrTypes.h"
12378092f3d10b1dd62967f419c35cfefec7c10ee7egdaniel#include "GrXferProcessor.h"
1371fecc32b1b4f71ef3c6467b1f5e0b55c2a12428Mike Reed#include "SkBlendMode.h"
14378092f3d10b1dd62967f419c35cfefec7c10ee7egdaniel
15a16339297859f37df69230e64f05624cef511ad3Brian Salomon// See the comment above GrXPFactory's definition about this warning suppression.
16a16339297859f37df69230e64f05624cef511ad3Brian Salomon#if defined(__GNUC__) || defined(__clang)
17a16339297859f37df69230e64f05624cef511ad3Brian Salomon#pragma GCC diagnostic push
18a16339297859f37df69230e64f05624cef511ad3Brian Salomon#pragma GCC diagnostic ignored "-Wnon-virtual-dtor"
19a16339297859f37df69230e64f05624cef511ad3Brian Salomon#endif
20f234272cbdcbcd46be462317e75cd138999c9fe9egdanielclass GrPorterDuffXPFactory : public GrXPFactory {
21378092f3d10b1dd62967f419c35cfefec7c10ee7egdanielpublic:
22a16339297859f37df69230e64f05624cef511ad3Brian Salomon    static const GrXPFactory* Get(SkBlendMode blendMode);
23c016fb8f9fb53dd8d4936c5e9e16a9dc99ab392eegdaniel
242047b7855546b21f7956c398592c070b3f91a9dbbsalomon    /** Because src-over is so common we special case it for performance reasons. If this returns
252047b7855546b21f7956c398592c070b3f91a9dbbsalomon        null then the SimpleSrcOverXP() below should be used. */
26c4b72720e75313079212e69e46a5ef7c474b2305egdaniel    static GrXferProcessor* CreateSrcOverXferProcessor(const GrCaps& caps,
275298dc8bf30f580f551d130346c007efaf4b2098Brian Salomon                                                       const FragmentProcessorAnalysis&,
28c4b72720e75313079212e69e46a5ef7c474b2305egdaniel                                                       bool hasMixedSamples,
29c4b72720e75313079212e69e46a5ef7c474b2305egdaniel                                                       const GrXferProcessor::DstTexture*);
30119fb2b9505aea87900d2cf5cf3573814bcae08ccsmartdalton
31119fb2b9505aea87900d2cf5cf3573814bcae08ccsmartdalton    /** Returns a simple non-LCD porter duff blend XP with no optimizations or coverage. */
32119fb2b9505aea87900d2cf5cf3573814bcae08ccsmartdalton    static sk_sp<GrXferProcessor> CreateNoCoverageXP(SkBlendMode);
33119fb2b9505aea87900d2cf5cf3573814bcae08ccsmartdalton
342047b7855546b21f7956c398592c070b3f91a9dbbsalomon    /** This XP implements non-LCD src-over using hw blend with no optimizations. It is returned
352047b7855546b21f7956c398592c070b3f91a9dbbsalomon        by reference because it is global and its ref-cnting methods are not thread safe. */
362047b7855546b21f7956c398592c070b3f91a9dbbsalomon    static const GrXferProcessor& SimpleSrcOverXP();
37c4b72720e75313079212e69e46a5ef7c474b2305egdaniel
385298dc8bf30f580f551d130346c007efaf4b2098Brian Salomon    static bool WillSrcOverNeedDstTexture(const GrCaps&, const FragmentProcessorAnalysis&);
39780b41fc10fb212ec6d9a9aeb7ca4cc0292fb85eBrian Salomon    static bool SrcOverIsCompatibleWithCoverageAsAlpha() { return true; }
4054d212e1bfaea0be88c3c40820d0b1ae0daebecfBrian Salomon    static bool SrcOverCanCombineOverlappedStencilAndCover(bool colorIsOpaque) {
4154d212e1bfaea0be88c3c40820d0b1ae0daebecfBrian Salomon        return colorIsOpaque;
4254d212e1bfaea0be88c3c40820d0b1ae0daebecfBrian Salomon    }
43c4b72720e75313079212e69e46a5ef7c474b2305egdaniel
44378092f3d10b1dd62967f419c35cfefec7c10ee7egdanielprivate:
45a16339297859f37df69230e64f05624cef511ad3Brian Salomon    constexpr GrPorterDuffXPFactory(SkBlendMode);
46915187b71d4068f21a15a1b8f4d919e1179d8b74egdaniel
4754d212e1bfaea0be88c3c40820d0b1ae0daebecfBrian Salomon    bool canCombineOverlappedStencilAndCover(bool colorIsOpaque) const override;
489a51498720e234b413e5a3c46d38ab40bda131deBrian Salomon
494b91f768b348aa1cebeb54f3ff9331938734c242bsalomon    GrXferProcessor* onCreateXferProcessor(const GrCaps& caps,
505298dc8bf30f580f551d130346c007efaf4b2098Brian Salomon                                           const FragmentProcessorAnalysis&,
5186ae0a9e465f157eaa263ef7515e10619946ff83cdalton                                           bool hasMixedSamples,
526a44c6a7d89b748fb040d41697a337d357d7fa22bsalomon                                           const DstTexture*) const override;
5350785a3d10b53bea5beb6e18431a2449860be237bsalomon
5442c456fd20bd45dd02f6d5eb0af7acf04341b1eeBrian Salomon    bool willReadDstInShader(const GrCaps&, const FragmentProcessorAnalysis&) const override;
5550785a3d10b53bea5beb6e18431a2449860be237bsalomon
56780b41fc10fb212ec6d9a9aeb7ca4cc0292fb85eBrian Salomon    bool compatibleWithCoverageAsAlpha(bool colorIsOpaque) const override;
57780b41fc10fb212ec6d9a9aeb7ca4cc0292fb85eBrian Salomon
58c230414861558ce20b74281b1ca363e56c441832egdaniel    GR_DECLARE_XP_FACTORY_TEST;
596fd158ea47472c4d038e48980a95e36623f840c9cdalton    static void TestGetXPOutputTypes(const GrXferProcessor*, int* outPrimary, int* outSecondary);
60c230414861558ce20b74281b1ca363e56c441832egdaniel
61a16339297859f37df69230e64f05624cef511ad3Brian Salomon    SkBlendMode fBlendMode;
62378092f3d10b1dd62967f419c35cfefec7c10ee7egdaniel
636fd158ea47472c4d038e48980a95e36623f840c9cdalton    friend class GrPorterDuffTest; // for TestGetXPOutputTypes()
64378092f3d10b1dd62967f419c35cfefec7c10ee7egdaniel    typedef GrXPFactory INHERITED;
65378092f3d10b1dd62967f419c35cfefec7c10ee7egdaniel};
66a16339297859f37df69230e64f05624cef511ad3Brian Salomon#if defined(__GNUC__) || defined(__clang)
67a16339297859f37df69230e64f05624cef511ad3Brian Salomon#pragma GCC diagnostic pop
68a16339297859f37df69230e64f05624cef511ad3Brian Salomon#endif
69378092f3d10b1dd62967f419c35cfefec7c10ee7egdaniel
70378092f3d10b1dd62967f419c35cfefec7c10ee7egdaniel#endif
71