blob: 2998eabc3b48ecdd11411941a150331845f04793 [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:
bsalomon21b2c532015-02-05 14:18:05 -080075 static GrXferProcessor* Create(float k1, float k2, float k3, float k4, bool enforcePMColor) {
76 return SkNEW_ARGS(GrArithmeticXP, (k1, k2, k3, k4, enforcePMColor));
egdanielf351aa32015-01-14 12:53:01 -080077 }
78
79 ~GrArithmeticXP() SK_OVERRIDE {};
80
81 const char* name() const SK_OVERRIDE { return "Arithmetic"; }
82
bsalomon21b2c532015-02-05 14:18:05 -080083 void getGLProcessorKey(const GrGLCaps& caps, GrProcessorKeyBuilder* b) const SK_OVERRIDE;
84
egdanielf351aa32015-01-14 12:53:01 -080085 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:
bsalomon21b2c532015-02-05 14:18:05 -0800108 GrArithmeticXP(float k1, float k2, float k3, float k4, bool enforcePMColor);
egdanielf351aa32015-01-14 12:53:01 -0800109
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
bsalomon21b2c532015-02-05 14:18:05 -0800136 GrXferProcessor* createXferProcessor(const GrProcOptInfo& colorPOI,
137 const GrProcOptInfo& coveragePOI) const SK_OVERRIDE {
138 return GrArithmeticXP::Create(fK1, fK2, fK3, fK4, fEnforcePMColor);
139 }
140
egdanielf351aa32015-01-14 12:53:01 -0800141 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
bsalomon21b2c532015-02-05 14:18:05 -0800157 bool willReadDst() const SK_OVERRIDE { return true; }
158
egdanielf351aa32015-01-14 12:53:01 -0800159private:
160 GrArithmeticXPFactory(float k1, float k2, float k3, float k4, bool enforcePMColor);
161
162 bool onIsEqual(const GrXPFactory& xpfBase) const SK_OVERRIDE {
163 const GrArithmeticXPFactory& xpf = xpfBase.cast<GrArithmeticXPFactory>();
164 if (fK1 != xpf.fK1 ||
165 fK2 != xpf.fK2 ||
166 fK3 != xpf.fK3 ||
167 fK4 != xpf.fK4 ||
168 fEnforcePMColor != xpf.fEnforcePMColor) {
169 return false;
170 }
171 return true;
172 }
173
174 GR_DECLARE_XP_FACTORY_TEST;
175
176 float fK1, fK2, fK3, fK4;
177 bool fEnforcePMColor;
178
179 typedef GrXPFactory INHERITED;
180};
181
egdaniel16a04b82015-01-14 10:49:18 -0800182#endif
183#endif