| Index: src/effects/SkDisplacementMapEffect.cpp
|
| diff --git a/src/effects/SkDisplacementMapEffect.cpp b/src/effects/SkDisplacementMapEffect.cpp
|
| index a751365b75b70b43d0bf05ebda596546c368e7eb..020ee0291370d563275ed86c4a74edd9788fed85 100644
|
| --- a/src/effects/SkDisplacementMapEffect.cpp
|
| +++ b/src/effects/SkDisplacementMapEffect.cpp
|
| @@ -11,8 +11,8 @@
|
| #include "SkColorPriv.h"
|
| #if SK_SUPPORT_GPU
|
| #include "GrContext.h"
|
| +#include "GrCoordTransform.h"
|
| #include "gl/GrGLEffect.h"
|
| -#include "gl/GrGLEffectMatrix.h"
|
| #include "GrTBackendEffectFactory.h"
|
| #include "SkImageFilterUtils.h"
|
| #endif
|
| @@ -209,6 +209,7 @@ public:
|
| EffectKey,
|
| const char* outputColor,
|
| const char* inputColor,
|
| + const TransformedCoordsArray&,
|
| const TextureSamplerArray&) SK_OVERRIDE;
|
|
|
| static inline EffectKey GenKey(const GrDrawEffect&, const GrGLCaps&);
|
| @@ -216,12 +217,8 @@ public:
|
| virtual void setData(const GrGLUniformManager&, const GrDrawEffect&) SK_OVERRIDE;
|
|
|
| private:
|
| - static const GrEffect::CoordsType kCoordsType = GrEffect::kLocal_CoordsType;
|
| -
|
| SkDisplacementMapEffect::ChannelSelectorType fXChannelSelector;
|
| SkDisplacementMapEffect::ChannelSelectorType fYChannelSelector;
|
| - GrGLEffectMatrix fDisplacementEffectMatrix;
|
| - GrGLEffectMatrix fColorEffectMatrix;
|
| GrGLUniformManager::UniformHandle fScaleUni;
|
|
|
| typedef GrGLEffect INHERITED;
|
| @@ -257,7 +254,6 @@ public:
|
| virtual void getConstantColorComponents(GrColor* color, uint32_t* validFlags) const SK_OVERRIDE;
|
|
|
| private:
|
| -
|
| virtual bool onIsEqual(const GrEffect&) const SK_OVERRIDE;
|
|
|
| GrDisplacementMapEffect(SkDisplacementMapEffect::ChannelSelectorType xChannelSelector,
|
| @@ -266,7 +262,9 @@ private:
|
|
|
| GR_DECLARE_EFFECT_TEST;
|
|
|
| + GrCoordTransform fDisplacementTransform;
|
| GrTextureAccess fDisplacementAccess;
|
| + GrCoordTransform fColorTransform;
|
| GrTextureAccess fColorAccess;
|
| SkDisplacementMapEffect::ChannelSelectorType fXChannelSelector;
|
| SkDisplacementMapEffect::ChannelSelectorType fYChannelSelector;
|
| @@ -327,12 +325,16 @@ GrDisplacementMapEffect::GrDisplacementMapEffect(
|
| SkScalar scale,
|
| GrTexture* displacement,
|
| GrTexture* color)
|
| - : fDisplacementAccess(displacement)
|
| + : fDisplacementTransform(kLocal_GrCoordSet, displacement)
|
| + , fDisplacementAccess(displacement)
|
| + , fColorTransform(kLocal_GrCoordSet, color)
|
| , fColorAccess(color)
|
| , fXChannelSelector(xChannelSelector)
|
| , fYChannelSelector(yChannelSelector)
|
| , fScale(scale) {
|
| + this->addCoordTransform(&fDisplacementTransform);
|
| this->addTextureAccess(&fDisplacementAccess);
|
| + this->addCoordTransform(&fColorTransform);
|
| this->addTextureAccess(&fColorAccess);
|
| }
|
|
|
| @@ -393,9 +395,7 @@ GrGLDisplacementMapEffect::GrGLDisplacementMapEffect(const GrBackendEffectFactor
|
| const GrDrawEffect& drawEffect)
|
| : INHERITED(factory)
|
| , fXChannelSelector(drawEffect.castEffect<GrDisplacementMapEffect>().xChannelSelector())
|
| - , fYChannelSelector(drawEffect.castEffect<GrDisplacementMapEffect>().yChannelSelector())
|
| - , fDisplacementEffectMatrix(kCoordsType)
|
| - , fColorEffectMatrix(kCoordsType) {
|
| + , fYChannelSelector(drawEffect.castEffect<GrDisplacementMapEffect>().yChannelSelector()) {
|
| }
|
|
|
| GrGLDisplacementMapEffect::~GrGLDisplacementMapEffect() {
|
| @@ -406,20 +406,13 @@ void GrGLDisplacementMapEffect::emitCode(GrGLShaderBuilder* builder,
|
| EffectKey key,
|
| const char* outputColor,
|
| const char* inputColor,
|
| + const TransformedCoordsArray& coords,
|
| const TextureSamplerArray& samplers) {
|
| sk_ignore_unused_variable(inputColor);
|
|
|
| fScaleUni = builder->addUniform(GrGLShaderBuilder::kFragment_Visibility,
|
| kVec2f_GrSLType, "Scale");
|
| const char* scaleUni = builder->getUniformCStr(fScaleUni);
|
| -
|
| - SkString dCoordsIn;
|
| - GrSLType dCoordsType = fDisplacementEffectMatrix.emitCode(
|
| - builder, key, &dCoordsIn, NULL, "DISPL");
|
| - SkString cCoordsIn;
|
| - GrSLType cCoordsType = fColorEffectMatrix.emitCode(
|
| - builder, key, &cCoordsIn, NULL, "COLOR");
|
| -
|
| const char* dColor = "dColor";
|
| const char* cCoords = "cCoords";
|
| const char* outOfBounds = "outOfBounds";
|
| @@ -428,7 +421,7 @@ void GrGLDisplacementMapEffect::emitCode(GrGLShaderBuilder* builder,
|
| // leave room for 32-bit float GPU rounding errors.
|
|
|
| builder->fsCodeAppendf("\t\tvec4 %s = ", dColor);
|
| - builder->fsAppendTextureLookup(samplers[0], dCoordsIn.c_str(), dCoordsType);
|
| + builder->fsAppendTextureLookup(samplers[0], coords[0].c_str(), coords[0].type());
|
| builder->fsCodeAppend(";\n");
|
|
|
| // Unpremultiply the displacement
|
| @@ -436,7 +429,7 @@ void GrGLDisplacementMapEffect::emitCode(GrGLShaderBuilder* builder,
|
| dColor, dColor, nearZero, dColor, dColor);
|
|
|
| builder->fsCodeAppendf("\t\tvec2 %s = %s + %s*(%s.",
|
| - cCoords, cCoordsIn.c_str(), scaleUni, dColor);
|
| + cCoords, coords[1].c_str(), scaleUni, dColor);
|
|
|
| switch (fXChannelSelector) {
|
| case SkDisplacementMapEffect::kR_ChannelSelectorType:
|
| @@ -481,7 +474,7 @@ void GrGLDisplacementMapEffect::emitCode(GrGLShaderBuilder* builder,
|
| "bool %s = (%s.x < 0.0) || (%s.y < 0.0) || (%s.x > 1.0) || (%s.y > 1.0);\t\t",
|
| outOfBounds, cCoords, cCoords, cCoords, cCoords);
|
| builder->fsCodeAppendf("%s = %s ? vec4(0.0) : ", outputColor, outOfBounds);
|
| - builder->fsAppendTextureLookup(samplers[1], cCoords, cCoordsType);
|
| + builder->fsAppendTextureLookup(samplers[1], cCoords, coords[1].type());
|
| builder->fsCodeAppend(";\n");
|
| }
|
|
|
| @@ -489,17 +482,7 @@ void GrGLDisplacementMapEffect::setData(const GrGLUniformManager& uman,
|
| const GrDrawEffect& drawEffect) {
|
| const GrDisplacementMapEffect& displacementMap =
|
| drawEffect.castEffect<GrDisplacementMapEffect>();
|
| - GrTexture* displTex = displacementMap.texture(0);
|
| GrTexture* colorTex = displacementMap.texture(1);
|
| - fDisplacementEffectMatrix.setData(uman,
|
| - GrEffect::MakeDivByTextureWHMatrix(displTex),
|
| - drawEffect,
|
| - displTex);
|
| - fColorEffectMatrix.setData(uman,
|
| - GrEffect::MakeDivByTextureWHMatrix(colorTex),
|
| - drawEffect,
|
| - colorTex);
|
| -
|
| SkScalar scaleX = SkScalarDiv(displacementMap.scale(), SkIntToScalar(colorTex->width()));
|
| SkScalar scaleY = SkScalarDiv(displacementMap.scale(), SkIntToScalar(colorTex->height()));
|
| uman.set2f(fScaleUni, SkScalarToFloat(scaleX),
|
| @@ -512,24 +495,9 @@ GrGLEffect::EffectKey GrGLDisplacementMapEffect::GenKey(const GrDrawEffect& draw
|
| const GrDisplacementMapEffect& displacementMap =
|
| drawEffect.castEffect<GrDisplacementMapEffect>();
|
|
|
| - GrTexture* displTex = displacementMap.texture(0);
|
| - GrTexture* colorTex = displacementMap.texture(1);
|
| -
|
| - EffectKey displKey = GrGLEffectMatrix::GenKey(GrEffect::MakeDivByTextureWHMatrix(displTex),
|
| - drawEffect,
|
| - kCoordsType,
|
| - displTex);
|
| -
|
| - EffectKey colorKey = GrGLEffectMatrix::GenKey(GrEffect::MakeDivByTextureWHMatrix(colorTex),
|
| - drawEffect,
|
| - kCoordsType,
|
| - colorTex);
|
| -
|
| - colorKey <<= GrGLEffectMatrix::kKeyBits;
|
| - EffectKey xKey = displacementMap.xChannelSelector() << (2 * GrGLEffectMatrix::kKeyBits);
|
| - EffectKey yKey = displacementMap.yChannelSelector() << (2 * GrGLEffectMatrix::kKeyBits +
|
| - SkDisplacementMapEffect::kKeyBits);
|
| + EffectKey xKey = displacementMap.xChannelSelector();
|
| + EffectKey yKey = displacementMap.yChannelSelector() << SkDisplacementMapEffect::kKeyBits;
|
|
|
| - return xKey | yKey | displKey | colorKey;
|
| + return xKey | yKey;
|
| }
|
| #endif
|
|
|