From 17fc651dbe2e0624f6c85fb6e081d28a87d5a08b Mon Sep 17 00:00:00 2001 From: "bsalomon@google.com" Date: Fri, 2 Nov 2012 21:45:01 +0000 Subject: Make all remaining effects use GrGLEffectMatrix R=robertphillips@google.com Review URL: https://codereview.appspot.com/6817079 git-svn-id: http://skia.googlecode.com/svn/trunk@6286 2bbb7eff-a529-9590-31e7-b0007b416f81 --- include/core/SkImageFilter.h | 3 ++ src/effects/SkLightingImageFilter.cpp | 32 +++++++++++++----- src/effects/SkMagnifierImageFilter.cpp | 28 ++++++++++----- src/effects/SkMatrixConvolutionImageFilter.cpp | 47 +++++++++++++++++--------- src/gpu/effects/Gr1DKernelEffect.h | 12 +------ src/gpu/effects/GrSingleTextureEffect.h | 14 ++++++-- 6 files changed, 90 insertions(+), 46 deletions(-) diff --git a/include/core/SkImageFilter.h b/include/core/SkImageFilter.h index c5f6a3bb67..6831f2b994 100644 --- a/include/core/SkImageFilter.h +++ b/include/core/SkImageFilter.h @@ -89,6 +89,9 @@ public: * If effect is non-NULL, a new GrEffect instance is stored * in it. The caller assumes ownership of the stage, and it is up to the * caller to unref it. + * + * The effect can assume its vertexCoords space maps 1-to-1 with texels + * in the texture. */ virtual bool asNewEffect(GrEffect** effect, GrTexture*) const; diff --git a/src/effects/SkLightingImageFilter.cpp b/src/effects/SkLightingImageFilter.cpp index 0aa90eff90..c90f8f3250 100644 --- a/src/effects/SkLightingImageFilter.cpp +++ b/src/effects/SkLightingImageFilter.cpp @@ -16,6 +16,7 @@ #if SK_SUPPORT_GPU #include "effects/GrSingleTextureEffect.h" #include "gl/GrGLEffect.h" +#include "gl/GrGLEffectMatrix.h" #include "GrEffect.h" #include "GrTBackendEffectFactory.h" @@ -969,9 +970,10 @@ protected: private: typedef GrGLEffect INHERITED; - UniformHandle fImageIncrementUni; - UniformHandle fSurfaceScaleUni; - GrGLLight* fLight; + UniformHandle fImageIncrementUni; + UniformHandle fSurfaceScaleUni; + GrGLLight* fLight; + GrGLEffectMatrix fEffectMatrix; }; /////////////////////////////////////////////////////////////////////////////// @@ -1008,7 +1010,7 @@ private: /////////////////////////////////////////////////////////////////////////////// GrLightingEffect::GrLightingEffect(GrTexture* texture, const SkLight* light, SkScalar surfaceScale) - : GrSingleTextureEffect(texture) + : INHERITED(texture, MakeDivByTextureWHMatrix(texture)) , fLight(light) , fSurfaceScale(surfaceScale) { fLight->ref(); @@ -1065,6 +1067,7 @@ GrGLLightingEffect::GrGLLightingEffect(const GrBackendEffectFactory& factory, , fSurfaceScaleUni(kInvalidUniformHandle) { const GrLightingEffect& m = static_cast(effect); fLight = m.light()->createGLLight(); + fRequiresTextureMatrix = false; } GrGLLightingEffect::~GrGLLightingEffect() { @@ -1073,11 +1076,14 @@ GrGLLightingEffect::~GrGLLightingEffect() { void GrGLLightingEffect::emitCode(GrGLShaderBuilder* builder, const GrEffectStage&, - EffectKey, + EffectKey key, const char* vertexCoords, const char* outputColor, const char* inputColor, const TextureSamplerArray& samplers) { + const char* coords; + fEffectMatrix.emitCodeMakeFSCoords2D(builder, key, vertexCoords, &coords); + fImageIncrementUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, kVec2f_GrSLType, "ImageIncrement"); @@ -1139,7 +1145,7 @@ void GrGLLightingEffect::emitCode(GrGLShaderBuilder* builder, interiorNormalBody.c_str(), &interiorNormalName); - code->appendf("\t\tvec2 coord = %s;\n", builder->defaultTexCoordsName()); + code->appendf("\t\tvec2 coord = %s;\n", coords); code->appendf("\t\tfloat m[9];\n"); const char* imgInc = builder->getUniformCStr(fImageIncrementUni); @@ -1169,7 +1175,13 @@ void GrGLLightingEffect::emitCode(GrGLShaderBuilder* builder, GrGLEffect::EffectKey GrGLLightingEffect::GenKey(const GrEffectStage& s, const GrGLCaps& caps) { - return static_cast(*s.getEffect()).light()->type(); + const GrLightingEffect& effect = static_cast(*s.getEffect()); + EffectKey key = static_cast(*s.getEffect()).light()->type(); + key <<= GrGLEffectMatrix::kKeyBits; + EffectKey matrixKey = GrGLEffectMatrix::GenKey(effect.getMatrix(), + s.getCoordChangeMatrix(), + effect.texture(0)); + return key | matrixKey; } void GrGLLightingEffect::setData(const GrGLUniformManager& uman, const GrEffectStage& stage) { @@ -1179,6 +1191,10 @@ void GrGLLightingEffect::setData(const GrGLUniformManager& uman, const GrEffectS uman.set2f(fImageIncrementUni, 1.0f / texture->width(), ySign / texture->height()); uman.set1f(fSurfaceScaleUni, effect.surfaceScale()); fLight->setData(uman, effect.light()); + fEffectMatrix.setData(uman, + effect.getMatrix(), + stage.getCoordChangeMatrix(), + effect.texture(0)); } /////////////////////////////////////////////////////////////////////////////// @@ -1186,7 +1202,7 @@ void GrGLLightingEffect::setData(const GrGLUniformManager& uman, const GrEffectS /////////////////////////////////////////////////////////////////////////////// GrGLDiffuseLightingEffect::GrGLDiffuseLightingEffect(const GrBackendEffectFactory& factory, - const GrEffect& effect) + const GrEffect& effect) : INHERITED(factory, effect) , fKDUni(kInvalidUniformHandle) { } diff --git a/src/effects/SkMagnifierImageFilter.cpp b/src/effects/SkMagnifierImageFilter.cpp index 1097273057..73a50be70b 100644 --- a/src/effects/SkMagnifierImageFilter.cpp +++ b/src/effects/SkMagnifierImageFilter.cpp @@ -16,6 +16,7 @@ #if SK_SUPPORT_GPU #include "effects/GrSingleTextureEffect.h" #include "gl/GrGLEffect.h" +#include "gl/GrGLEffectMatrix.h" #include "gl/GrGLSL.h" #include "gl/GrGLTexture.h" #include "GrTBackendEffectFactory.h" @@ -32,7 +33,7 @@ public: float yZoom, float xInset, float yInset) - : GrSingleTextureEffect(texture) + : GrSingleTextureEffect(texture, MakeDivByTextureWHMatrix(texture)) , fXOffset(xOffset) , fYOffset(yOffset) , fXZoom(xZoom) @@ -91,9 +92,11 @@ public: private: - UniformHandle fOffsetVar; - UniformHandle fZoomVar; - UniformHandle fInsetVar; + UniformHandle fOffsetVar; + UniformHandle fZoomVar; + UniformHandle fInsetVar; + + GrGLEffectMatrix fEffectMatrix; typedef GrGLEffect INHERITED; }; @@ -104,15 +107,18 @@ GrGLMagnifierEffect::GrGLMagnifierEffect(const GrBackendEffectFactory& factory, , fOffsetVar(GrGLUniformManager::kInvalidUniformHandle) , fZoomVar(GrGLUniformManager::kInvalidUniformHandle) , fInsetVar(GrGLUniformManager::kInvalidUniformHandle) { + fRequiresTextureMatrix = false; } void GrGLMagnifierEffect::emitCode(GrGLShaderBuilder* builder, const GrEffectStage&, - EffectKey, + EffectKey key, const char* vertexCoords, const char* outputColor, const char* inputColor, const TextureSamplerArray& samplers) { + const char* coords; + fEffectMatrix.emitCodeMakeFSCoords2D(builder, key, vertexCoords, &coords); fOffsetVar = builder->addUniform( GrGLShaderBuilder::kFragment_ShaderType | GrGLShaderBuilder::kVertex_ShaderType, @@ -128,10 +134,10 @@ void GrGLMagnifierEffect::emitCode(GrGLShaderBuilder* builder, SkString* code = &builder->fFSCode; - code->appendf("\t\tvec2 coord = %s;\n", builder->defaultTexCoordsName()); + code->appendf("\t\tvec2 coord = %s;\n", coords); code->appendf("\t\tvec2 zoom_coord = %s + %s / %s;\n", builder->getUniformCStr(fOffsetVar), - builder->defaultTexCoordsName(), + coords, builder->getUniformCStr(fZoomVar)); code->appendf("\t\tvec2 delta = min(coord, vec2(1.0, 1.0) - coord);\n"); @@ -165,10 +171,14 @@ void GrGLMagnifierEffect::setData(const GrGLUniformManager& uman, uman.set2f(fOffsetVar, zoom.x_offset(), zoom.y_offset()); uman.set2f(fZoomVar, zoom.x_zoom(), zoom.y_zoom()); uman.set2f(fInsetVar, zoom.x_inset(), zoom.y_inset()); + fEffectMatrix.setData(uman, zoom.getMatrix(), stage.getCoordChangeMatrix(), zoom.texture(0)); } -GrGLEffect::EffectKey GrGLMagnifierEffect::GenKey(const GrEffectStage&, const GrGLCaps&) { - return 0; +GrGLEffect::EffectKey GrGLMagnifierEffect::GenKey(const GrEffectStage& stage, const GrGLCaps&) { + const GrMagnifierEffect& zoom = static_cast(*stage.getEffect()); + return GrGLEffectMatrix::GenKey(zoom.getMatrix(), + stage.getCoordChangeMatrix(), + zoom.texture(0)); } ///////////////////////////////////////////////////////////////////// diff --git a/src/effects/SkMatrixConvolutionImageFilter.cpp b/src/effects/SkMatrixConvolutionImageFilter.cpp index f8d1c093b5..9f00160bca 100644 --- a/src/effects/SkMatrixConvolutionImageFilter.cpp +++ b/src/effects/SkMatrixConvolutionImageFilter.cpp @@ -14,7 +14,11 @@ #if SK_SUPPORT_GPU #include "gl/GrGLEffect.h" +#include "gl/GrGLEffectMatrix.h" #include "GrTBackendEffectFactory.h" +#include "GrTexture.h" +#include "SkMatrix.h" + #endif SkMatrixConvolutionImageFilter::SkMatrixConvolutionImageFilter(const SkISize& kernelSize, const SkScalar* kernel, SkScalar gain, SkScalar bias, const SkIPoint& target, TileMode tileMode, bool convolveAlpha, SkImageFilter* input) @@ -299,21 +303,23 @@ public: private: typedef GrGLUniformManager::UniformHandle UniformHandle; typedef SkMatrixConvolutionImageFilter::TileMode TileMode; - SkISize fKernelSize; - TileMode fTileMode; - bool fConvolveAlpha; + SkISize fKernelSize; + TileMode fTileMode; + bool fConvolveAlpha; + + UniformHandle fKernelUni; + UniformHandle fImageIncrementUni; + UniformHandle fTargetUni; + UniformHandle fGainUni; + UniformHandle fBiasUni; - UniformHandle fKernelUni; - UniformHandle fImageIncrementUni; - UniformHandle fTargetUni; - UniformHandle fGainUni; - UniformHandle fBiasUni; + GrGLEffectMatrix fEffectMatrix; typedef GrGLEffect INHERITED; }; GrGLMatrixConvolutionEffect::GrGLMatrixConvolutionEffect(const GrBackendEffectFactory& factory, - const GrEffect& effect) + const GrEffect& effect) : INHERITED(factory) , fKernelUni(GrGLUniformManager::kInvalidUniformHandle) , fImageIncrementUni(GrGLUniformManager::kInvalidUniformHandle) @@ -324,6 +330,7 @@ GrGLMatrixConvolutionEffect::GrGLMatrixConvolutionEffect(const GrBackendEffectFa fKernelSize = m.kernelSize(); fTileMode = m.tileMode(); fConvolveAlpha = m.convolveAlpha(); + fRequiresTextureMatrix = false; } static void appendTextureLookup(GrGLShaderBuilder* builder, @@ -350,12 +357,13 @@ static void appendTextureLookup(GrGLShaderBuilder* builder, void GrGLMatrixConvolutionEffect::emitCode(GrGLShaderBuilder* builder, const GrEffectStage&, - EffectKey, + EffectKey key, const char* vertexCoords, const char* outputColor, const char* inputColor, const TextureSamplerArray& samplers) { - + const char* coords; + fEffectMatrix.emitCodeMakeFSCoords2D(builder, key, vertexCoords, &coords); fImageIncrementUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, kVec2f_GrSLType, "ImageIncrement"); fKernelUni = builder->addUniformArray(GrGLShaderBuilder::kFragment_ShaderType, @@ -378,8 +386,7 @@ void GrGLMatrixConvolutionEffect::emitCode(GrGLShaderBuilder* builder, int kHeight = fKernelSize.height(); code->appendf("\t\tvec4 sum = vec4(0, 0, 0, 0);\n"); - code->appendf("\t\tvec2 coord = %s - %s * %s;\n", - builder->defaultTexCoordsName(), target, imgInc); + code->appendf("\t\tvec2 coord = %s - %s * %s;\n", coords, target, imgInc); code->appendf("\t\tfor (int y = 0; y < %d; y++) {\n", kHeight); code->appendf("\t\t\tfor (int x = 0; x < %d; x++) {\n", kWidth); code->appendf("\t\t\t\tfloat k = %s[y * %d + x];\n", kernel, kWidth); @@ -398,7 +405,7 @@ void GrGLMatrixConvolutionEffect::emitCode(GrGLShaderBuilder* builder, code->appendf("\t\t%s.rgb = clamp(%s.rgb, 0.0, %s.a);\n", outputColor, outputColor, outputColor); } else { code->appendf("\t\tvec4 c = "); - appendTextureLookup(builder, samplers[0], builder->defaultTexCoordsName(), fTileMode); + appendTextureLookup(builder, samplers[0], coords, fTileMode); code->appendf(";\n"); code->appendf("\t\t%s.a = c.a;\n", outputColor); code->appendf("\t\t%s.rgb = sum.rgb * %s + %s;\n", outputColor, gain, bias); @@ -424,7 +431,11 @@ GrGLEffect::EffectKey GrGLMatrixConvolutionEffect::GenKey(const GrEffectStage& s EffectKey key = encodeXY(m.kernelSize().width(), m.kernelSize().height()); key |= m.tileMode() << 7; key |= m.convolveAlpha() ? 1 << 9 : 0; - return key; + key << GrGLEffectMatrix::kKeyBits; + EffectKey matrixKey = GrGLEffectMatrix::GenKey(m.getMatrix(), + s.getCoordChangeMatrix(), + m.texture(0)); + return key | matrixKey; } void GrGLMatrixConvolutionEffect::setData(const GrGLUniformManager& uman, @@ -443,6 +454,10 @@ void GrGLMatrixConvolutionEffect::setData(const GrGLUniformManager& uman, uman.set1fv(fKernelUni, 0, fKernelSize.width() * fKernelSize.height(), effect.kernel()); uman.set1f(fGainUni, effect.gain()); uman.set1f(fBiasUni, effect.bias()); + fEffectMatrix.setData(uman, + effect.getMatrix(), + stage.getCoordChangeMatrix(), + effect.texture(0)); } GrMatrixConvolutionEffect::GrMatrixConvolutionEffect(GrTexture* texture, @@ -453,7 +468,7 @@ GrMatrixConvolutionEffect::GrMatrixConvolutionEffect(GrTexture* texture, const SkIPoint& target, TileMode tileMode, bool convolveAlpha) - : INHERITED(texture), + : INHERITED(texture, MakeDivByTextureWHMatrix(texture)), fKernelSize(kernelSize), fGain(SkScalarToFloat(gain)), fBias(SkScalarToFloat(bias) / 255.0f), diff --git a/src/gpu/effects/Gr1DKernelEffect.h b/src/gpu/effects/Gr1DKernelEffect.h index f176cddaee..171273360b 100644 --- a/src/gpu/effects/Gr1DKernelEffect.h +++ b/src/gpu/effects/Gr1DKernelEffect.h @@ -9,7 +9,6 @@ #define Gr1DKernelEffect_DEFINED #include "GrSingleTextureEffect.h" -#include "GrTexture.h" #include "SkMatrix.h" /** @@ -21,15 +20,6 @@ * two times the radius. */ -namespace { -inline SkMatrix make_texture_matrix(GrTexture* tex) { - GrAssert(NULL != tex); - SkMatrix mat; - mat.setIDiv(tex->width(), tex->height()); - return mat; -} -} - class Gr1DKernelEffect : public GrSingleTextureEffect { public: @@ -41,7 +31,7 @@ public: Gr1DKernelEffect(GrTexture* texture, Direction direction, int radius) - : GrSingleTextureEffect(texture, make_texture_matrix(texture)) + : GrSingleTextureEffect(texture, MakeDivByTextureWHMatrix(texture)) , fDirection(direction) , fRadius(radius) {} diff --git a/src/gpu/effects/GrSingleTextureEffect.h b/src/gpu/effects/GrSingleTextureEffect.h index e598f2f66e..709d3dcd2b 100644 --- a/src/gpu/effects/GrSingleTextureEffect.h +++ b/src/gpu/effects/GrSingleTextureEffect.h @@ -10,16 +10,18 @@ #include "GrEffect.h" #include "SkMatrix.h" +#include "GrTexture.h" class GrGLSingleTextureEffect; /** - * An effect that merely blits a single texture; commonly used as a base class. + * An effect that draws a single texture with a texture matrix; commonly used as a base class. The + * output color is the texture color is modulated against the input color. */ class GrSingleTextureEffect : public GrEffect { public: - /** These three constructors assume an identity matrix */ + /** These three constructors assume an identity matrix. TODO: Remove these.*/ GrSingleTextureEffect(GrTexture* texture); /* unfiltered, clamp mode */ GrSingleTextureEffect(GrTexture* texture, bool bilerp); /* clamp mode */ GrSingleTextureEffect(GrTexture* texture, const GrTextureParams&); @@ -45,6 +47,14 @@ public: const GrSingleTextureEffect& ste = static_cast(effect); return INHERITED::isEqual(effect) && fMatrix.cheapEqualTo(ste.getMatrix()); } + + static inline SkMatrix MakeDivByTextureWHMatrix(const GrTexture* texture) { + GrAssert(NULL != texture); + SkMatrix mat; + mat.setIDiv(texture->width(), texture->height()); + return mat; + } + private: GR_DECLARE_EFFECT_TEST; -- cgit v1.2.3