diff options
Diffstat (limited to 'src/effects')
20 files changed, 180 insertions, 199 deletions
diff --git a/src/effects/SkAlphaThresholdFilter.cpp b/src/effects/SkAlphaThresholdFilter.cpp index f8b84977e1..76e1bc8ec7 100644 --- a/src/effects/SkAlphaThresholdFilter.cpp +++ b/src/effects/SkAlphaThresholdFilter.cpp @@ -118,7 +118,7 @@ public: virtual void emitCode(GrGLShaderBuilder*, const GrDrawEffect&, - EffectKey, + const GrEffectKey&, const char* outputColor, const char* inputColor, const TransformedCoordsArray&, @@ -140,7 +140,7 @@ GrGLAlphaThresholdEffect::GrGLAlphaThresholdEffect(const GrBackendEffectFactory& void GrGLAlphaThresholdEffect::emitCode(GrGLShaderBuilder* builder, const GrDrawEffect&, - EffectKey key, + const GrEffectKey& key, const char* outputColor, const char* inputColor, const TransformedCoordsArray& coords, diff --git a/src/effects/SkArithmeticMode.cpp b/src/effects/SkArithmeticMode.cpp index 6e01504df7..e43603ac1e 100644 --- a/src/effects/SkArithmeticMode.cpp +++ b/src/effects/SkArithmeticMode.cpp @@ -242,7 +242,7 @@ public: virtual void emitCode(GrGLShaderBuilder*, const GrDrawEffect&, - EffectKey, + const GrEffectKey&, const char* outputColor, const char* inputColor, const TransformedCoordsArray&, @@ -250,7 +250,7 @@ public: virtual void setData(const GrGLUniformManager&, const GrDrawEffect&) SK_OVERRIDE; - static EffectKey GenKey(const GrDrawEffect&, const GrGLCaps& caps); + static void GenKey(const GrDrawEffect&, const GrGLCaps& caps, GrEffectKeyBuilder* b); private: GrGLUniformManager::UniformHandle fKUni; @@ -349,7 +349,7 @@ GrGLArithmeticEffect::~GrGLArithmeticEffect() { void GrGLArithmeticEffect::emitCode(GrGLShaderBuilder* builder, const GrDrawEffect& drawEffect, - EffectKey key, + const GrEffectKey& key, const char* outputColor, const char* inputColor, const TransformedCoordsArray& coords, @@ -401,14 +401,14 @@ void GrGLArithmeticEffect::setData(const GrGLUniformManager& uman, const GrDrawE fEnforcePMColor = arith.enforcePMColor(); } -GrGLEffect::EffectKey GrGLArithmeticEffect::GenKey(const GrDrawEffect& drawEffect, - const GrGLCaps&) { +void GrGLArithmeticEffect::GenKey(const GrDrawEffect& drawEffect, + const GrGLCaps&, GrEffectKeyBuilder* b) { const GrArithmeticEffect& arith = drawEffect.castEffect<GrArithmeticEffect>(); - EffectKey key = arith.enforcePMColor() ? 1 : 0; + uint32_t key = arith.enforcePMColor() ? 1 : 0; if (arith.backgroundTexture()) { key |= 2; } - return key; + b->add32(key); } GrEffect* GrArithmeticEffect::TestCreate(SkRandom* rand, diff --git a/src/effects/SkBlurMaskFilter.cpp b/src/effects/SkBlurMaskFilter.cpp index 4ab9944d8c..3c502f4a6a 100644 --- a/src/effects/SkBlurMaskFilter.cpp +++ b/src/effects/SkBlurMaskFilter.cpp @@ -600,7 +600,7 @@ public: const GrDrawEffect&); virtual void emitCode(GrGLShaderBuilder*, const GrDrawEffect&, - EffectKey, + const GrEffectKey&, const char* outputColor, const char* inputColor, const TransformedCoordsArray&, @@ -641,7 +641,7 @@ void OutputRectBlurProfileLookup(GrGLShaderBuilder* builder, void GrGLRectBlurEffect::emitCode(GrGLShaderBuilder* builder, const GrDrawEffect&, - EffectKey key, + const GrEffectKey& key, const char* outputColor, const char* inputColor, const TransformedCoordsArray& coords, @@ -961,7 +961,7 @@ public: virtual void emitCode(GrGLShaderBuilder* builder, const GrDrawEffect& drawEffect, - EffectKey key, + const GrEffectKey& key, const char* outputColor, const char* inputColor, const TransformedCoordsArray&, @@ -983,7 +983,7 @@ GrGLRRectBlurEffect::GrGLRRectBlurEffect(const GrBackendEffectFactory& factory, void GrGLRRectBlurEffect::emitCode(GrGLShaderBuilder* builder, const GrDrawEffect& drawEffect, - EffectKey key, + const GrEffectKey& key, const char* outputColor, const char* inputColor, const TransformedCoordsArray&, diff --git a/src/effects/SkColorFilters.cpp b/src/effects/SkColorFilters.cpp index 0e2fd6c9d9..43df21555b 100644 --- a/src/effects/SkColorFilters.cpp +++ b/src/effects/SkColorFilters.cpp @@ -228,7 +228,7 @@ public: virtual void emitCode(GrGLShaderBuilder* builder, const GrDrawEffect& drawEffect, - EffectKey key, + const GrEffectKey& key, const char* outputColor, const char* inputColor, const TransformedCoordsArray& coords, @@ -249,12 +249,12 @@ public: builder->fsCodeAppendf("\t%s = %s;\n", outputColor, filter.c_str()); } - static inline EffectKey GenKey(const GrDrawEffect& drawEffect, const GrGLCaps&) { + static void GenKey(const GrDrawEffect& drawEffect, const GrGLCaps&, + GrEffectKeyBuilder* b) { const ModeColorFilterEffect& colorModeFilter = drawEffect.castEffect<ModeColorFilterEffect>(); // The SL code does not depend on filter color at the moment, so no need to represent it // in the key. - EffectKey modeKey = colorModeFilter.mode(); - return modeKey; + b->add32(colorModeFilter.mode()); } virtual void setData(const GrGLUniformManager& uman, const GrDrawEffect& drawEffect) SK_OVERRIDE { diff --git a/src/effects/SkColorMatrixFilter.cpp b/src/effects/SkColorMatrixFilter.cpp index c24a2b773a..31a76ab9cd 100644 --- a/src/effects/SkColorMatrixFilter.cpp +++ b/src/effects/SkColorMatrixFilter.cpp @@ -391,7 +391,7 @@ public: class GLEffect : public GrGLEffect { public: // this class always generates the same code. - static EffectKey GenKey(const GrDrawEffect&, const GrGLCaps&) { return 0; } + static void GenKey(const GrDrawEffect&, const GrGLCaps&, GrEffectKeyBuilder* b) {} GLEffect(const GrBackendEffectFactory& factory, const GrDrawEffect&) @@ -400,7 +400,7 @@ public: virtual void emitCode(GrGLShaderBuilder* builder, const GrDrawEffect&, - EffectKey, + const GrEffectKey&, const char* outputColor, const char* inputColor, const TransformedCoordsArray&, diff --git a/src/effects/SkDisplacementMapEffect.cpp b/src/effects/SkDisplacementMapEffect.cpp index a6897ea891..55935b4bdc 100644 --- a/src/effects/SkDisplacementMapEffect.cpp +++ b/src/effects/SkDisplacementMapEffect.cpp @@ -278,13 +278,13 @@ public: virtual void emitCode(GrGLShaderBuilder*, const GrDrawEffect&, - EffectKey, + const GrEffectKey&, const char* outputColor, const char* inputColor, const TransformedCoordsArray&, const TextureSamplerArray&) SK_OVERRIDE; - static inline EffectKey GenKey(const GrDrawEffect&, const GrGLCaps&); + static inline void GenKey(const GrDrawEffect&, const GrGLCaps&, GrEffectKeyBuilder*); virtual void setData(const GrGLUniformManager&, const GrDrawEffect&) SK_OVERRIDE; @@ -513,7 +513,7 @@ GrGLDisplacementMapEffect::~GrGLDisplacementMapEffect() { void GrGLDisplacementMapEffect::emitCode(GrGLShaderBuilder* builder, const GrDrawEffect&, - EffectKey key, + const GrEffectKey& key, const char* outputColor, const char* inputColor, const TransformedCoordsArray& coords, @@ -600,14 +600,14 @@ void GrGLDisplacementMapEffect::setData(const GrGLUniformManager& uman, SkScalarToFloat(scaleY) : SkScalarToFloat(-scaleY)); } -GrGLEffect::EffectKey GrGLDisplacementMapEffect::GenKey(const GrDrawEffect& drawEffect, - const GrGLCaps&) { +void GrGLDisplacementMapEffect::GenKey(const GrDrawEffect& drawEffect, + const GrGLCaps&, GrEffectKeyBuilder* b) { const GrDisplacementMapEffect& displacementMap = drawEffect.castEffect<GrDisplacementMapEffect>(); - EffectKey xKey = displacementMap.xChannelSelector(); - EffectKey yKey = displacementMap.yChannelSelector() << kChannelSelectorKeyBits; + uint32_t xKey = displacementMap.xChannelSelector(); + uint32_t yKey = displacementMap.yChannelSelector() << kChannelSelectorKeyBits; - return xKey | yKey; + b->add32(xKey | yKey); } #endif diff --git a/src/effects/SkLightingImageFilter.cpp b/src/effects/SkLightingImageFilter.cpp index 682f2bad56..6e6828b745 100644 --- a/src/effects/SkLightingImageFilter.cpp +++ b/src/effects/SkLightingImageFilter.cpp @@ -1131,13 +1131,13 @@ public: virtual void emitCode(GrGLShaderBuilder*, const GrDrawEffect&, - EffectKey, + const GrEffectKey&, const char* outputColor, const char* inputColor, const TransformedCoordsArray&, const TextureSamplerArray&) SK_OVERRIDE; - static inline EffectKey GenKey(const GrDrawEffect&, const GrGLCaps&); + static inline void GenKey(const GrDrawEffect&, const GrGLCaps&, GrEffectKeyBuilder* b); /** * Subclasses of GrGLLightingEffect must call INHERITED::setData(); @@ -1266,7 +1266,7 @@ GrGLLightingEffect::~GrGLLightingEffect() { void GrGLLightingEffect::emitCode(GrGLShaderBuilder* builder, const GrDrawEffect&, - EffectKey key, + const GrEffectKey& key, const char* outputColor, const char* inputColor, const TransformedCoordsArray& coords, @@ -1360,9 +1360,9 @@ void GrGLLightingEffect::emitCode(GrGLShaderBuilder* builder, builder->fsCodeAppend(modulate.c_str()); } -GrGLEffect::EffectKey GrGLLightingEffect::GenKey(const GrDrawEffect& drawEffect, - const GrGLCaps& caps) { - return drawEffect.castEffect<GrLightingEffect>().light()->type(); +void GrGLLightingEffect::GenKey(const GrDrawEffect& drawEffect, + const GrGLCaps& caps, GrEffectKeyBuilder* b) { + b->add32(drawEffect.castEffect<GrLightingEffect>().light()->type()); } void GrGLLightingEffect::setData(const GrGLUniformManager& uman, diff --git a/src/effects/SkLumaColorFilter.cpp b/src/effects/SkLumaColorFilter.cpp index 7564307f45..d33e5e8d78 100644 --- a/src/effects/SkLumaColorFilter.cpp +++ b/src/effects/SkLumaColorFilter.cpp @@ -86,14 +86,11 @@ public: : INHERITED(factory) { } - static EffectKey GenKey(const GrDrawEffect&, const GrGLCaps&) { - // this class always generates the same code. - return 0; - } + static void GenKey(const GrDrawEffect&, const GrGLCaps&, GrEffectKeyBuilder* b) {} virtual void emitCode(GrGLShaderBuilder* builder, const GrDrawEffect&, - EffectKey, + const GrEffectKey&, const char* outputColor, const char* inputColor, const TransformedCoordsArray&, diff --git a/src/effects/SkMagnifierImageFilter.cpp b/src/effects/SkMagnifierImageFilter.cpp index 4a730c2c13..d3adf27183 100644 --- a/src/effects/SkMagnifierImageFilter.cpp +++ b/src/effects/SkMagnifierImageFilter.cpp @@ -97,7 +97,7 @@ public: virtual void emitCode(GrGLShaderBuilder*, const GrDrawEffect&, - EffectKey, + const GrEffectKey&, const char* outputColor, const char* inputColor, const TransformedCoordsArray&, @@ -119,7 +119,7 @@ GrGLMagnifierEffect::GrGLMagnifierEffect(const GrBackendEffectFactory& factory, void GrGLMagnifierEffect::emitCode(GrGLShaderBuilder* builder, const GrDrawEffect&, - EffectKey key, + const GrEffectKey& key, const char* outputColor, const char* inputColor, const TransformedCoordsArray& coords, diff --git a/src/effects/SkMatrixConvolutionImageFilter.cpp b/src/effects/SkMatrixConvolutionImageFilter.cpp index fa7d20596c..676cab7b32 100644 --- a/src/effects/SkMatrixConvolutionImageFilter.cpp +++ b/src/effects/SkMatrixConvolutionImageFilter.cpp @@ -405,13 +405,13 @@ public: const GrDrawEffect& effect); virtual void emitCode(GrGLShaderBuilder*, const GrDrawEffect&, - EffectKey, + const GrEffectKey&, const char* outputColor, const char* inputColor, const TransformedCoordsArray&, const TextureSamplerArray&) SK_OVERRIDE; - static inline EffectKey GenKey(const GrDrawEffect&, const GrGLCaps&); + static inline void GenKey(const GrDrawEffect&, const GrGLCaps&, GrEffectKeyBuilder*); virtual void setData(const GrGLUniformManager&, const GrDrawEffect&) SK_OVERRIDE; @@ -465,7 +465,7 @@ static void appendTextureLookup(GrGLShaderBuilder* builder, void GrGLMatrixConvolutionEffect::emitCode(GrGLShaderBuilder* builder, const GrDrawEffect&, - EffectKey key, + const GrEffectKey& key, const char* outputColor, const char* inputColor, const TransformedCoordsArray& coords, @@ -537,13 +537,13 @@ int encodeXY(int x, int y) { }; -GrGLEffect::EffectKey GrGLMatrixConvolutionEffect::GenKey(const GrDrawEffect& drawEffect, - const GrGLCaps&) { +void GrGLMatrixConvolutionEffect::GenKey(const GrDrawEffect& drawEffect, + const GrGLCaps&, GrEffectKeyBuilder* b) { const GrMatrixConvolutionEffect& m = drawEffect.castEffect<GrMatrixConvolutionEffect>(); - EffectKey key = encodeXY(m.kernelSize().width(), m.kernelSize().height()); + uint32_t key = encodeXY(m.kernelSize().width(), m.kernelSize().height()); key |= m.tileMode() << 7; key |= m.convolveAlpha() ? 1 << 9 : 0; - return key; + b->add32(key); } void GrGLMatrixConvolutionEffect::setData(const GrGLUniformManager& uman, diff --git a/src/effects/SkMorphologyImageFilter.cpp b/src/effects/SkMorphologyImageFilter.cpp index 10c6fe5ad0..7be4435b68 100644 --- a/src/effects/SkMorphologyImageFilter.cpp +++ b/src/effects/SkMorphologyImageFilter.cpp @@ -316,13 +316,13 @@ public: virtual void emitCode(GrGLShaderBuilder*, const GrDrawEffect&, - EffectKey, + const GrEffectKey&, const char* outputColor, const char* inputColor, const TransformedCoordsArray&, const TextureSamplerArray&) SK_OVERRIDE; - static inline EffectKey GenKey(const GrDrawEffect&, const GrGLCaps&); + static inline void GenKey(const GrDrawEffect&, const GrGLCaps&, GrEffectKeyBuilder* b); virtual void setData(const GrGLUniformManager&, const GrDrawEffect&) SK_OVERRIDE; @@ -346,7 +346,7 @@ GrGLMorphologyEffect::GrGLMorphologyEffect(const GrBackendEffectFactory& factory void GrGLMorphologyEffect::emitCode(GrGLShaderBuilder* builder, const GrDrawEffect&, - EffectKey key, + const GrEffectKey& key, const char* outputColor, const char* inputColor, const TransformedCoordsArray& coords, @@ -384,12 +384,12 @@ void GrGLMorphologyEffect::emitCode(GrGLShaderBuilder* builder, builder->fsCodeAppend(modulate.c_str()); } -GrGLEffect::EffectKey GrGLMorphologyEffect::GenKey(const GrDrawEffect& drawEffect, - const GrGLCaps&) { +void GrGLMorphologyEffect::GenKey(const GrDrawEffect& drawEffect, + const GrGLCaps&, GrEffectKeyBuilder* b) { const GrMorphologyEffect& m = drawEffect.castEffect<GrMorphologyEffect>(); - EffectKey key = static_cast<EffectKey>(m.radius()); + uint32_t key = static_cast<uint32_t>(m.radius()); key |= (m.type() << 8); - return key; + b->add32(key); } void GrGLMorphologyEffect::setData(const GrGLUniformManager& uman, diff --git a/src/effects/SkPerlinNoiseShader.cpp b/src/effects/SkPerlinNoiseShader.cpp index e4811627b2..f0b9f67712 100644 --- a/src/effects/SkPerlinNoiseShader.cpp +++ b/src/effects/SkPerlinNoiseShader.cpp @@ -499,7 +499,7 @@ public: virtual void emitCode(GrGLShaderBuilder*, const GrDrawEffect&, - EffectKey, + const GrEffectKey&, const char* outputColor, const char* inputColor, const TransformedCoordsArray&, @@ -507,7 +507,7 @@ public: virtual void setData(const GrGLUniformManager&, const GrDrawEffect&) SK_OVERRIDE; - static inline EffectKey GenKey(const GrDrawEffect&, const GrGLCaps&); + static inline void GenKey(const GrDrawEffect&, const GrGLCaps&, GrEffectKeyBuilder* b); private: @@ -647,7 +647,7 @@ GrGLPerlinNoise::GrGLPerlinNoise(const GrBackendEffectFactory& factory, const Gr void GrGLPerlinNoise::emitCode(GrGLShaderBuilder* builder, const GrDrawEffect&, - EffectKey key, + const GrEffectKey& key, const char* outputColor, const char* inputColor, const TransformedCoordsArray& coords, @@ -900,10 +900,10 @@ void GrGLPerlinNoise::emitCode(GrGLShaderBuilder* builder, outputColor, outputColor, outputColor, outputColor); } -GrGLEffect::EffectKey GrGLPerlinNoise::GenKey(const GrDrawEffect& drawEffect, const GrGLCaps&) { +void GrGLPerlinNoise::GenKey(const GrDrawEffect& drawEffect, const GrGLCaps&, GrEffectKeyBuilder* b) { const GrPerlinNoiseEffect& turbulence = drawEffect.castEffect<GrPerlinNoiseEffect>(); - EffectKey key = turbulence.numOctaves(); + uint32_t key = turbulence.numOctaves(); key = key << 3; // Make room for next 3 bits @@ -923,7 +923,7 @@ GrGLEffect::EffectKey GrGLPerlinNoise::GenKey(const GrDrawEffect& drawEffect, co key |= 0x4; // Flip the 3rd bit if tile stitching is on } - return key; + b->add32(key); } void GrGLPerlinNoise::setData(const GrGLUniformManager& uman, const GrDrawEffect& drawEffect) { diff --git a/src/effects/SkTableColorFilter.cpp b/src/effects/SkTableColorFilter.cpp index 4cf09877c4..e9ce20f6c1 100644 --- a/src/effects/SkTableColorFilter.cpp +++ b/src/effects/SkTableColorFilter.cpp @@ -270,7 +270,7 @@ public: virtual void emitCode(GrGLShaderBuilder*, const GrDrawEffect&, - EffectKey, + const GrEffectKey&, const char* outputColor, const char* inputColor, const TransformedCoordsArray&, @@ -278,7 +278,7 @@ public: virtual void setData(const GrGLUniformManager&, const GrDrawEffect&) SK_OVERRIDE {} - static EffectKey GenKey(const GrDrawEffect&, const GrGLCaps&); + static void GenKey(const GrDrawEffect&, const GrGLCaps&, GrEffectKeyBuilder* b) {} private: @@ -291,7 +291,7 @@ GLColorTableEffect::GLColorTableEffect(const GrBackendEffectFactory& factory, co void GLColorTableEffect::emitCode(GrGLShaderBuilder* builder, const GrDrawEffect&, - EffectKey, + const GrEffectKey&, const char* outputColor, const char* inputColor, const TransformedCoordsArray&, @@ -333,10 +333,6 @@ void GLColorTableEffect::emitCode(GrGLShaderBuilder* builder, builder->fsCodeAppendf("\t\t%s.rgb *= %s.a;\n", outputColor, outputColor); } -GrGLEffect::EffectKey GLColorTableEffect::GenKey(const GrDrawEffect&, const GrGLCaps&) { - return 0; -} - /////////////////////////////////////////////////////////////////////////////// ColorTableEffect::ColorTableEffect(GrTexture* texture, unsigned flags) diff --git a/src/effects/gradients/SkGradientShader.cpp b/src/effects/gradients/SkGradientShader.cpp index fb8a7e5c8f..5014c35ee0 100644 --- a/src/effects/gradients/SkGradientShader.cpp +++ b/src/effects/gradients/SkGradientShader.cpp @@ -862,15 +862,15 @@ GrGLGradientEffect::GrGLGradientEffect(const GrBackendEffectFactory& factory) GrGLGradientEffect::~GrGLGradientEffect() { } -void GrGLGradientEffect::emitUniforms(GrGLShaderBuilder* builder, EffectKey key) { +void GrGLGradientEffect::emitUniforms(GrGLShaderBuilder* builder, uint32_t baseKey) { - if (SkGradientShaderBase::kTwo_GpuColorType == ColorTypeFromKey(key)) { // 2 Color case + if (SkGradientShaderBase::kTwo_GpuColorType == ColorTypeFromKey(baseKey)) { // 2 Color case fColorStartUni = builder->addUniform(GrGLShaderBuilder::kFragment_Visibility, kVec4f_GrSLType, "GradientStartColor"); fColorEndUni = builder->addUniform(GrGLShaderBuilder::kFragment_Visibility, kVec4f_GrSLType, "GradientEndColor"); - } else if (SkGradientShaderBase::kThree_GpuColorType == ColorTypeFromKey(key)){ // 3 Color Case + } else if (SkGradientShaderBase::kThree_GpuColorType == ColorTypeFromKey(baseKey)){ // 3 Color Case fColorStartUni = builder->addUniform(GrGLShaderBuilder::kFragment_Visibility, kVec4f_GrSLType, "GradientStartColor"); fColorMidUni = builder->addUniform(GrGLShaderBuilder::kFragment_Visibility, @@ -944,10 +944,10 @@ void GrGLGradientEffect::setData(const GrGLUniformManager& uman, } -GrGLEffect::EffectKey GrGLGradientEffect::GenBaseGradientKey(const GrDrawEffect& drawEffect) { +uint32_t GrGLGradientEffect::GenBaseGradientKey(const GrDrawEffect& drawEffect) { const GrGradientEffect& e = drawEffect.castEffect<GrGradientEffect>(); - EffectKey key = 0; + uint32_t key = 0; if (SkGradientShaderBase::kTwo_GpuColorType == e.getColorType()) { key |= kTwoColorKey; @@ -964,11 +964,11 @@ GrGLEffect::EffectKey GrGLGradientEffect::GenBaseGradientKey(const GrDrawEffect& void GrGLGradientEffect::emitColor(GrGLShaderBuilder* builder, const char* gradientTValue, - EffectKey key, + uint32_t baseKey, const char* outputColor, const char* inputColor, const TextureSamplerArray& samplers) { - if (SkGradientShaderBase::kTwo_GpuColorType == ColorTypeFromKey(key)){ + if (SkGradientShaderBase::kTwo_GpuColorType == ColorTypeFromKey(baseKey)){ builder->fsCodeAppendf("\tvec4 colorTemp = mix(%s, %s, clamp(%s, 0.0, 1.0));\n", builder->getUniformVariable(fColorStartUni).c_str(), builder->getUniformVariable(fColorEndUni).c_str(), @@ -978,13 +978,13 @@ void GrGLGradientEffect::emitColor(GrGLShaderBuilder* builder, // The gradient SkShader reporting opaque is more restrictive than necessary in the two pt // case. Make sure the key reflects this optimization (and note that it can use the same // shader as thekBeforeIterp case). This same optimization applies to the 3 color case below. - if (GrGradientEffect::kAfterInterp_PremulType == PremulTypeFromKey(key)) { + if (GrGradientEffect::kAfterInterp_PremulType == PremulTypeFromKey(baseKey)) { builder->fsCodeAppend("\tcolorTemp.rgb *= colorTemp.a;\n"); } builder->fsCodeAppendf("\t%s = %s;\n", outputColor, (GrGLSLExpr4(inputColor) * GrGLSLExpr4("colorTemp")).c_str()); - } else if (SkGradientShaderBase::kThree_GpuColorType == ColorTypeFromKey(key)){ + } else if (SkGradientShaderBase::kThree_GpuColorType == ColorTypeFromKey(baseKey)){ builder->fsCodeAppendf("\tfloat oneMinus2t = 1.0 - (2.0 * (%s));\n", gradientTValue); builder->fsCodeAppendf("\tvec4 colorTemp = clamp(oneMinus2t, 0.0, 1.0) * %s;\n", @@ -1002,7 +1002,7 @@ void GrGLGradientEffect::emitColor(GrGLShaderBuilder* builder, } builder->fsCodeAppendf("\tcolorTemp += clamp(-oneMinus2t, 0.0, 1.0) * %s;\n", builder->getUniformVariable(fColorEndUni).c_str()); - if (GrGradientEffect::kAfterInterp_PremulType == PremulTypeFromKey(key)) { + if (GrGradientEffect::kAfterInterp_PremulType == PremulTypeFromKey(baseKey)) { builder->fsCodeAppend("\tcolorTemp.rgb *= colorTemp.a;\n"); } diff --git a/src/effects/gradients/SkGradientShaderPriv.h b/src/effects/gradients/SkGradientShaderPriv.h index 9613537803..61acf3c8fe 100644 --- a/src/effects/gradients/SkGradientShaderPriv.h +++ b/src/effects/gradients/SkGradientShaderPriv.h @@ -379,6 +379,29 @@ public: virtual void setData(const GrGLUniformManager&, const GrDrawEffect&) SK_OVERRIDE; protected: + /** + * Subclasses must call this. It will return a key for the part of the shader code controlled + * by the base class. The subclasses must stick it in their key and then pass it to the below + * emit* functions from their emitCode function. + */ + static uint32_t GenBaseGradientKey(const GrDrawEffect&); + + // Emits the uniform used as the y-coord to texture samples in derived classes. Subclasses + // should call this method from their emitCode(). + void emitUniforms(GrGLShaderBuilder* builder, uint32_t baseKey); + + + // emit code that gets a fragment's color from an expression for t; Has branches for 3 separate + // control flows inside -- 2 color gradients, 3 color symmetric gradients (both using + // native GLSL mix), and 4+ color gradients that use the traditional texture lookup. + void emitColor(GrGLShaderBuilder* builder, + const char* gradientTValue, + uint32_t baseKey, + const char* outputColor, + const char* inputColor, + const TextureSamplerArray& samplers); + +private: enum { kPremulTypeKeyBitCnt = 1, kPremulTypeMask = 1, @@ -393,45 +416,24 @@ protected: // and combine with the result of GenBaseGradientKey. kBaseKeyBitCnt = (kPremulTypeKeyBitCnt + kColorKeyBitCnt) }; + GR_STATIC_ASSERT(kBaseKeyBitCnt <= 32); - static SkGradientShaderBase::GpuColorType ColorTypeFromKey(EffectKey key){ - if (kTwoColorKey == (key & kColorKeyMask)) { + static SkGradientShaderBase::GpuColorType ColorTypeFromKey(uint32_t baseKey){ + if (kTwoColorKey == (baseKey & kColorKeyMask)) { return SkGradientShaderBase::kTwo_GpuColorType; - } else if (kThreeColorKey == (key & kColorKeyMask)) { + } else if (kThreeColorKey == (baseKey & kColorKeyMask)) { return SkGradientShaderBase::kThree_GpuColorType; } else {return SkGradientShaderBase::kTexture_GpuColorType;} } - static GrGradientEffect::PremulType PremulTypeFromKey(EffectKey key){ - if (kPremulBeforeInterpKey == (key & kPremulTypeMask)) { + static GrGradientEffect::PremulType PremulTypeFromKey(uint32_t baseKey){ + if (kPremulBeforeInterpKey == (baseKey & kPremulTypeMask)) { return GrGradientEffect::kBeforeInterp_PremulType; } else { return GrGradientEffect::kAfterInterp_PremulType; } } - /** - * Subclasses must call this. It will return a value restricted to the lower kBaseKeyBitCnt - * bits. - */ - static EffectKey GenBaseGradientKey(const GrDrawEffect&); - - // Emits the uniform used as the y-coord to texture samples in derived classes. Subclasses - // should call this method from their emitCode(). - void emitUniforms(GrGLShaderBuilder* builder, EffectKey key); - - - // emit code that gets a fragment's color from an expression for t; Has branches for 3 separate - // control flows inside -- 2 color gradients, 3 color symmetric gradients (both using - // native GLSL mix), and 4+ color gradients that use the traditional texture lookup. - void emitColor(GrGLShaderBuilder* builder, - const char* gradientTValue, - EffectKey key, - const char* outputColor, - const char* inputColor, - const TextureSamplerArray& samplers); - -private: SkScalar fCachedYCoord; GrGLUniformManager::UniformHandle fFSYUni; GrGLUniformManager::UniformHandle fColorStartUni; diff --git a/src/effects/gradients/SkLinearGradient.cpp b/src/effects/gradients/SkLinearGradient.cpp index 332c9b4af9..9de459125a 100644 --- a/src/effects/gradients/SkLinearGradient.cpp +++ b/src/effects/gradients/SkLinearGradient.cpp @@ -461,14 +461,14 @@ public: virtual void emitCode(GrGLShaderBuilder*, const GrDrawEffect&, - EffectKey, + const GrEffectKey&, const char* outputColor, const char* inputColor, const TransformedCoordsArray&, const TextureSamplerArray&) SK_OVERRIDE; - static EffectKey GenKey(const GrDrawEffect& drawEffect, const GrGLCaps&) { - return GenBaseGradientKey(drawEffect); + static void GenKey(const GrDrawEffect& drawEffect, const GrGLCaps&, GrEffectKeyBuilder* b) { + b->add32(GenBaseGradientKey(drawEffect)); } private: @@ -538,15 +538,16 @@ GrEffect* GrLinearGradient::TestCreate(SkRandom* random, void GrGLLinearGradient::emitCode(GrGLShaderBuilder* builder, const GrDrawEffect&, - EffectKey key, + const GrEffectKey& key, const char* outputColor, const char* inputColor, const TransformedCoordsArray& coords, const TextureSamplerArray& samplers) { - this->emitUniforms(builder, key); + uint32_t baseKey = key.get32(0); + this->emitUniforms(builder, baseKey); SkString t = builder->ensureFSCoords2D(coords, 0); t.append(".x"); - this->emitColor(builder, t.c_str(), key, outputColor, inputColor, samplers); + this->emitColor(builder, t.c_str(), baseKey, outputColor, inputColor, samplers); } ///////////////////////////////////////////////////////////////////// diff --git a/src/effects/gradients/SkRadialGradient.cpp b/src/effects/gradients/SkRadialGradient.cpp index e3aaea341f..8a378aad09 100644 --- a/src/effects/gradients/SkRadialGradient.cpp +++ b/src/effects/gradients/SkRadialGradient.cpp @@ -470,14 +470,14 @@ public: virtual void emitCode(GrGLShaderBuilder*, const GrDrawEffect&, - EffectKey, + const GrEffectKey&, const char* outputColor, const char* inputColor, const TransformedCoordsArray&, const TextureSamplerArray&) SK_OVERRIDE; - static EffectKey GenKey(const GrDrawEffect& drawEffect, const GrGLCaps&) { - return GenBaseGradientKey(drawEffect); + static void GenKey(const GrDrawEffect& drawEffect, const GrGLCaps&, GrEffectKeyBuilder* b) { + b->add32(GenBaseGradientKey(drawEffect)); } private: @@ -549,16 +549,17 @@ GrEffect* GrRadialGradient::TestCreate(SkRandom* random, void GrGLRadialGradient::emitCode(GrGLShaderBuilder* builder, const GrDrawEffect&, - EffectKey key, + const GrEffectKey& key, const char* outputColor, const char* inputColor, const TransformedCoordsArray& coords, const TextureSamplerArray& samplers) { - this->emitUniforms(builder, key); + uint32_t baseKey = key.get32(0); + this->emitUniforms(builder, baseKey); SkString t("length("); t.append(builder->ensureFSCoords2D(coords, 0)); t.append(")"); - this->emitColor(builder, t.c_str(), key, outputColor, inputColor, samplers); + this->emitColor(builder, t.c_str(), baseKey, outputColor, inputColor, samplers); } ///////////////////////////////////////////////////////////////////// diff --git a/src/effects/gradients/SkSweepGradient.cpp b/src/effects/gradients/SkSweepGradient.cpp index bb9d628968..66e755a1bc 100644 --- a/src/effects/gradients/SkSweepGradient.cpp +++ b/src/effects/gradients/SkSweepGradient.cpp @@ -186,14 +186,14 @@ public: virtual void emitCode(GrGLShaderBuilder*, const GrDrawEffect&, - EffectKey, + const GrEffectKey&, const char* outputColor, const char* inputColor, const TransformedCoordsArray&, const TextureSamplerArray&) SK_OVERRIDE; - static EffectKey GenKey(const GrDrawEffect& drawEffect, const GrGLCaps&) { - return GenBaseGradientKey(drawEffect); + static void GenKey(const GrDrawEffect& drawEffect, const GrGLCaps&, GrEffectKeyBuilder* b) { + b->add32(GenBaseGradientKey(drawEffect)); } private: @@ -256,12 +256,13 @@ GrEffect* GrSweepGradient::TestCreate(SkRandom* random, void GrGLSweepGradient::emitCode(GrGLShaderBuilder* builder, const GrDrawEffect&, - EffectKey key, + const GrEffectKey& key, const char* outputColor, const char* inputColor, const TransformedCoordsArray& coords, const TextureSamplerArray& samplers) { - this->emitUniforms(builder, key); + uint32_t baseKey = key.get32(0); + this->emitUniforms(builder, baseKey); SkString coords2D = builder->ensureFSCoords2D(coords, 0); const GrGLContextInfo ctxInfo = builder->ctxInfo(); SkString t; @@ -275,8 +276,7 @@ void GrGLSweepGradient::emitCode(GrGLShaderBuilder* builder, t.printf("atan(- %s.y, -1.0 * %s.x) * 0.1591549430918 + 0.5", coords2D.c_str(), coords2D.c_str()); } - this->emitColor(builder, t.c_str(), key, - outputColor, inputColor, samplers); + this->emitColor(builder, t.c_str(), baseKey, outputColor, inputColor, samplers); } ///////////////////////////////////////////////////////////////////// diff --git a/src/effects/gradients/SkTwoPointConicalGradient_gpu.cpp b/src/effects/gradients/SkTwoPointConicalGradient_gpu.cpp index 8beb6fb828..76f9a492b8 100644 --- a/src/effects/gradients/SkTwoPointConicalGradient_gpu.cpp +++ b/src/effects/gradients/SkTwoPointConicalGradient_gpu.cpp @@ -139,14 +139,14 @@ public: virtual void emitCode(GrGLShaderBuilder*, const GrDrawEffect&, - EffectKey, + const GrEffectKey&, const char* outputColor, const char* inputColor, const TransformedCoordsArray&, const TextureSamplerArray&) SK_OVERRIDE; virtual void setData(const GrGLUniformManager&, const GrDrawEffect&) SK_OVERRIDE; - static EffectKey GenKey(const GrDrawEffect&, const GrGLCaps& caps); + static void GenKey(const GrDrawEffect&, const GrGLCaps& caps, GrEffectKeyBuilder* b); protected: UniformHandle fParamUni; @@ -219,12 +219,13 @@ GLEdge2PtConicalEffect::GLEdge2PtConicalEffect(const GrBackendEffectFactory& fac void GLEdge2PtConicalEffect::emitCode(GrGLShaderBuilder* builder, const GrDrawEffect&, - EffectKey key, + const GrEffectKey& key, const char* outputColor, const char* inputColor, const TransformedCoordsArray& coords, const TextureSamplerArray& samplers) { - this->emitUniforms(builder, key); + uint32_t baseKey = key.get32(0); + this->emitUniforms(builder, baseKey); fParamUni = builder->addUniformArray(GrGLShaderBuilder::kFragment_Visibility, kFloat_GrSLType, "Conical2FSParams", 3); @@ -268,7 +269,7 @@ void GLEdge2PtConicalEffect::emitCode(GrGLShaderBuilder* builder, builder->fsCodeAppendf("\tif (%s * %s + %s > 0.0) {\n", tName.c_str(), p2.c_str(), p0.c_str()); builder->fsCodeAppend("\t"); - this->emitColor(builder, tName.c_str(), key, outputColor, inputColor, samplers); + this->emitColor(builder, tName.c_str(), baseKey, outputColor, inputColor, samplers); builder->fsCodeAppend("\t}\n"); } @@ -294,9 +295,9 @@ void GLEdge2PtConicalEffect::setData(const GrGLUniformManager& uman, } } -GrGLEffect::EffectKey GLEdge2PtConicalEffect::GenKey(const GrDrawEffect& drawEffect, - const GrGLCaps&) { - return GenBaseGradientKey(drawEffect); +void GLEdge2PtConicalEffect::GenKey(const GrDrawEffect& drawEffect, + const GrGLCaps&, GrEffectKeyBuilder* b) { + b->add32(GenBaseGradientKey(drawEffect)); } ////////////////////////////////////////////////////////////////////////////// @@ -414,14 +415,14 @@ public: virtual void emitCode(GrGLShaderBuilder*, const GrDrawEffect&, - EffectKey, + const GrEffectKey&, const char* outputColor, const char* inputColor, const TransformedCoordsArray&, const TextureSamplerArray&) SK_OVERRIDE; virtual void setData(const GrGLUniformManager&, const GrDrawEffect&) SK_OVERRIDE; - static EffectKey GenKey(const GrDrawEffect&, const GrGLCaps& caps); + static void GenKey(const GrDrawEffect&, const GrGLCaps& caps, GrEffectKeyBuilder* b); protected: UniformHandle fParamUni; @@ -494,12 +495,13 @@ GLFocalOutside2PtConicalEffect::GLFocalOutside2PtConicalEffect(const GrBackendEf void GLFocalOutside2PtConicalEffect::emitCode(GrGLShaderBuilder* builder, const GrDrawEffect&, - EffectKey key, + const GrEffectKey& key, const char* outputColor, const char* inputColor, const TransformedCoordsArray& coords, const TextureSamplerArray& samplers) { - this->emitUniforms(builder, key); + uint32_t baseKey = key.get32(0); + this->emitUniforms(builder, baseKey); fParamUni = builder->addUniformArray(GrGLShaderBuilder::kFragment_Visibility, kFloat_GrSLType, "Conical2FSParams", 2); SkString tName("t"); @@ -535,7 +537,7 @@ void GLFocalOutside2PtConicalEffect::emitCode(GrGLShaderBuilder* builder, builder->fsCodeAppendf("\tif (%s >= 0.0 && d >= 0.0) {\n", tName.c_str()); builder->fsCodeAppend("\t\t"); - this->emitColor(builder, tName.c_str(), key, outputColor, inputColor, samplers); + this->emitColor(builder, tName.c_str(), baseKey, outputColor, inputColor, samplers); builder->fsCodeAppend("\t}\n"); } @@ -559,18 +561,11 @@ void GLFocalOutside2PtConicalEffect::setData(const GrGLUniformManager& uman, } } -GrGLEffect::EffectKey GLFocalOutside2PtConicalEffect::GenKey(const GrDrawEffect& drawEffect, - const GrGLCaps&) { - enum { - kIsFlipped = 1 << kBaseKeyBitCnt, - }; - - EffectKey key = GenBaseGradientKey(drawEffect); - - if (drawEffect.castEffect<FocalOutside2PtConicalEffect>().isFlipped()) { - key |= kIsFlipped; - } - return key; +void GLFocalOutside2PtConicalEffect::GenKey(const GrDrawEffect& drawEffect, + const GrGLCaps&, GrEffectKeyBuilder* b) { + uint32_t* key = b->add32n(2); + key[0] = GenBaseGradientKey(drawEffect); + key[1] = drawEffect.castEffect<FocalOutside2PtConicalEffect>().isFlipped(); } ////////////////////////////////////////////////////////////////////////////// @@ -625,14 +620,14 @@ public: virtual void emitCode(GrGLShaderBuilder*, const GrDrawEffect&, - EffectKey, + const GrEffectKey&, const char* outputColor, const char* inputColor, const TransformedCoordsArray&, const TextureSamplerArray&) SK_OVERRIDE; virtual void setData(const GrGLUniformManager&, const GrDrawEffect&) SK_OVERRIDE; - static EffectKey GenKey(const GrDrawEffect&, const GrGLCaps& caps); + static void GenKey(const GrDrawEffect&, const GrGLCaps& caps, GrEffectKeyBuilder* b); protected: UniformHandle fFocalUni; @@ -702,12 +697,13 @@ GLFocalInside2PtConicalEffect::GLFocalInside2PtConicalEffect(const GrBackendEffe void GLFocalInside2PtConicalEffect::emitCode(GrGLShaderBuilder* builder, const GrDrawEffect&, - EffectKey key, + const GrEffectKey& key, const char* outputColor, const char* inputColor, const TransformedCoordsArray& coords, const TextureSamplerArray& samplers) { - this->emitUniforms(builder, key); + uint32_t baseKey = key.get32(0); + this->emitUniforms(builder, baseKey); fFocalUni = builder->addUniform(GrGLShaderBuilder::kFragment_Visibility, kFloat_GrSLType, "Conical2FSParams"); SkString tName("t"); @@ -724,7 +720,7 @@ void GLFocalInside2PtConicalEffect::emitCode(GrGLShaderBuilder* builder, builder->fsCodeAppendf("\tfloat %s = %s.x * %s + length(%s);\n", tName.c_str(), coords2D, focal.c_str(), coords2D); - this->emitColor(builder, tName.c_str(), key, outputColor, inputColor, samplers); + this->emitColor(builder, tName.c_str(), baseKey, outputColor, inputColor, samplers); } void GLFocalInside2PtConicalEffect::setData(const GrGLUniformManager& uman, @@ -739,9 +735,9 @@ void GLFocalInside2PtConicalEffect::setData(const GrGLUniformManager& uman, } } -GrGLEffect::EffectKey GLFocalInside2PtConicalEffect::GenKey(const GrDrawEffect& drawEffect, - const GrGLCaps&) { - return GenBaseGradientKey(drawEffect); +void GLFocalInside2PtConicalEffect::GenKey(const GrDrawEffect& drawEffect, + const GrGLCaps&, GrEffectKeyBuilder* b) { + b->add32(GenBaseGradientKey(drawEffect)); } ////////////////////////////////////////////////////////////////////////////// @@ -865,14 +861,14 @@ public: virtual void emitCode(GrGLShaderBuilder*, const GrDrawEffect&, - EffectKey, + const GrEffectKey&, const char* outputColor, const char* inputColor, const TransformedCoordsArray&, const TextureSamplerArray&) SK_OVERRIDE; virtual void setData(const GrGLUniformManager&, const GrDrawEffect&) SK_OVERRIDE; - static EffectKey GenKey(const GrDrawEffect&, const GrGLCaps& caps); + static void GenKey(const GrDrawEffect&, const GrGLCaps& caps, GrEffectKeyBuilder* b); protected: UniformHandle fCenterUni; @@ -950,12 +946,13 @@ GLCircleInside2PtConicalEffect::GLCircleInside2PtConicalEffect(const GrBackendEf void GLCircleInside2PtConicalEffect::emitCode(GrGLShaderBuilder* builder, const GrDrawEffect&, - EffectKey key, + const GrEffectKey& key, const char* outputColor, const char* inputColor, const TransformedCoordsArray& coords, const TextureSamplerArray& samplers) { - this->emitUniforms(builder, key); + uint32_t baseKey = key.get32(0); + this->emitUniforms(builder, baseKey); fCenterUni = builder->addUniform(GrGLShaderBuilder::kFragment_Visibility, kVec2f_GrSLType, "Conical2FSCenter"); fParamUni = builder->addUniform(GrGLShaderBuilder::kFragment_Visibility, @@ -985,7 +982,7 @@ void GLCircleInside2PtConicalEffect::emitCode(GrGLShaderBuilder* builder, builder->fsCodeAppendf("\tfloat %s = d + sqrt(d * d - %s.x * pDotp + %s.z);\n", tName.c_str(), params.c_str(), params.c_str()); - this->emitColor(builder, tName.c_str(), key, outputColor, inputColor, samplers); + this->emitColor(builder, tName.c_str(), baseKey, outputColor, inputColor, samplers); } void GLCircleInside2PtConicalEffect::setData(const GrGLUniformManager& uman, @@ -1012,10 +1009,9 @@ void GLCircleInside2PtConicalEffect::setData(const GrGLUniformManager& uman, } } -GrGLEffect::EffectKey GLCircleInside2PtConicalEffect::GenKey(const GrDrawEffect& drawEffect, - const GrGLCaps&) { - EffectKey key = GenBaseGradientKey(drawEffect); - return key; +void GLCircleInside2PtConicalEffect::GenKey(const GrDrawEffect& drawEffect, + const GrGLCaps&, GrEffectKeyBuilder* b) { + b->add32(GenBaseGradientKey(drawEffect)); } ////////////////////////////////////////////////////////////////////////////// @@ -1091,14 +1087,14 @@ public: virtual void emitCode(GrGLShaderBuilder*, const GrDrawEffect&, - EffectKey, + const GrEffectKey&, const char* outputColor, const char* inputColor, const TransformedCoordsArray&, const TextureSamplerArray&) SK_OVERRIDE; virtual void setData(const GrGLUniformManager&, const GrDrawEffect&) SK_OVERRIDE; - static EffectKey GenKey(const GrDrawEffect&, const GrGLCaps& caps); + static void GenKey(const GrDrawEffect&, const GrGLCaps& caps, GrEffectKeyBuilder* b); protected: UniformHandle fCenterUni; @@ -1184,12 +1180,13 @@ GLCircleOutside2PtConicalEffect::GLCircleOutside2PtConicalEffect(const GrBackend void GLCircleOutside2PtConicalEffect::emitCode(GrGLShaderBuilder* builder, const GrDrawEffect&, - EffectKey key, + const GrEffectKey& key, const char* outputColor, const char* inputColor, const TransformedCoordsArray& coords, const TextureSamplerArray& samplers) { - this->emitUniforms(builder, key); + uint32_t baseKey = key.get32(0); + this->emitUniforms(builder, baseKey); fCenterUni = builder->addUniform(GrGLShaderBuilder::kFragment_Visibility, kVec2f_GrSLType, "Conical2FSCenter"); fParamUni = builder->addUniform(GrGLShaderBuilder::kFragment_Visibility, @@ -1233,7 +1230,7 @@ void GLCircleOutside2PtConicalEffect::emitCode(GrGLShaderBuilder* builder, builder->fsCodeAppendf("\tif (%s >= %s.w && deter >= 0.0) {\n", tName.c_str(), params.c_str()); builder->fsCodeAppend("\t\t"); - this->emitColor(builder, tName.c_str(), key, outputColor, inputColor, samplers); + this->emitColor(builder, tName.c_str(), baseKey, outputColor, inputColor, samplers); builder->fsCodeAppend("\t}\n"); } @@ -1265,18 +1262,11 @@ void GLCircleOutside2PtConicalEffect::setData(const GrGLUniformManager& uman, } } -GrGLEffect::EffectKey GLCircleOutside2PtConicalEffect::GenKey(const GrDrawEffect& drawEffect, - const GrGLCaps&) { - enum { - kIsFlipped = 1 << kBaseKeyBitCnt, - }; - - EffectKey key = GenBaseGradientKey(drawEffect); - - if (drawEffect.castEffect<CircleOutside2PtConicalEffect>().isFlipped()) { - key |= kIsFlipped; - } - return key; +void GLCircleOutside2PtConicalEffect::GenKey(const GrDrawEffect& drawEffect, + const GrGLCaps&, GrEffectKeyBuilder* b) { + uint32_t* key = b->add32n(2); + key[0] = GenBaseGradientKey(drawEffect); + key[1] = drawEffect.castEffect<CircleOutside2PtConicalEffect>().isFlipped(); } ////////////////////////////////////////////////////////////////////////////// diff --git a/src/effects/gradients/SkTwoPointRadialGradient.cpp b/src/effects/gradients/SkTwoPointRadialGradient.cpp index a97cc0c38d..5015274413 100644 --- a/src/effects/gradients/SkTwoPointRadialGradient.cpp +++ b/src/effects/gradients/SkTwoPointRadialGradient.cpp @@ -398,14 +398,14 @@ public: virtual void emitCode(GrGLShaderBuilder*, const GrDrawEffect&, - EffectKey, + const GrEffectKey&, const char* outputColor, const char* inputColor, const TransformedCoordsArray&, const TextureSamplerArray&) SK_OVERRIDE; virtual void setData(const GrGLUniformManager&, const GrDrawEffect&) SK_OVERRIDE; - static EffectKey GenKey(const GrDrawEffect&, const GrGLCaps& caps); + static void GenKey(const GrDrawEffect&, const GrGLCaps& caps, GrEffectKeyBuilder* b); protected: @@ -554,13 +554,13 @@ GrGLRadial2Gradient::GrGLRadial2Gradient(const GrBackendEffectFactory& factory, void GrGLRadial2Gradient::emitCode(GrGLShaderBuilder* builder, const GrDrawEffect& drawEffect, - EffectKey key, + const GrEffectKey& key, const char* outputColor, const char* inputColor, const TransformedCoordsArray& coords, const TextureSamplerArray& samplers) { - - this->emitUniforms(builder, key); + uint32_t baseKey = key.get32(0); + this->emitUniforms(builder, baseKey); fParamUni = builder->addUniformArray(GrGLShaderBuilder::kFragment_Visibility, kFloat_GrSLType, "Radial2FSParams", 6); @@ -622,7 +622,7 @@ void GrGLRadial2Gradient::emitCode(GrGLShaderBuilder* builder, t.printf("-%s / %s", cName.c_str(), bVar.c_str()); } - this->emitColor(builder, t.c_str(), key, outputColor, inputColor, samplers); + this->emitColor(builder, t.c_str(), baseKey, outputColor, inputColor, samplers); } void GrGLRadial2Gradient::setData(const GrGLUniformManager& uman, @@ -659,17 +659,11 @@ void GrGLRadial2Gradient::setData(const GrGLUniformManager& uman, } } -GrGLEffect::EffectKey GrGLRadial2Gradient::GenKey(const GrDrawEffect& drawEffect, - const GrGLCaps&) { - enum { - kIsDegenerate = 1 << kBaseKeyBitCnt, - }; - - EffectKey key = GenBaseGradientKey(drawEffect); - if (drawEffect.castEffect<GrRadial2Gradient>().isDegenerate()) { - key |= kIsDegenerate; - } - return key; +void GrGLRadial2Gradient::GenKey(const GrDrawEffect& drawEffect, + const GrGLCaps&, GrEffectKeyBuilder* b) { + uint32_t* key = b->add32n(2); + key[0] = GenBaseGradientKey(drawEffect); + key[1] = drawEffect.castEffect<GrRadial2Gradient>().isDegenerate(); } ///////////////////////////////////////////////////////////////////// |