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