blob: bd78dc927e3959d0f1bbd0df108b45b7ba3386f7 [file] [log] [blame]
Brian Salomon92ce5942017-01-18 11:01:10 -05001/*
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 Salomon5298dc82017-02-22 11:52:03 -050013#include "GrPipelineInput.h"
Brian Salomon92ce5942017-01-18 11:01:10 -050014#include "SkTemplates.h"
15
Brian Salomon5298dc82017-02-22 11:52:03 -050016class GrAppliedClip;
Brian Salomon92ce5942017-01-18 11:01:10 -050017class GrXPFactory;
18
19class GrProcessorSet : private SkNoncopyable {
20public:
21 GrProcessorSet(GrPaint&& paint);
22
23 ~GrProcessorSet() {
24 // We are deliberately not using sk_sp here because this will be updated to work with
25 // "pending execution" refs.
26 for (auto fp : fFragmentProcessors) {
27 fp->unref();
28 }
29 }
30
31 int numColorFragmentProcessors() const { return fColorFragmentProcessorCnt; }
32 int numCoverageFragmentProcessors() const {
33 return fFragmentProcessors.count() - fColorFragmentProcessorCnt;
34 }
35 int numFragmentProcessors() const { return fFragmentProcessors.count(); }
36
37 const GrFragmentProcessor* colorFragmentProcessor(int idx) const {
38 SkASSERT(idx < fColorFragmentProcessorCnt);
39 return fFragmentProcessors[idx];
40 }
41 const GrFragmentProcessor* coverageFragmentProcessor(int idx) const {
42 return fFragmentProcessors[idx + fColorFragmentProcessorCnt];
43 }
44
45 const GrXPFactory* xpFactory() const { return fXPFactory; }
46
Brian Salomonf87e2b92017-01-19 11:31:50 -050047 bool usesDistanceVectorField() const { return SkToBool(fFlags & kUseDistanceVectorField_Flag); }
48 bool disableOutputConversionToSRGB() const {
49 return SkToBool(fFlags & kDisableOutputConversionToSRGB_Flag);
50 }
51 bool allowSRGBInputs() const { return SkToBool(fFlags & kAllowSRGBInputs_Flag); }
Brian Salomon189098e72017-01-19 09:55:19 -050052
Brian Salomon5298dc82017-02-22 11:52:03 -050053 /**
54 * This is used to track analysis of color and coverage values through the fragment processors.
55 */
56 class FragmentProcessorAnalysis {
57 public:
58 FragmentProcessorAnalysis() = default;
59 // This version is used by a unit test that assumes no clip, no processors, and no PLS.
60 FragmentProcessorAnalysis(const GrPipelineInput& colorInput,
61 const GrPipelineInput coverageInput, const GrCaps&);
62
63 void reset(const GrPipelineInput& colorInput, const GrPipelineInput coverageInput,
64 const GrProcessorSet&, bool usesPLSDstRead, const GrAppliedClip&, const GrCaps&);
65
66 int initialColorProcessorsToEliminate(GrColor* newInputColor) const {
67 if (fInitialColorProcessorsToEliminate > 0) {
68 *newInputColor = fOverrideInputColor;
69 }
70 return fInitialColorProcessorsToEliminate;
71 }
72
73 bool usesPLSDstRead() const { return fUsesPLSDstRead; }
74 bool isCompatibleWithCoverageAsAlpha() const { return fCompatibleWithCoverageAsAlpha; }
75 bool isOutputColorOpaque() const {
76 return ColorType::kOpaque == fColorType || ColorType::kOpaqueConstant == fColorType;
77 }
78 bool hasKnownOutputColor(GrColor* color = nullptr) const {
79 bool constant =
80 ColorType::kConstant == fColorType || ColorType::kOpaqueConstant == fColorType;
81 if (constant && color) {
82 *color = fKnownOutputColor;
83 }
84 return constant;
85 }
86 bool hasCoverage() const { return CoverageType::kNone != fCoverageType; }
87 bool hasLCDCoverage() const { return CoverageType::kLCD == fCoverageType; }
88
89 private:
90 void internalReset(const GrPipelineInput& colorInput, const GrPipelineInput coverageInput,
91 const GrProcessorSet&, bool usesPLSDstRead,
92 const GrFragmentProcessor* clipFP, const GrCaps&);
93
94 enum class ColorType { kUnknown, kOpaqueConstant, kConstant, kOpaque };
95 enum class CoverageType { kNone, kSingleChannel, kLCD };
96
97 bool fUsesPLSDstRead = false;
98 bool fCompatibleWithCoverageAsAlpha = true;
99 CoverageType fCoverageType = CoverageType::kNone;
100 ColorType fColorType = ColorType::kUnknown;
101 int fInitialColorProcessorsToEliminate = 0;
102 GrColor fOverrideInputColor;
103 GrColor fKnownOutputColor;
104 };
105
Brian Salomon92ce5942017-01-18 11:01:10 -0500106private:
107 const GrXPFactory* fXPFactory = nullptr;
108 SkAutoSTArray<4, const GrFragmentProcessor*> fFragmentProcessors;
109 int fColorFragmentProcessorCnt;
Brian Salomonf87e2b92017-01-19 11:31:50 -0500110 enum Flags : uint32_t {
111 kUseDistanceVectorField_Flag = 0x1,
112 kDisableOutputConversionToSRGB_Flag = 0x2,
113 kAllowSRGBInputs_Flag = 0x4
114 };
115 uint32_t fFlags;
Brian Salomon92ce5942017-01-18 11:01:10 -0500116};
117
118#endif