blob: 722bc048bd503cba4d5dda436dbf3060cbc5346c [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; }
Brian Salomonbfafcba2017-03-02 08:49:19 -050074 bool usesLocalCoords() const { return fUsesLocalCoords; }
Brian Salomon5298dc82017-02-22 11:52:03 -050075 bool isCompatibleWithCoverageAsAlpha() const { return fCompatibleWithCoverageAsAlpha; }
76 bool isOutputColorOpaque() const {
77 return ColorType::kOpaque == fColorType || ColorType::kOpaqueConstant == fColorType;
78 }
79 bool hasKnownOutputColor(GrColor* color = nullptr) const {
80 bool constant =
81 ColorType::kConstant == fColorType || ColorType::kOpaqueConstant == fColorType;
82 if (constant && color) {
83 *color = fKnownOutputColor;
84 }
85 return constant;
86 }
87 bool hasCoverage() const { return CoverageType::kNone != fCoverageType; }
88 bool hasLCDCoverage() const { return CoverageType::kLCD == fCoverageType; }
89
90 private:
91 void internalReset(const GrPipelineInput& colorInput, const GrPipelineInput coverageInput,
92 const GrProcessorSet&, bool usesPLSDstRead,
93 const GrFragmentProcessor* clipFP, const GrCaps&);
94
95 enum class ColorType { kUnknown, kOpaqueConstant, kConstant, kOpaque };
96 enum class CoverageType { kNone, kSingleChannel, kLCD };
97
98 bool fUsesPLSDstRead = false;
99 bool fCompatibleWithCoverageAsAlpha = true;
Brian Salomonbfafcba2017-03-02 08:49:19 -0500100 bool fUsesLocalCoords = false;
Brian Salomon5298dc82017-02-22 11:52:03 -0500101 CoverageType fCoverageType = CoverageType::kNone;
102 ColorType fColorType = ColorType::kUnknown;
103 int fInitialColorProcessorsToEliminate = 0;
104 GrColor fOverrideInputColor;
105 GrColor fKnownOutputColor;
106 };
107
Brian Salomon92ce5942017-01-18 11:01:10 -0500108private:
109 const GrXPFactory* fXPFactory = nullptr;
110 SkAutoSTArray<4, const GrFragmentProcessor*> fFragmentProcessors;
111 int fColorFragmentProcessorCnt;
Brian Salomonf87e2b92017-01-19 11:31:50 -0500112 enum Flags : uint32_t {
113 kUseDistanceVectorField_Flag = 0x1,
114 kDisableOutputConversionToSRGB_Flag = 0x2,
115 kAllowSRGBInputs_Flag = 0x4
116 };
117 uint32_t fFlags;
Brian Salomon92ce5942017-01-18 11:01:10 -0500118};
119
120#endif