blob: 424bef6f91f57ab9c9d741c2cfd4ad70f9cfdcd9 [file] [log] [blame]
egdaniel16a04b82015-01-14 10:49:18 -08001/*
2 * Copyright 2015 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 SkArithmeticMode_gpu_DEFINED
9#define SkArithmeticMode_gpu_DEFINED
10
egdaniel04ea6342015-01-15 07:05:02 -080011#include "SkTypes.h"
12
egdaniel16a04b82015-01-14 10:49:18 -080013#if SK_SUPPORT_GPU
14
15#include "GrCoordTransform.h"
16#include "GrFragmentProcessor.h"
17#include "GrTextureAccess.h"
egdanielf351aa32015-01-14 12:53:01 -080018#include "GrTypes.h"
19#include "GrXferProcessor.h"
egdaniel16a04b82015-01-14 10:49:18 -080020
21class GrInvariantOutput;
egdanielf351aa32015-01-14 12:53:01 -080022class GrProcOptInfo;
egdaniel16a04b82015-01-14 10:49:18 -080023class GrTexture;
24
25///////////////////////////////////////////////////////////////////////////////
26// Fragment Processor
27///////////////////////////////////////////////////////////////////////////////
28
29class GrGLArtithmeticFP;
30
31class GrArithmeticFP : public GrFragmentProcessor {
32public:
33 static GrFragmentProcessor* Create(float k1, float k2, float k3, float k4, bool enforcePMColor,
34 GrTexture* background) {
35 return SkNEW_ARGS(GrArithmeticFP, (k1, k2, k3, k4, enforcePMColor, background));
36 }
37
38 ~GrArithmeticFP() SK_OVERRIDE {};
39
40 const char* name() const SK_OVERRIDE { return "Arithmetic"; }
41
42 void getGLProcessorKey(const GrGLCaps& caps, GrProcessorKeyBuilder* b) const SK_OVERRIDE;
43
44 GrGLFragmentProcessor* createGLInstance() const SK_OVERRIDE;
45
egdaniel16a04b82015-01-14 10:49:18 -080046 float k1() const { return fK1; }
47 float k2() const { return fK2; }
48 float k3() const { return fK3; }
49 float k4() const { return fK4; }
50 bool enforcePMColor() const { return fEnforcePMColor; }
51
52private:
53 bool onIsEqual(const GrFragmentProcessor&) const SK_OVERRIDE;
54
55 void onComputeInvariantOutput(GrInvariantOutput* inout) const SK_OVERRIDE;
56
57 GrArithmeticFP(float k1, float k2, float k3, float k4, bool enforcePMColor,
58 GrTexture* background);
59
60 float fK1, fK2, fK3, fK4;
61 bool fEnforcePMColor;
62 GrCoordTransform fBackgroundTransform;
63 GrTextureAccess fBackgroundAccess;
64
65 GR_DECLARE_FRAGMENT_PROCESSOR_TEST;
66 typedef GrFragmentProcessor INHERITED;
67};
68
egdanielf351aa32015-01-14 12:53:01 -080069///////////////////////////////////////////////////////////////////////////////
70// Xfer Processor
71///////////////////////////////////////////////////////////////////////////////
72
73class GrArithmeticXP : public GrXferProcessor {
74public:
75 static GrXferProcessor* Create(float k1, float k2, float k3, float k4, bool enforcePMColor) {
76 return SkNEW_ARGS(GrArithmeticXP, (k1, k2, k3, k4, enforcePMColor));
77 }
78
79 ~GrArithmeticXP() SK_OVERRIDE {};
80
81 const char* name() const SK_OVERRIDE { return "Arithmetic"; }
82
83 void getGLProcessorKey(const GrGLCaps& caps, GrProcessorKeyBuilder* b) const SK_OVERRIDE;
84
85 GrGLXferProcessor* createGLInstance() const SK_OVERRIDE;
86
87 bool hasSecondaryOutput() const SK_OVERRIDE { return false; }
88
89 GrXferProcessor::OptFlags getOptimizations(const GrProcOptInfo& colorPOI,
90 const GrProcOptInfo& coveragePOI,
91 bool doesStencilWrite,
92 GrColor* overrideColor,
93 const GrDrawTargetCaps& caps) SK_OVERRIDE;
94
95 void getBlendInfo(GrXferProcessor::BlendInfo* blendInfo) const SK_OVERRIDE {
96 blendInfo->fSrcBlend = kOne_GrBlendCoeff;
97 blendInfo->fDstBlend = kZero_GrBlendCoeff;
98 blendInfo->fBlendConstant = 0;
99 }
100
101 float k1() const { return fK1; }
102 float k2() const { return fK2; }
103 float k3() const { return fK3; }
104 float k4() const { return fK4; }
105 bool enforcePMColor() const { return fEnforcePMColor; }
106
107private:
108 GrArithmeticXP(float k1, float k2, float k3, float k4, bool enforcePMColor);
109
110 bool onIsEqual(const GrXferProcessor& xpBase) const SK_OVERRIDE {
111 const GrArithmeticXP& xp = xpBase.cast<GrArithmeticXP>();
112 if (fK1 != xp.fK1 ||
113 fK2 != xp.fK2 ||
114 fK3 != xp.fK3 ||
115 fK4 != xp.fK4 ||
116 fEnforcePMColor != xp.fEnforcePMColor) {
117 return false;
118 }
119 return true;
120 }
121
122 float fK1, fK2, fK3, fK4;
123 bool fEnforcePMColor;
124
125 typedef GrXferProcessor INHERITED;
126};
127
128///////////////////////////////////////////////////////////////////////////////
129
130class GrArithmeticXPFactory : public GrXPFactory {
131public:
132 static GrXPFactory* Create(float k1, float k2, float k3, float k4, bool enforcePMColor) {
133 return SkNEW_ARGS(GrArithmeticXPFactory, (k1, k2, k3, k4, enforcePMColor));
134 }
135
136 GrXferProcessor* createXferProcessor(const GrProcOptInfo& colorPOI,
137 const GrProcOptInfo& coveragePOI) const SK_OVERRIDE {
138 return GrArithmeticXP::Create(fK1, fK2, fK3, fK4, fEnforcePMColor);
139 }
140
141 bool supportsRGBCoverage(GrColor knownColor, uint32_t knownColorFlags) const SK_OVERRIDE {
142 return true;
143 }
144
145 bool canApplyCoverage(const GrProcOptInfo& colorPOI,
146 const GrProcOptInfo& coveragePOI) const SK_OVERRIDE {
147 return true;
148 }
149
150 bool canTweakAlphaForCoverage() const SK_OVERRIDE {
151 return false;
152 }
153
154 void getInvariantOutput(const GrProcOptInfo& colorPOI, const GrProcOptInfo& coveragePOI,
155 GrXPFactory::InvariantOutput*) const SK_OVERRIDE;
156
157 bool willReadDst(const GrProcOptInfo& colorPOI,
158 const GrProcOptInfo& coveragePOI) const SK_OVERRIDE {
159 return true;
160 }
161
162private:
163 GrArithmeticXPFactory(float k1, float k2, float k3, float k4, bool enforcePMColor);
164
165 bool onIsEqual(const GrXPFactory& xpfBase) const SK_OVERRIDE {
166 const GrArithmeticXPFactory& xpf = xpfBase.cast<GrArithmeticXPFactory>();
167 if (fK1 != xpf.fK1 ||
168 fK2 != xpf.fK2 ||
169 fK3 != xpf.fK3 ||
170 fK4 != xpf.fK4 ||
171 fEnforcePMColor != xpf.fEnforcePMColor) {
172 return false;
173 }
174 return true;
175 }
176
177 GR_DECLARE_XP_FACTORY_TEST;
178
179 float fK1, fK2, fK3, fK4;
180 bool fEnforcePMColor;
181
182 typedef GrXPFactory INHERITED;
183};
184
egdaniel16a04b82015-01-14 10:49:18 -0800185#endif
186#endif