Index: src/gpu/effects/GrMatrixConvolutionEffect.cpp |
diff --git a/src/gpu/effects/GrMatrixConvolutionEffect.cpp b/src/gpu/effects/GrMatrixConvolutionEffect.cpp |
index 6d411c4712aa945a48c4166ca80cc073c9052af9..a7f829e766e3107fc7c5932101b1b6553841c7b8 100644 |
--- a/src/gpu/effects/GrMatrixConvolutionEffect.cpp |
+++ b/src/gpu/effects/GrMatrixConvolutionEffect.cpp |
@@ -12,7 +12,6 @@ |
class GrGLMatrixConvolutionEffect : public GrGLSLFragmentProcessor { |
public: |
- GrGLMatrixConvolutionEffect(const GrProcessor&); |
void emitCode(EmitArgs&) override; |
static inline void GenKey(const GrProcessor&, const GrGLSLCaps&, GrProcessorKeyBuilder*); |
@@ -22,8 +21,6 @@ protected: |
private: |
typedef GrGLSLProgramDataManager::UniformHandle UniformHandle; |
- SkISize fKernelSize; |
- bool fConvolveAlpha; |
UniformHandle fKernelUni; |
UniformHandle fImageIncrementUni; |
@@ -35,14 +32,13 @@ private: |
typedef GrGLSLFragmentProcessor INHERITED; |
}; |
-GrGLMatrixConvolutionEffect::GrGLMatrixConvolutionEffect(const GrProcessor& processor) { |
- const GrMatrixConvolutionEffect& m = processor.cast<GrMatrixConvolutionEffect>(); |
- fKernelSize = m.kernelSize(); |
- fConvolveAlpha = m.convolveAlpha(); |
-} |
- |
void GrGLMatrixConvolutionEffect::emitCode(EmitArgs& args) { |
- const GrTextureDomain& domain = args.fFp.cast<GrMatrixConvolutionEffect>().domain(); |
+ const GrMatrixConvolutionEffect& mce = args.fFp.cast<GrMatrixConvolutionEffect>(); |
+ const GrTextureDomain& domain = mce.domain(); |
+ |
+ int kWidth = mce.kernelSize().width(); |
+ int kHeight = mce.kernelSize().height(); |
+ |
GrGLSLUniformHandler* uniformHandler = args.fUniformHandler; |
fImageIncrementUni = uniformHandler->addUniform(GrGLSLUniformHandler::kFragment_Visibility, |
kVec2f_GrSLType, kDefault_GrSLPrecision, |
@@ -50,7 +46,7 @@ void GrGLMatrixConvolutionEffect::emitCode(EmitArgs& args) { |
fKernelUni = uniformHandler->addUniformArray(GrGLSLUniformHandler::kFragment_Visibility, |
kFloat_GrSLType, kDefault_GrSLPrecision, |
"Kernel", |
- fKernelSize.width() * fKernelSize.height()); |
+ kWidth * kHeight); |
fKernelOffsetUni = uniformHandler->addUniform(GrGLSLUniformHandler::kFragment_Visibility, |
kVec2f_GrSLType, kDefault_GrSLPrecision, |
"KernelOffset"); |
@@ -64,8 +60,6 @@ void GrGLMatrixConvolutionEffect::emitCode(EmitArgs& args) { |
const char* kernel = uniformHandler->getUniformCStr(fKernelUni); |
const char* gain = uniformHandler->getUniformCStr(fGainUni); |
const char* bias = uniformHandler->getUniformCStr(fBiasUni); |
- int kWidth = fKernelSize.width(); |
- int kHeight = fKernelSize.height(); |
GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder; |
SkString coords2D = fragBuilder->ensureFSCoords2D(args.fCoords, 0); |
@@ -86,14 +80,14 @@ void GrGLMatrixConvolutionEffect::emitCode(EmitArgs& args) { |
"c", |
coord, |
args.fSamplers[0]); |
- if (!fConvolveAlpha) { |
+ if (!mce.convolveAlpha()) { |
fragBuilder->codeAppend("c.rgb /= c.a;"); |
fragBuilder->codeAppend("c.rgb = clamp(c.rgb, 0.0, 1.0);"); |
} |
fragBuilder->codeAppend("sum += c * k;"); |
} |
} |
- if (fConvolveAlpha) { |
+ if (mce.convolveAlpha()) { |
fragBuilder->codeAppendf("%s = sum * %s + %s;", args.fOutputColor, gain, bias); |
fragBuilder->codeAppendf("%s.rgb = clamp(%s.rgb, 0.0, %s.a);", |
args.fOutputColor, args.fOutputColor, args.fOutputColor); |
@@ -129,15 +123,14 @@ void GrGLMatrixConvolutionEffect::onSetData(const GrGLSLProgramDataManager& pdma |
const GrProcessor& processor) { |
const GrMatrixConvolutionEffect& conv = processor.cast<GrMatrixConvolutionEffect>(); |
GrTexture& texture = *conv.texture(0); |
- // the code we generated was for a specific kernel size |
- SkASSERT(conv.kernelSize() == fKernelSize); |
+ |
float imageIncrement[2]; |
float ySign = texture.origin() == kTopLeft_GrSurfaceOrigin ? 1.0f : -1.0f; |
imageIncrement[0] = 1.0f / texture.width(); |
imageIncrement[1] = ySign / texture.height(); |
pdman.set2fv(fImageIncrementUni, 1, imageIncrement); |
pdman.set2fv(fKernelOffsetUni, 1, conv.kernelOffset()); |
- pdman.set1fv(fKernelUni, fKernelSize.width() * fKernelSize.height(), conv.kernel()); |
+ pdman.set1fv(fKernelUni, conv.kernelSize().width() * conv.kernelSize().height(), conv.kernel()); |
pdman.set1f(fGainUni, conv.gain()); |
pdman.set1f(fBiasUni, conv.bias()); |
fDomain.setData(pdman, conv.domain(), texture.origin()); |
@@ -166,16 +159,13 @@ GrMatrixConvolutionEffect::GrMatrixConvolutionEffect(GrTexture* texture, |
fKernelOffset[1] = static_cast<float>(kernelOffset.y()); |
} |
-GrMatrixConvolutionEffect::~GrMatrixConvolutionEffect() { |
-} |
- |
void GrMatrixConvolutionEffect::onGetGLSLProcessorKey(const GrGLSLCaps& caps, |
GrProcessorKeyBuilder* b) const { |
GrGLMatrixConvolutionEffect::GenKey(*this, caps, b); |
} |
GrGLSLFragmentProcessor* GrMatrixConvolutionEffect::onCreateGLSLInstance() const { |
- return new GrGLMatrixConvolutionEffect(*this); |
+ return new GrGLMatrixConvolutionEffect; |
} |
bool GrMatrixConvolutionEffect::onIsEqual(const GrFragmentProcessor& sBase) const { |