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