Brian Salomon | 92ce594 | 2017-01-18 11:01:10 -0500 | [diff] [blame] | 1 | /* |
| 2 | * Copyright 2017 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 | #ifndef GrProcessorSet_DEFINED |
| 9 | #define GrProcessorSet_DEFINED |
| 10 | |
| 11 | #include "GrFragmentProcessor.h" |
| 12 | #include "GrPaint.h" |
Brian Salomon | a811b12 | 2017-03-30 08:21:32 -0400 | [diff] [blame] | 13 | #include "GrProcessorAnalysis.h" |
Brian Salomon | 92ce594 | 2017-01-18 11:01:10 -0500 | [diff] [blame] | 14 | #include "SkTemplates.h" |
| 15 | |
Brian Salomon | 5298dc8 | 2017-02-22 11:52:03 -0500 | [diff] [blame] | 16 | class GrAppliedClip; |
Brian Salomon | 48d1b4c | 2017-04-08 07:38:53 -0400 | [diff] [blame] | 17 | class GrXferProcessor; |
Brian Salomon | 92ce594 | 2017-01-18 11:01:10 -0500 | [diff] [blame] | 18 | class GrXPFactory; |
| 19 | |
| 20 | class GrProcessorSet : private SkNoncopyable { |
| 21 | public: |
| 22 | GrProcessorSet(GrPaint&& paint); |
| 23 | |
Brian Salomon | 54d212e | 2017-03-21 14:22:38 -0400 | [diff] [blame] | 24 | ~GrProcessorSet(); |
| 25 | |
Brian Salomon | 92ce594 | 2017-01-18 11:01:10 -0500 | [diff] [blame] | 26 | int numColorFragmentProcessors() const { return fColorFragmentProcessorCnt; } |
| 27 | int numCoverageFragmentProcessors() const { |
Brian Salomon | 70288c0 | 2017-03-24 12:27:17 -0400 | [diff] [blame] | 28 | return this->numFragmentProcessors() - fColorFragmentProcessorCnt; |
Brian Salomon | 92ce594 | 2017-01-18 11:01:10 -0500 | [diff] [blame] | 29 | } |
Brian Salomon | 70288c0 | 2017-03-24 12:27:17 -0400 | [diff] [blame] | 30 | int numFragmentProcessors() const { |
| 31 | return fFragmentProcessors.count() - fFragmentProcessorOffset; |
| 32 | } |
Brian Salomon | 92ce594 | 2017-01-18 11:01:10 -0500 | [diff] [blame] | 33 | |
| 34 | const GrFragmentProcessor* colorFragmentProcessor(int idx) const { |
| 35 | SkASSERT(idx < fColorFragmentProcessorCnt); |
Brian Salomon | 70288c0 | 2017-03-24 12:27:17 -0400 | [diff] [blame] | 36 | return fFragmentProcessors[idx + fFragmentProcessorOffset]; |
Brian Salomon | 92ce594 | 2017-01-18 11:01:10 -0500 | [diff] [blame] | 37 | } |
| 38 | const GrFragmentProcessor* coverageFragmentProcessor(int idx) const { |
Brian Salomon | 70288c0 | 2017-03-24 12:27:17 -0400 | [diff] [blame] | 39 | return fFragmentProcessors[idx + fColorFragmentProcessorCnt + fFragmentProcessorOffset]; |
Brian Salomon | 92ce594 | 2017-01-18 11:01:10 -0500 | [diff] [blame] | 40 | } |
| 41 | |
Brian Salomon | 48d1b4c | 2017-04-08 07:38:53 -0400 | [diff] [blame] | 42 | const GrXferProcessor* xferProcessor() const { |
| 43 | SkASSERT(this->isFinalized()); |
| 44 | return fXP.fProcessor; |
| 45 | } |
Brian Salomon | d61c9d9 | 2017-04-10 10:54:25 -0400 | [diff] [blame] | 46 | sk_sp<const GrXferProcessor> refXferProcessor() const { |
| 47 | SkASSERT(this->isFinalized()); |
| 48 | return sk_ref_sp(fXP.fProcessor); |
| 49 | } |
Brian Salomon | 92ce594 | 2017-01-18 11:01:10 -0500 | [diff] [blame] | 50 | |
Brian Salomon | f87e2b9 | 2017-01-19 11:31:50 -0500 | [diff] [blame] | 51 | bool usesDistanceVectorField() const { return SkToBool(fFlags & kUseDistanceVectorField_Flag); } |
Brian Salomon | 189098e7 | 2017-01-19 09:55:19 -0500 | [diff] [blame] | 52 | |
Brian Salomon | 48d1b4c | 2017-04-08 07:38:53 -0400 | [diff] [blame] | 53 | /** Comparisons are only legal on finalized processor sets. */ |
Brian Salomon | 54d212e | 2017-03-21 14:22:38 -0400 | [diff] [blame] | 54 | bool operator==(const GrProcessorSet& that) const; |
| 55 | bool operator!=(const GrProcessorSet& that) const { return !(*this == that); } |
| 56 | |
Brian Salomon | 5298dc8 | 2017-02-22 11:52:03 -0500 | [diff] [blame] | 57 | /** |
Brian Salomon | 48d1b4c | 2017-04-08 07:38:53 -0400 | [diff] [blame] | 58 | * This is used to report results of processor analysis when a processor set is finalized (see |
| 59 | * below). |
Brian Salomon | 5298dc8 | 2017-02-22 11:52:03 -0500 | [diff] [blame] | 60 | */ |
Brian Salomon | a811b12 | 2017-03-30 08:21:32 -0400 | [diff] [blame] | 61 | class Analysis { |
Brian Salomon | 5298dc8 | 2017-02-22 11:52:03 -0500 | [diff] [blame] | 62 | public: |
Brian Salomon | 48d1b4c | 2017-04-08 07:38:53 -0400 | [diff] [blame] | 63 | Analysis(const Analysis&) = default; |
| 64 | Analysis() { *reinterpret_cast<uint32_t*>(this) = 0; } |
Brian Salomon | 8d2f90b | 2017-03-13 09:11:58 -0400 | [diff] [blame] | 65 | |
Brian Salomon | 48d1b4c | 2017-04-08 07:38:53 -0400 | [diff] [blame] | 66 | bool isInitialized() const { return fIsInitialized; } |
Brian Salomon | bfafcba | 2017-03-02 08:49:19 -0500 | [diff] [blame] | 67 | bool usesLocalCoords() const { return fUsesLocalCoords; } |
Brian Salomon | 3185384 | 2017-03-28 16:32:05 -0400 | [diff] [blame] | 68 | bool requiresDstTexture() const { return fRequiresDstTexture; } |
| 69 | bool canCombineOverlappedStencilAndCover() const { |
| 70 | return fCanCombineOverlappedStencilAndCover; |
| 71 | } |
Brian Salomon | 4fc7740 | 2017-03-30 16:48:26 -0400 | [diff] [blame] | 72 | bool requiresBarrierBetweenOverlappingDraws() const { |
| 73 | return fRequiresBarrierBetweenOverlappingDraws; |
| 74 | } |
Brian Salomon | 5298dc8 | 2017-02-22 11:52:03 -0500 | [diff] [blame] | 75 | bool isCompatibleWithCoverageAsAlpha() const { return fCompatibleWithCoverageAsAlpha; } |
Brian Salomon | 48d1b4c | 2017-04-08 07:38:53 -0400 | [diff] [blame] | 76 | |
| 77 | bool inputColorIsIgnored() const { return fInputColorType == kIgnored_InputColorType; } |
| 78 | bool inputColorIsOverridden() const { |
| 79 | return fInputColorType == kOverridden_InputColorType; |
Brian Salomon | c0b642c | 2017-03-27 13:09:36 -0400 | [diff] [blame] | 80 | } |
Brian Salomon | 5298dc8 | 2017-02-22 11:52:03 -0500 | [diff] [blame] | 81 | |
| 82 | private: |
Brian Salomon | 48d1b4c | 2017-04-08 07:38:53 -0400 | [diff] [blame] | 83 | enum InputColorType : uint32_t { |
| 84 | kOriginal_InputColorType, |
| 85 | kOverridden_InputColorType, |
| 86 | kIgnored_InputColorType |
| 87 | }; |
Brian Salomon | 5298dc8 | 2017-02-22 11:52:03 -0500 | [diff] [blame] | 88 | |
Brian Salomon | 48d1b4c | 2017-04-08 07:38:53 -0400 | [diff] [blame] | 89 | // MSVS 2015 won't pack different underlying types |
| 90 | using PackedBool = uint32_t; |
| 91 | using PackedInputColorType = uint32_t; |
Brian Salomon | 5298dc8 | 2017-02-22 11:52:03 -0500 | [diff] [blame] | 92 | |
Brian Salomon | 8d2f90b | 2017-03-13 09:11:58 -0400 | [diff] [blame] | 93 | PackedBool fUsesLocalCoords : 1; |
| 94 | PackedBool fCompatibleWithCoverageAsAlpha : 1; |
Brian Salomon | 3185384 | 2017-03-28 16:32:05 -0400 | [diff] [blame] | 95 | PackedBool fRequiresDstTexture : 1; |
| 96 | PackedBool fCanCombineOverlappedStencilAndCover : 1; |
Brian Salomon | 4fc7740 | 2017-03-30 16:48:26 -0400 | [diff] [blame] | 97 | PackedBool fRequiresBarrierBetweenOverlappingDraws : 1; |
Brian Salomon | 48d1b4c | 2017-04-08 07:38:53 -0400 | [diff] [blame] | 98 | PackedBool fIsInitialized : 1; |
| 99 | PackedInputColorType fInputColorType : 2; |
Brian Salomon | 70288c0 | 2017-03-24 12:27:17 -0400 | [diff] [blame] | 100 | |
| 101 | friend class GrProcessorSet; |
Brian Salomon | 5298dc8 | 2017-02-22 11:52:03 -0500 | [diff] [blame] | 102 | }; |
Brian Salomon | 48d1b4c | 2017-04-08 07:38:53 -0400 | [diff] [blame] | 103 | GR_STATIC_ASSERT(sizeof(Analysis) <= sizeof(uint32_t)); |
Brian Salomon | 5298dc8 | 2017-02-22 11:52:03 -0500 | [diff] [blame] | 104 | |
Brian Salomon | 48d1b4c | 2017-04-08 07:38:53 -0400 | [diff] [blame] | 105 | /** |
| 106 | * This analyzes the processors given an op's input color and coverage as well as a clip. The |
| 107 | * state of the processor set may change to an equivalent but more optimal set of processors. |
| 108 | * This new state requires that the caller respect the returned 'inputColorOverride'. This is |
| 109 | * indicated by the returned Analysis's inputColorIsOverriden(). 'inputColorOverride' will not |
| 110 | * be written if the analysis does not override the input color. |
| 111 | * |
| 112 | * This must be called before the processor set is used to construct a GrPipeline and may only |
| 113 | * be called once. |
| 114 | * |
| 115 | * This also puts the processors in "pending execution" state and must be called when an op |
| 116 | * that owns a processor set is recorded to ensure pending and writes are propagated to |
| 117 | * resources referred to by the processors. Otherwise, data hazards may occur. |
| 118 | */ |
| 119 | Analysis finalize(const GrProcessorAnalysisColor& colorInput, |
| 120 | const GrProcessorAnalysisCoverage coverageInput, const GrAppliedClip*, |
| 121 | bool isMixedSamples, const GrCaps&, GrColor* inputColorOverride); |
| 122 | |
| 123 | bool isFinalized() const { return SkToBool(kFinalized_Flag & fFlags); } |
Brian Salomon | 70288c0 | 2017-03-24 12:27:17 -0400 | [diff] [blame] | 124 | |
Brian Salomon | 92ce594 | 2017-01-18 11:01:10 -0500 | [diff] [blame] | 125 | private: |
Brian Salomon | a811b12 | 2017-03-30 08:21:32 -0400 | [diff] [blame] | 126 | // This absurdly large limit allows Analysis and this to pack fields together. |
Brian Salomon | 70288c0 | 2017-03-24 12:27:17 -0400 | [diff] [blame] | 127 | static constexpr int kMaxColorProcessors = UINT8_MAX; |
Brian Salomon | 8d2f90b | 2017-03-13 09:11:58 -0400 | [diff] [blame] | 128 | |
Brian Salomon | 611572c | 2017-04-28 08:57:12 -0400 | [diff] [blame] | 129 | enum Flags : uint16_t { kUseDistanceVectorField_Flag = 0x1, kFinalized_Flag = 0x2 }; |
Brian Salomon | 8d2f90b | 2017-03-13 09:11:58 -0400 | [diff] [blame] | 130 | |
Brian Salomon | 48d1b4c | 2017-04-08 07:38:53 -0400 | [diff] [blame] | 131 | union XP { |
| 132 | XP(const GrXPFactory* factory) : fFactory(factory) {} |
| 133 | const GrXPFactory* fFactory; |
| 134 | const GrXferProcessor* fProcessor; |
| 135 | }; |
| 136 | |
| 137 | const GrXPFactory* xpFactory() const { |
| 138 | SkASSERT(!this->isFinalized()); |
| 139 | return fXP.fFactory; |
| 140 | } |
| 141 | |
Brian Salomon | 8d2f90b | 2017-03-13 09:11:58 -0400 | [diff] [blame] | 142 | SkAutoSTArray<4, const GrFragmentProcessor*> fFragmentProcessors; |
Brian Salomon | 48d1b4c | 2017-04-08 07:38:53 -0400 | [diff] [blame] | 143 | XP fXP; |
Brian Salomon | 0f35332 | 2017-05-03 20:58:59 +0000 | [diff] [blame^] | 144 | uint8_t fColorFragmentProcessorCnt; |
Brian Salomon | 70288c0 | 2017-03-24 12:27:17 -0400 | [diff] [blame] | 145 | uint8_t fFragmentProcessorOffset = 0; |
| 146 | uint8_t fFlags; |
Brian Salomon | 92ce594 | 2017-01-18 11:01:10 -0500 | [diff] [blame] | 147 | }; |
| 148 | |
| 149 | #endif |