Cache the GrEffect used for text rendering in GrBitmapTextContext.

R=jvanverth@google.com

Author: bsalomon@google.com

Review URL: https://codereview.chromium.org/338093005
diff --git a/src/gpu/GrBitmapTextContext.cpp b/src/gpu/GrBitmapTextContext.cpp
index 4f6a1af..25c13ec 100755
--- a/src/gpu/GrBitmapTextContext.cpp
+++ b/src/gpu/GrBitmapTextContext.cpp
@@ -56,6 +56,7 @@
 
     fCurrTexture = NULL;
     fCurrVertex = 0;
+    fEffectTextureGenID = 0;
 
     fVertices = NULL;
     fMaxVertices = 0;
@@ -93,12 +94,17 @@
         SkASSERT(fCurrTexture);
         GrTextureParams params(SkShader::kRepeat_TileMode, GrTextureParams::kNone_FilterMode);
 
+        uint32_t textureGenID = fCurrTexture->getGenerationID();
+        
+        if (textureGenID != fEffectTextureGenID) {
+            fCachedEffect.reset(GrCustomCoordsTextureEffect::Create(fCurrTexture, params));
+            fEffectTextureGenID = textureGenID;
+        }
+
         // This effect could be stored with one of the cache objects (atlas?)
         int coordsIdx = drawState->hasColorVertexAttribute() ? kGlyphCoordsWithColorAttributeIndex :
                                                                kGlyphCoordsNoColorAttributeIndex;
-        drawState->addCoverageEffect(
-                                GrCustomCoordsTextureEffect::Create(fCurrTexture, params),
-                                coordsIdx)->unref();
+        drawState->addCoverageEffect(fCachedEffect.get(), coordsIdx);
         SkASSERT(NULL != fStrike);
         switch (fStrike->getMaskFormat()) {
             // Color bitmap text