Turn on quilt mode in DM.
  - Rename TileGrid -> Quilt to avoid the name overload.
  - Tag all failing GMs with kSkipTiled_Flag.

You may be wondering, do any GMs pass?  Yes, some do!  And that trends towards all of them as we increase --quiltTile.

Two GMs only fail in --quilt mode in 565.  Otherwise all GMs which fail are skipped, and those which don't fail aren't. (The 8888 variants of those two GMs are skipped even though they pass.)

BUG=skia:2477
R=reed@google.com, mtklein@google.com

Author: mtklein@chromium.org

Review URL: https://codereview.chromium.org/256373002

git-svn-id: http://skia.googlecode.com/svn/trunk@14457 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/dm/DMCpuGMTask.cpp b/dm/DMCpuGMTask.cpp
index 7ab1d44..e1ba81d 100644
--- a/dm/DMCpuGMTask.cpp
+++ b/dm/DMCpuGMTask.cpp
@@ -1,10 +1,10 @@
 #include "DMCpuGMTask.h"
 #include "DMExpectationsTask.h"
 #include "DMPipeTask.h"
+#include "DMQuiltTask.h"
 #include "DMRecordTask.h"
 #include "DMReplayTask.h"
 #include "DMSerializeTask.h"
-#include "DMTileGridTask.h"
 #include "DMUtil.h"
 #include "DMWriteTask.h"
 
@@ -39,11 +39,11 @@
     SPAWN(PipeTask, fGMFactory(NULL), bitmap, false, false);
     SPAWN(PipeTask, fGMFactory(NULL), bitmap, true, false);
     SPAWN(PipeTask, fGMFactory(NULL), bitmap, true, true);
+    SPAWN(QuiltTask, fGMFactory(NULL), bitmap);
     SPAWN(RecordTask, fGMFactory(NULL), bitmap);
     SPAWN(ReplayTask, fGMFactory(NULL), bitmap, false);
     SPAWN(ReplayTask, fGMFactory(NULL), bitmap, true);
     SPAWN(SerializeTask, fGMFactory(NULL), bitmap);
-    SPAWN(TileGridTask, fGMFactory(NULL), bitmap, SkISize::Make(16,16));
 
     SPAWN(WriteTask, bitmap);
 #undef SPAWN
diff --git a/dm/DMQuiltTask.cpp b/dm/DMQuiltTask.cpp
new file mode 100644
index 0000000..e8f8b60
--- /dev/null
+++ b/dm/DMQuiltTask.cpp
@@ -0,0 +1,68 @@
+#include "DMQuiltTask.h"
+#include "DMUtil.h"
+#include "DMWriteTask.h"
+
+#include "SkCommandLineFlags.h"
+#include "SkPicture.h"
+
+DEFINE_bool(quilt, true, "If true, draw into a quilt of small tiles and compare.");
+DEFINE_int32(quiltTile, 16, "Dimension of (square) quilt tile.");
+
+namespace DM {
+
+QuiltTask::QuiltTask(const Task& parent, skiagm::GM* gm, SkBitmap reference)
+    : CpuTask(parent)
+    , fName(UnderJoin(parent.name().c_str(), "quilt"))
+    , fGM(gm)
+    , fReference(reference)
+    {}
+
+static int tiles_needed(int fullDimension, int tileDimension) {
+    return (fullDimension + tileDimension - 1) / tileDimension;
+}
+
+void QuiltTask::draw() {
+    SkAutoTUnref<SkPicture> recorded(RecordPicture(fGM.get()));
+
+    SkBitmap full;
+    SetupBitmap(fReference.colorType(), fGM.get(), &full);
+    SkCanvas fullCanvas(full);
+
+    SkBitmap tile;
+    tile.allocPixels(SkImageInfo::Make(FLAGS_quiltTile, FLAGS_quiltTile,
+                                       fReference.colorType(), kPremul_SkAlphaType));
+    SkCanvas tileCanvas(tile);
+
+    for (int y = 0; y < tiles_needed(full.height(), tile.height()); y++) {
+        for (int x = 0; x < tiles_needed(full.width(), tile.width()); x++) {
+            SkAutoCanvasRestore ar(&tileCanvas, true/*also save now*/);
+
+            const SkScalar xOffset = SkIntToScalar(x * tile.width()),
+                           yOffset = SkIntToScalar(y * tile.height());
+            SkMatrix matrix = tileCanvas.getTotalMatrix();
+            matrix.postTranslate(-xOffset, -yOffset);
+            tileCanvas.setMatrix(matrix);
+
+            recorded->draw(&tileCanvas);
+            tileCanvas.flush();
+            fullCanvas.drawBitmap(tile, xOffset, yOffset, NULL);
+        }
+    }
+
+    if (!BitmapsEqual(full, fReference)) {
+        this->fail();
+        this->spawnChild(SkNEW_ARGS(WriteTask, (*this, full)));
+    }
+}
+
+bool QuiltTask::shouldSkip() const {
+    if (fGM->getFlags() & skiagm::GM::kSkipPicture_Flag) {
+        return true;
+    }
+    if (fGM->getFlags() & skiagm::GM::kSkipTiled_Flag) {
+        return true;
+    }
+    return !FLAGS_quilt;
+}
+
+}  // namespace DM
diff --git a/dm/DMQuiltTask.h b/dm/DMQuiltTask.h
new file mode 100644
index 0000000..56f322f
--- /dev/null
+++ b/dm/DMQuiltTask.h
@@ -0,0 +1,33 @@
+#ifndef DMQuiltTask_DEFINED
+#define DMQuiltTask_DEFINED
+
+#include "DMTask.h"
+#include "SkBitmap.h"
+#include "SkString.h"
+#include "SkTemplates.h"
+#include "gm.h"
+
+// Records a GM through an SkPicture, draws it in tiles, and compares against the reference bitmap.
+
+namespace DM {
+
+class QuiltTask : public CpuTask {
+
+public:
+    QuiltTask(const Task& parent,   // QuiltTask must be a child task.  Pass its parent here.
+                skiagm::GM*,          // GM to run through a picture.  Takes ownership.
+                SkBitmap reference);  // Bitmap to compare picture replay results to.
+
+    virtual void draw() SK_OVERRIDE;
+    virtual bool shouldSkip() const SK_OVERRIDE;
+    virtual SkString name() const SK_OVERRIDE { return fName; }
+
+private:
+    const SkString fName;
+    SkAutoTDelete<skiagm::GM> fGM;
+    const SkBitmap fReference;
+};
+
+}  // namespace DM
+
+#endif  // DMReplayTask_DEFINED
diff --git a/dm/DMTileGridTask.cpp b/dm/DMTileGridTask.cpp
deleted file mode 100644
index 4299bd7..0000000
--- a/dm/DMTileGridTask.cpp
+++ /dev/null
@@ -1,81 +0,0 @@
-#include "DMTileGridTask.h"
-#include "DMWriteTask.h"
-#include "DMUtil.h"
-
-#include "SkBBHFactory.h"
-#include "SkCommandLineFlags.h"
-#include "SkPicture.h"
-
-// TODO(mtklein): Tile grid tests are currently failing.  (Skia issue 1198).  When fixed, -> true.
-DEFINE_bool(tileGrid, false, "If true, run picture replay tests with a tile grid.");
-
-namespace DM {
-
-TileGridTask::TileGridTask(const Task& parent, skiagm::GM* gm, SkBitmap reference, SkISize tileSize)
-    : CpuTask(parent)
-    , fName(UnderJoin(parent.name().c_str(), "tilegrid"))
-    , fGM(gm)
-    , fReference(reference)
-    , fTileSize(tileSize)
-    {}
-
-static int tiles_needed(int fullDimension, int tileDimension) {
-    return (fullDimension + tileDimension - 1) / tileDimension;
-}
-
-void TileGridTask::draw() {
-    const SkTileGridFactory::TileGridInfo info = {
-        fTileSize,
-        SkISize::Make(0,0),    // Overlap between adjacent tiles.
-        SkIPoint::Make(0,0),   // Offset.
-    };
-    SkTileGridFactory factory(info);
-    SkAutoTUnref<SkPicture> recorded(RecordPicture(fGM.get(),
-                                                   SkPicture::kUsePathBoundsForClip_RecordingFlag,
-                                                   &factory));
-
-    SkBitmap full;
-    SetupBitmap(fReference.colorType(), fGM.get(), &full);
-    SkCanvas fullCanvas(full);
-
-    SkBitmap tile;
-    tile.allocPixels(SkImageInfo::Make(fTileSize.width(), fTileSize.height(),
-                                       fReference.colorType(), kPremul_SkAlphaType));
-    SkCanvas tileCanvas(tile);
-
-    SkPaint paint;
-    paint.setXfermodeMode(SkXfermode::kSrc_Mode);
-
-    for (int y = 0; y < tiles_needed(full.height(), tile.height()); y++) {
-        for (int x = 0; x < tiles_needed(full.width(), tile.width()); x++) {
-            SkAutoCanvasRestore ar(&tileCanvas, true/*also save now*/);
-
-            const SkScalar xOffset = SkIntToScalar(x * tile.width()),
-                           yOffset = SkIntToScalar(y * tile.height());
-            SkMatrix matrix = tileCanvas.getTotalMatrix();
-            matrix.postTranslate(-xOffset, -yOffset);
-            tileCanvas.setMatrix(matrix);
-
-            recorded->draw(&tileCanvas);
-            tileCanvas.flush();
-            fullCanvas.drawBitmap(tile, xOffset, yOffset, &paint);
-        }
-    }
-
-    if (!BitmapsEqual(full, fReference)) {
-        this->fail();
-        this->spawnChild(SkNEW_ARGS(WriteTask, (*this, full)));
-    }
-}
-
-bool TileGridTask::shouldSkip() const {
-    if (fGM->getFlags() & skiagm::GM::kSkipPicture_Flag) {
-        return true;
-    }
-    if (fGM->getFlags() & skiagm::GM::kSkipTiled_Flag) {
-        return true;
-    }
-    return !FLAGS_tileGrid;
-}
-
-}  // namespace DM
diff --git a/dm/DMTileGridTask.h b/dm/DMTileGridTask.h
deleted file mode 100644
index 911a1c5..0000000
--- a/dm/DMTileGridTask.h
+++ /dev/null
@@ -1,35 +0,0 @@
-#ifndef DMTileGridTask_DEFINED
-#define DMTileGridTask_DEFINED
-
-#include "DMTask.h"
-#include "SkBitmap.h"
-#include "SkString.h"
-#include "SkTemplates.h"
-#include "gm.h"
-
-// Records a GM through an SkPicture, draws it in tiles, and compares against the reference bitmap.
-
-namespace DM {
-
-class TileGridTask : public CpuTask {
-
-public:
-    TileGridTask(const Task& parent,  // TileGridTask must be a child task.  Pass its parent here.
-                 skiagm::GM*,         // GM to run through a picture.  Takes ownership.
-                 SkBitmap reference,  // Bitmap to compare picture replay results to.
-                 SkISize tileSize);   // Tile size to use.
-
-    virtual void draw() SK_OVERRIDE;
-    virtual bool shouldSkip() const SK_OVERRIDE;
-    virtual SkString name() const SK_OVERRIDE { return fName; }
-
-private:
-    const SkString fName;
-    SkAutoTDelete<skiagm::GM> fGM;
-    const SkBitmap fReference;
-    const SkISize fTileSize;
-};
-
-}  // namespace DM
-
-#endif  // DMReplayTask_DEFINED
diff --git a/gm/aarectmodes.cpp b/gm/aarectmodes.cpp
index f12ff8c..ee0bace 100644
--- a/gm/aarectmodes.cpp
+++ b/gm/aarectmodes.cpp
@@ -133,6 +133,9 @@
         }
 
     protected:
+        virtual uint32_t onGetFlags() const SK_OVERRIDE {
+            return kSkipTiled_Flag;
+        }
 
         virtual SkString onShortName() {
             return SkString("aarectmodes");
diff --git a/gm/alphagradients.cpp b/gm/alphagradients.cpp
index 0db51e8..e63fbc9 100644
--- a/gm/alphagradients.cpp
+++ b/gm/alphagradients.cpp
@@ -73,7 +73,7 @@
         }
     }
 
-    virtual uint32_t onGetFlags() const { return kSkipPipe_Flag; }
+    virtual uint32_t onGetFlags() const { return kSkipPipe_Flag | kSkipTiled_Flag; }
 
 private:
     typedef skiagm::GM INHERITED;
diff --git a/gm/arcofzorro.cpp b/gm/arcofzorro.cpp
index f5a6c21..d78c76c 100644
--- a/gm/arcofzorro.cpp
+++ b/gm/arcofzorro.cpp
@@ -20,6 +20,10 @@
     }
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     virtual SkString onShortName() SK_OVERRIDE {
         return SkString("arcofzorro");
     }
diff --git a/gm/bicubicfilter.cpp b/gm/bicubicfilter.cpp
index 825175e..ebaed51 100644
--- a/gm/bicubicfilter.cpp
+++ b/gm/bicubicfilter.cpp
@@ -18,6 +18,10 @@
     }
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     virtual SkString onShortName() {
         return SkString("bicubicfilter");
     }
diff --git a/gm/bigmatrix.cpp b/gm/bigmatrix.cpp
index 30de865..288e827 100644
--- a/gm/bigmatrix.cpp
+++ b/gm/bigmatrix.cpp
@@ -19,6 +19,10 @@
     }
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     virtual SkString onShortName() {
         return SkString("bigmatrix");
     }
diff --git a/gm/bigtext.cpp b/gm/bigtext.cpp
index e487625..9c2682c 100644
--- a/gm/bigtext.cpp
+++ b/gm/bigtext.cpp
@@ -19,6 +19,10 @@
     BigTextGM() {}
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     virtual SkString onShortName() SK_OVERRIDE {
         return SkString("bigtext");
     }
diff --git a/gm/bitmapmatrix.cpp b/gm/bitmapmatrix.cpp
index e0b9199..b5b8e59 100644
--- a/gm/bitmapmatrix.cpp
+++ b/gm/bitmapmatrix.cpp
@@ -24,6 +24,10 @@
     DrawBitmapMatrixGM() {}
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     virtual SkString onShortName() SK_OVERRIDE {
         return SkString("drawbitmapmatrix");
     }
diff --git a/gm/bitmaprecttest.cpp b/gm/bitmaprecttest.cpp
index 6f0ab58..06495b9 100644
--- a/gm/bitmaprecttest.cpp
+++ b/gm/bitmaprecttest.cpp
@@ -56,6 +56,10 @@
     }
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     virtual SkString onShortName() {
         return SkString("bitmaprecttest");
     }
diff --git a/gm/bitmapscroll.cpp b/gm/bitmapscroll.cpp
index d2b8ca0..ee5efc0 100644
--- a/gm/bitmapscroll.cpp
+++ b/gm/bitmapscroll.cpp
@@ -59,6 +59,10 @@
     }
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     virtual SkString onShortName() {
         return SkString("bitmapscroll");
     }
diff --git a/gm/bitmapshader.cpp b/gm/bitmapshader.cpp
index 8085f5c..5cf5e14 100644
--- a/gm/bitmapshader.cpp
+++ b/gm/bitmapshader.cpp
@@ -50,6 +50,10 @@
     }
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     virtual SkString onShortName() {
         return SkString("bitmapshaders");
     }
diff --git a/gm/bleed.cpp b/gm/bleed.cpp
index 426129b..99dba70 100644
--- a/gm/bleed.cpp
+++ b/gm/bleed.cpp
@@ -85,6 +85,10 @@
     BleedGM() {}
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     virtual SkString onShortName() SK_OVERRIDE {
         return SkString("bleed");
     }
diff --git a/gm/blurrect.cpp b/gm/blurrect.cpp
index bc5dbc8..835d6ae 100644
--- a/gm/blurrect.cpp
+++ b/gm/blurrect.cpp
@@ -115,7 +115,7 @@
         }
     }
 
-    virtual uint32_t onGetFlags() const { return kSkipPipe_Flag; }
+    virtual uint32_t onGetFlags() const { return kSkipPipe_Flag | kSkipTiled_Flag; }
 
 private:
     void drawProcs(SkCanvas* canvas, const SkRect& r, const SkPaint& paint,
diff --git a/gm/blurroundrect.cpp b/gm/blurroundrect.cpp
index 6221480..52938c0 100644
--- a/gm/blurroundrect.cpp
+++ b/gm/blurroundrect.cpp
@@ -43,6 +43,10 @@
         fRRect.setRectRadii(r, radii);
     }
 
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     virtual SkString onShortName() SK_OVERRIDE {
         return fName;
     }
@@ -101,6 +105,10 @@
     }
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     virtual SkString onShortName() SK_OVERRIDE {
         return fName;
     }
diff --git a/gm/blurs.cpp b/gm/blurs.cpp
index 822d488..bc73d95 100644
--- a/gm/blurs.cpp
+++ b/gm/blurs.cpp
@@ -18,6 +18,10 @@
     }
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     virtual SkString onShortName() {
         return SkString("blurs");
     }
diff --git a/gm/circles.cpp b/gm/circles.cpp
index 36cd8b0..e69a96d 100644
--- a/gm/circles.cpp
+++ b/gm/circles.cpp
@@ -25,6 +25,10 @@
     }
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     virtual SkString onShortName() SK_OVERRIDE {
         return SkString("circles");
     }
diff --git a/gm/circularclips.cpp b/gm/circularclips.cpp
index fdf2dfb..07b59f0 100644
--- a/gm/circularclips.cpp
+++ b/gm/circularclips.cpp
@@ -16,6 +16,10 @@
     CircularClipsGM() {}
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     virtual SkString onShortName() {
         return SkString("circular-clips");
     }
diff --git a/gm/coloremoji.cpp b/gm/coloremoji.cpp
index 8497521..a935c97 100644
--- a/gm/coloremoji.cpp
+++ b/gm/coloremoji.cpp
@@ -22,6 +22,10 @@
         SkSafeUnref(fTypeface);
     }
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     virtual void onOnceBeforeDraw() SK_OVERRIDE {
 
         SkString filename(INHERITED::gResourcePath);
diff --git a/gm/colorfilters.cpp b/gm/colorfilters.cpp
index 45e975e..5af2122 100644
--- a/gm/colorfilters.cpp
+++ b/gm/colorfilters.cpp
@@ -49,6 +49,10 @@
         return SkISize::Make(640, 480);
     }
 
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
         SkPaint paint;
         SkRect r;
diff --git a/gm/complexclip.cpp b/gm/complexclip.cpp
index 8ff1dfa..987b201 100644
--- a/gm/complexclip.cpp
+++ b/gm/complexclip.cpp
@@ -29,6 +29,10 @@
     }
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
 
     SkString onShortName() {
         SkString str;
diff --git a/gm/complexclip2.cpp b/gm/complexclip2.cpp
index 2b94ffd..4c69cad 100644
--- a/gm/complexclip2.cpp
+++ b/gm/complexclip2.cpp
@@ -111,6 +111,13 @@
         return "";
     }
 
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        if (kRect_Clip != fClip) {
+            return kSkipTiled_Flag;
+        }
+        return 0;
+    }
+
     virtual SkString onShortName() {
         if (kRect_Clip == fClip && !fAntiAlias) {
             return SkString("complexclip2");
diff --git a/gm/composeshader.cpp b/gm/composeshader.cpp
index 4f2c762..b40e226 100644
--- a/gm/composeshader.cpp
+++ b/gm/composeshader.cpp
@@ -51,6 +51,10 @@
     }
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     virtual SkString onShortName() SK_OVERRIDE {
         return SkString("composeshader");
     }
diff --git a/gm/convexpaths.cpp b/gm/convexpaths.cpp
index 91afbfe..9acabe1 100644
--- a/gm/convexpaths.cpp
+++ b/gm/convexpaths.cpp
@@ -34,6 +34,10 @@
     }
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     virtual SkString onShortName() {
         return SkString("convexpaths");
     }
diff --git a/gm/convexpolyclip.cpp b/gm/convexpolyclip.cpp
index ed67434..b76335c 100644
--- a/gm/convexpolyclip.cpp
+++ b/gm/convexpolyclip.cpp
@@ -213,7 +213,7 @@
     }
 
     virtual uint32_t onGetFlags() const {
-        return kAsBench_Flag;
+        return kAsBench_Flag | kSkipTiled_Flag;
     }
 
 private:
diff --git a/gm/cubicpaths.cpp b/gm/cubicpaths.cpp
index f95f700..3941701 100644
--- a/gm/cubicpaths.cpp
+++ b/gm/cubicpaths.cpp
@@ -16,6 +16,10 @@
     ClippedCubicGM() {}
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     SkString onShortName() {
         return SkString("clippedcubic");
     }
@@ -55,6 +59,10 @@
     CubicPathGM() {}
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     SkString onShortName() {
         return SkString("cubicpath");
     }
@@ -198,6 +206,10 @@
     CubicClosePathGM() {}
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     SkString onShortName() {
         return SkString("cubicclosepath");
     }
diff --git a/gm/dashcubics.cpp b/gm/dashcubics.cpp
index f99c0c3..1e23f15 100644
--- a/gm/dashcubics.cpp
+++ b/gm/dashcubics.cpp
@@ -20,6 +20,10 @@
     DashCubicsGM() {}
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     virtual SkString onShortName() {
         return SkString("dashcubics");
     }
diff --git a/gm/dashing.cpp b/gm/dashing.cpp
index 595de52..2f5be08 100644
--- a/gm/dashing.cpp
+++ b/gm/dashing.cpp
@@ -37,6 +37,10 @@
     DashingGM() {}
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     SkString onShortName() {
         return SkString("dashing");
     }
@@ -119,6 +123,10 @@
     Dashing2GM() {}
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     SkString onShortName() {
         return SkString("dashing2");
     }
@@ -177,6 +185,10 @@
     Dashing3GM() {}
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     SkString onShortName() {
         return SkString("dashing3");
     }
diff --git a/gm/degeneratesegments.cpp b/gm/degeneratesegments.cpp
index 3f99c68..022f1b1 100644
--- a/gm/degeneratesegments.cpp
+++ b/gm/degeneratesegments.cpp
@@ -22,6 +22,10 @@
         const char* fName2;
     };
 
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     SkString onShortName() {
         return SkString("degeneratesegments");
     }
diff --git a/gm/downsamplebitmap.cpp b/gm/downsamplebitmap.cpp
index 4b97804..00b1a4b 100644
--- a/gm/downsamplebitmap.cpp
+++ b/gm/downsamplebitmap.cpp
@@ -40,6 +40,13 @@
     }
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        if (SkPaint::kHigh_FilterLevel != fFilterLevel) {
+            return kSkipTiled_Flag;
+        }
+        return 0;
+    }
+
     virtual SkString onShortName() SK_OVERRIDE {
         return fName;
     }
diff --git a/gm/drawlooper.cpp b/gm/drawlooper.cpp
index 67e280e..a04955b 100644
--- a/gm/drawlooper.cpp
+++ b/gm/drawlooper.cpp
@@ -27,6 +27,10 @@
     }
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     virtual SkISize onISize() {
         return SkISize::Make(520, 160);
     }
diff --git a/gm/dropshadowimagefilter.cpp b/gm/dropshadowimagefilter.cpp
index 9376841..ec849b2 100644
--- a/gm/dropshadowimagefilter.cpp
+++ b/gm/dropshadowimagefilter.cpp
@@ -115,7 +115,7 @@
         // from scaled replay tests because drawSprite ignores the
         // reciprocal scale that is applied at record time, which is
         // the intended behavior of drawSprite.
-        return kSkipScaledReplay_Flag;
+        return kSkipScaledReplay_Flag | kSkipTiled_Flag;
     }
 
     virtual void onDraw(SkCanvas* canvas) {
diff --git a/gm/drrect.cpp b/gm/drrect.cpp
index 74c6f1d..d7cd894 100644
--- a/gm/drrect.cpp
+++ b/gm/drrect.cpp
@@ -15,6 +15,10 @@
     DRRectGM() {}
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     virtual SkString onShortName() SK_OVERRIDE {
         return SkString("drrect");
     }
diff --git a/gm/fatpathfill.cpp b/gm/fatpathfill.cpp
index 8b89232..ba6fffe 100644
--- a/gm/fatpathfill.cpp
+++ b/gm/fatpathfill.cpp
@@ -56,6 +56,10 @@
     FatPathFillGM() {}
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     virtual SkString onShortName() {
         return SkString("fatpathfill");
     }
diff --git a/gm/filltypes.cpp b/gm/filltypes.cpp
index 7df02ae..bc9de53 100644
--- a/gm/filltypes.cpp
+++ b/gm/filltypes.cpp
@@ -25,6 +25,10 @@
     }
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     virtual SkString onShortName() {
         return SkString("filltypes");
     }
diff --git a/gm/filltypespersp.cpp b/gm/filltypespersp.cpp
index cbd966c..9d0827c 100644
--- a/gm/filltypespersp.cpp
+++ b/gm/filltypespersp.cpp
@@ -24,6 +24,10 @@
     }
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     virtual SkString onShortName() {
         return SkString("filltypespersp");
     }
diff --git a/gm/filterbitmap.cpp b/gm/filterbitmap.cpp
index c580591..c650902 100644
--- a/gm/filterbitmap.cpp
+++ b/gm/filterbitmap.cpp
@@ -71,6 +71,10 @@
     }
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     virtual SkString onShortName() SK_OVERRIDE {
         return fName;
     }
diff --git a/gm/fontscaler.cpp b/gm/fontscaler.cpp
index 33f6779..a887102 100644
--- a/gm/fontscaler.cpp
+++ b/gm/fontscaler.cpp
@@ -19,6 +19,10 @@
     }
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     virtual SkString onShortName() {
         return SkString("fontscaler");
     }
diff --git a/gm/getpostextpath.cpp b/gm/getpostextpath.cpp
index 68faf95..0cb5bb3 100644
--- a/gm/getpostextpath.cpp
+++ b/gm/getpostextpath.cpp
@@ -16,6 +16,10 @@
     GetPosTextPathGM() {}
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     SkString onShortName() {
         return SkString("getpostextpath");
     }
diff --git a/gm/giantbitmap.cpp b/gm/giantbitmap.cpp
index ed4190a..1a78fcf 100644
--- a/gm/giantbitmap.cpp
+++ b/gm/giantbitmap.cpp
@@ -71,6 +71,13 @@
     }
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        if (fDoFilter && fDoRotate && fMode != SkShader::kClamp_TileMode) {
+            return kSkipTiled_Flag;
+        }
+        return 0;
+    }
+
     virtual SkString onShortName() {
         SkString str("giantbitmap_");
         switch (fMode) {
diff --git a/gm/gradientDirtyLaundry.cpp b/gm/gradientDirtyLaundry.cpp
index ff6864a..f7797e7 100644
--- a/gm/gradientDirtyLaundry.cpp
+++ b/gm/gradientDirtyLaundry.cpp
@@ -75,6 +75,10 @@
     }
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     SkString onShortName() SK_OVERRIDE { return SkString("gradient_dirty_laundry"); }
     virtual SkISize onISize() SK_OVERRIDE { return make_isize(640, 615); }
 
diff --git a/gm/gradient_matrix.cpp b/gm/gradient_matrix.cpp
index b2bc5d1..4f2915a 100644
--- a/gm/gradient_matrix.cpp
+++ b/gm/gradient_matrix.cpp
@@ -120,6 +120,10 @@
     }
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     SkString onShortName() SK_OVERRIDE {
         return SkString("gradient_matrix");
     }
diff --git a/gm/gradients.cpp b/gm/gradients.cpp
index 5f84d9f..f5abb07 100644
--- a/gm/gradients.cpp
+++ b/gm/gradients.cpp
@@ -112,6 +112,10 @@
     }
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     SkString onShortName() {
         return SkString("gradients");
     }
@@ -165,6 +169,10 @@
     }
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     SkString onShortName() {
         return SkString("gradients_local_perspective");
     }
@@ -294,6 +302,10 @@
     ClampedGradientsGM() {}
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     SkString onShortName() { return SkString("clamped_gradients"); }
 
     virtual SkISize onISize() { return SkISize::Make(640, 510); }
@@ -333,6 +345,10 @@
     RadialGradientGM() {}
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     SkString onShortName() { return SkString("radial_gradient"); }
     virtual SkISize onISize() { return SkISize::Make(1280, 1280); }
     void drawBG(SkCanvas* canvas) {
@@ -372,6 +388,10 @@
     RadialGradient2GM() {}
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     SkString onShortName() { return SkString("radial_gradient2"); }
     virtual SkISize onISize() { return SkISize::Make(800, 400); }
     void drawBG(SkCanvas* canvas) {
diff --git a/gm/gradients_2pt_conical.cpp b/gm/gradients_2pt_conical.cpp
index 7f0467e..dece66e 100644
--- a/gm/gradients_2pt_conical.cpp
+++ b/gm/gradients_2pt_conical.cpp
@@ -339,6 +339,13 @@
     }
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        if (fGradCaseType != kInside_GradCaseType) {
+            return kSkipTiled_Flag;
+        }
+        return 0;
+    }
+
     SkString onShortName() {
         return fName;
     }
diff --git a/gm/gradients_no_texture.cpp b/gm/gradients_no_texture.cpp
index 8086eab..2e75c9e 100644
--- a/gm/gradients_no_texture.cpp
+++ b/gm/gradients_no_texture.cpp
@@ -92,6 +92,10 @@
     }
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     SkString onShortName() SK_OVERRIDE { return SkString("gradients_no_texture"); }
     virtual SkISize onISize() SK_OVERRIDE { return make_isize(640, 615); }
 
@@ -214,6 +218,10 @@
     GradientsManyColorsGM() {}
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     SkString onShortName() SK_OVERRIDE { return SkString("gradients_many"); }
     virtual SkISize onISize() SK_OVERRIDE { return SkISize::Make(850, 100); }
 
diff --git a/gm/gradtext.cpp b/gm/gradtext.cpp
index d782338..42513b7 100644
--- a/gm/gradtext.cpp
+++ b/gm/gradtext.cpp
@@ -100,6 +100,10 @@
     GradTextGM () {}
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
 
     virtual SkString onShortName() {
         return SkString("gradtext");
diff --git a/gm/hairlines.cpp b/gm/hairlines.cpp
index fb99d23..5a512d2 100644
--- a/gm/hairlines.cpp
+++ b/gm/hairlines.cpp
@@ -13,6 +13,10 @@
 
 class HairlinesGM : public GM {
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
 
     virtual SkString onShortName() SK_OVERRIDE {
         return SkString("hairlines");
diff --git a/gm/hairmodes.cpp b/gm/hairmodes.cpp
index 783c225..f1fa260 100644
--- a/gm/hairmodes.cpp
+++ b/gm/hairmodes.cpp
@@ -78,7 +78,6 @@
         SkPaint fBGPaint;
 
     protected:
-
         virtual SkString onShortName() SK_OVERRIDE {
             return SkString("hairmodes");
         }
@@ -123,7 +122,7 @@
         }
 
         // disable pdf for now, since it crashes on mac
-        virtual uint32_t onGetFlags() const { return kSkipPDF_Flag; }
+        virtual uint32_t onGetFlags() const { return kSkipPDF_Flag | kSkipTiled_Flag; }
 
     private:
         typedef GM INHERITED;
diff --git a/gm/hittestpath.cpp b/gm/hittestpath.cpp
index 6ffc1f9..d971db9 100644
--- a/gm/hittestpath.cpp
+++ b/gm/hittestpath.cpp
@@ -34,6 +34,10 @@
     HitTestPathGM () {}
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     virtual SkString onShortName() {
         return SkString("hittestpath");
     }
diff --git a/gm/imageblur.cpp b/gm/imageblur.cpp
index ff8a481..0b1ab30 100644
--- a/gm/imageblur.cpp
+++ b/gm/imageblur.cpp
@@ -23,6 +23,10 @@
     }
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     virtual SkString onShortName() {
         return fName;
     }
diff --git a/gm/imagefiltersbase.cpp b/gm/imagefiltersbase.cpp
index 2970ff2..4779c81 100644
--- a/gm/imagefiltersbase.cpp
+++ b/gm/imagefiltersbase.cpp
@@ -161,7 +161,6 @@
     ImageFiltersBaseGM () {}
 
 protected:
-
     virtual SkString onShortName() {
         return SkString("imagefiltersbase");
     }
@@ -180,7 +179,7 @@
         // from scaled replay tests because drawSprite ignores the
         // reciprocal scale that is applied at record time, which is
         // the intended behavior of drawSprite.
-        return kSkipScaledReplay_Flag;
+        return kSkipScaledReplay_Flag | kSkipTiled_Flag;
     }
 
     virtual void onDraw(SkCanvas* canvas) {
diff --git a/gm/imagefiltersclipped.cpp b/gm/imagefiltersclipped.cpp
index 4187ba0..7851f2e 100644
--- a/gm/imagefiltersclipped.cpp
+++ b/gm/imagefiltersclipped.cpp
@@ -31,6 +31,10 @@
     }
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     virtual SkString onShortName() {
         return SkString("imagefiltersclipped");
     }
diff --git a/gm/imagefilterscropped.cpp b/gm/imagefilterscropped.cpp
index fa834d5..a128c6b 100644
--- a/gm/imagefilterscropped.cpp
+++ b/gm/imagefilterscropped.cpp
@@ -102,7 +102,6 @@
     ImageFiltersCroppedGM () {}
 
 protected:
-
     virtual SkString onShortName() {
         return SkString("imagefilterscropped");
     }
@@ -121,7 +120,7 @@
         // from scaled replay tests because drawSprite ignores the
         // reciprocal scale that is applied at record time, which is
         // the intended behavior of drawSprite.
-        return kSkipScaledReplay_Flag;
+        return kSkipScaledReplay_Flag | kSkipTiled_Flag;
     }
 
     virtual void onDraw(SkCanvas* canvas) {
diff --git a/gm/imagefiltersgraph.cpp b/gm/imagefiltersgraph.cpp
index 8390379..d19dd85 100644
--- a/gm/imagefiltersgraph.cpp
+++ b/gm/imagefiltersgraph.cpp
@@ -90,6 +90,10 @@
     }
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     virtual SkString onShortName() {
         return SkString("imagefiltersgraph");
     }
diff --git a/gm/imagefiltersscaled.cpp b/gm/imagefiltersscaled.cpp
index 0e7af56..c4a65b3 100644
--- a/gm/imagefiltersscaled.cpp
+++ b/gm/imagefiltersscaled.cpp
@@ -31,6 +31,10 @@
     }
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     virtual SkString onShortName() {
         return SkString("imagefiltersscaled");
     }
diff --git a/gm/imageresizetiled.cpp b/gm/imageresizetiled.cpp
index 0e6bd6d..afa18ba 100644
--- a/gm/imageresizetiled.cpp
+++ b/gm/imageresizetiled.cpp
@@ -30,10 +30,6 @@
         return make_isize(WIDTH, HEIGHT);
     }
 
-    virtual uint32_t onGetFlags() const SK_OVERRIDE {
-        return kSkipTiled_Flag;
-    }
-
     virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
         SkPaint paint;
         SkMatrix matrix;
diff --git a/gm/inversepaths.cpp b/gm/inversepaths.cpp
index dc2b636..e5b1626 100644
--- a/gm/inversepaths.cpp
+++ b/gm/inversepaths.cpp
@@ -70,6 +70,10 @@
     }
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     virtual SkString onShortName() {
         return SkString("inverse_paths");
     }
diff --git a/gm/lerpmode.cpp b/gm/lerpmode.cpp
index 30e6abd..89301ea 100644
--- a/gm/lerpmode.cpp
+++ b/gm/lerpmode.cpp
@@ -39,6 +39,10 @@
     LerpXfermodeGM() {}
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     virtual SkString onShortName() SK_OVERRIDE {
         return SkString("lerpmode");
     }
diff --git a/gm/lighting.cpp b/gm/lighting.cpp
index 858976b..50698fa 100644
--- a/gm/lighting.cpp
+++ b/gm/lighting.cpp
@@ -20,6 +20,10 @@
     }
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     virtual SkString onShortName() {
         return SkString("lighting");
     }
diff --git a/gm/linepaths.cpp b/gm/linepaths.cpp
index 69c47fe..3b0ae75 100644
--- a/gm/linepaths.cpp
+++ b/gm/linepaths.cpp
@@ -16,6 +16,10 @@
     LinePathGM() {}
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     SkString onShortName() {
         return SkString("linepath");
     }
diff --git a/gm/lumafilter.cpp b/gm/lumafilter.cpp
index c12bae0..4414093 100644
--- a/gm/lumafilter.cpp
+++ b/gm/lumafilter.cpp
@@ -97,6 +97,10 @@
     }
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     virtual SkString onShortName() SK_OVERRIDE {
         return SkString("lumafilter");
     }
diff --git a/gm/matrixconvolution.cpp b/gm/matrixconvolution.cpp
index c37f7ad..c081bf5 100644
--- a/gm/matrixconvolution.cpp
+++ b/gm/matrixconvolution.cpp
@@ -19,6 +19,10 @@
     }
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     virtual SkString onShortName() {
         return SkString("matrixconvolution");
     }
diff --git a/gm/mixedxfermodes.cpp b/gm/mixedxfermodes.cpp
index f2d7fa3..43f8e89 100644
--- a/gm/mixedxfermodes.cpp
+++ b/gm/mixedxfermodes.cpp
@@ -124,7 +124,7 @@
 
     virtual uint32_t onGetFlags() const {
         // Skip PDF rasterization since rendering this PDF takes forever.
-        return kSkipPDFRasterization_Flag;
+        return kSkipPDFRasterization_Flag | kSkipTiled_Flag;
     }
 
 private:
diff --git a/gm/nested.cpp b/gm/nested.cpp
index b3d75cf..e72e5c4 100644
--- a/gm/nested.cpp
+++ b/gm/nested.cpp
@@ -19,6 +19,10 @@
     }
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     virtual SkString onShortName() SK_OVERRIDE {
         SkString name("nested");
         if (fDoAA) {
diff --git a/gm/ninepatchstretch.cpp b/gm/ninepatchstretch.cpp
index 74cc87f..8806acc 100644
--- a/gm/ninepatchstretch.cpp
+++ b/gm/ninepatchstretch.cpp
@@ -44,6 +44,10 @@
     NinePatchStretchGM() {}
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     virtual SkString onShortName() {
         return SkString("ninepatch-stretch");
     }
diff --git a/gm/nonclosedpaths.cpp b/gm/nonclosedpaths.cpp
index 98ccb1c..9c50966 100644
--- a/gm/nonclosedpaths.cpp
+++ b/gm/nonclosedpaths.cpp
@@ -32,6 +32,10 @@
     };
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     virtual SkString onShortName() SK_OVERRIDE {
         return SkString("nonclosedpaths");
     }
diff --git a/gm/ovals.cpp b/gm/ovals.cpp
index 53ccb16..9f007ac 100755
--- a/gm/ovals.cpp
+++ b/gm/ovals.cpp
@@ -26,6 +26,10 @@
     }
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     virtual SkString onShortName() SK_OVERRIDE {
         return SkString("ovals");
     }
diff --git a/gm/patheffects.cpp b/gm/patheffects.cpp
index 4c5cd45..35bb84a 100644
--- a/gm/patheffects.cpp
+++ b/gm/patheffects.cpp
@@ -107,6 +107,10 @@
     PathEffectGM() {}
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     SkString onShortName() {
         return SkString("patheffect");
     }
diff --git a/gm/pathfill.cpp b/gm/pathfill.cpp
index 993917a..01811e3 100644
--- a/gm/pathfill.cpp
+++ b/gm/pathfill.cpp
@@ -125,6 +125,10 @@
     }
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     virtual SkString onShortName() {
         return SkString("pathfill");
     }
@@ -159,6 +163,10 @@
     }
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     virtual SkString onShortName() {
         return SkString("pathinvfill");
     }
diff --git a/gm/pathinterior.cpp b/gm/pathinterior.cpp
index 559fb89..e587928 100644
--- a/gm/pathinterior.cpp
+++ b/gm/pathinterior.cpp
@@ -25,6 +25,10 @@
     }
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     virtual SkISize onISize() {
         return SkISize::Make(770, 770);
     }
diff --git a/gm/pathopsinverse.cpp b/gm/pathopsinverse.cpp
index c1ffd94..ec4d4d3 100644
--- a/gm/pathopsinverse.cpp
+++ b/gm/pathopsinverse.cpp
@@ -50,6 +50,10 @@
         paint->setColor(color);
     }
 
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;  // Only for 565.  8888 is fine.
+    }
+
     virtual SkString onShortName() SK_OVERRIDE {
         return SkString("pathopsinverse");
     }
diff --git a/gm/pathopsskpclip.cpp b/gm/pathopsskpclip.cpp
index 8346745..e04692b 100644
--- a/gm/pathopsskpclip.cpp
+++ b/gm/pathopsskpclip.cpp
@@ -24,6 +24,10 @@
     }
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     virtual SkString onShortName() SK_OVERRIDE {
         return SkString("pathopsskpclip");
     }
diff --git a/gm/pathreverse.cpp b/gm/pathreverse.cpp
index b605a4c..51c0d52 100644
--- a/gm/pathreverse.cpp
+++ b/gm/pathreverse.cpp
@@ -69,6 +69,10 @@
     }
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     virtual SkString onShortName() {
         return SkString("path-reverse");
     }
diff --git a/gm/pictureshader.cpp b/gm/pictureshader.cpp
index 195ee73..44db338 100644
--- a/gm/pictureshader.cpp
+++ b/gm/pictureshader.cpp
@@ -58,6 +58,10 @@
     }
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     virtual SkString onShortName() SK_OVERRIDE {
         return SkString("pictureshader");
     }
diff --git a/gm/points.cpp b/gm/points.cpp
index 4902c88..f4df741 100644
--- a/gm/points.cpp
+++ b/gm/points.cpp
@@ -15,6 +15,10 @@
     PointsGM() {}
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     virtual SkString onShortName() {
         return SkString("points");
     }
diff --git a/gm/poly2poly.cpp b/gm/poly2poly.cpp
index c36ac85..9e58d9d 100644
--- a/gm/poly2poly.cpp
+++ b/gm/poly2poly.cpp
@@ -178,6 +178,10 @@
     Poly2PolyGM() {}
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     virtual SkString onShortName() SK_OVERRIDE {
         return SkString("poly2poly");
     }
diff --git a/gm/polygons.cpp b/gm/polygons.cpp
index 4360355..56b2e97 100644
--- a/gm/polygons.cpp
+++ b/gm/polygons.cpp
@@ -22,6 +22,10 @@
     PolygonsGM() {}
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     virtual SkString onShortName() SK_OVERRIDE {
         return SkString("polygons");
     }
diff --git a/gm/quadpaths.cpp b/gm/quadpaths.cpp
index 7351e45..decf50a 100644
--- a/gm/quadpaths.cpp
+++ b/gm/quadpaths.cpp
@@ -16,6 +16,10 @@
     QuadPathGM() {}
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     SkString onShortName() {
         return SkString("quadpath");
     }
@@ -158,6 +162,10 @@
     QuadClosePathGM() {}
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     SkString onShortName() {
         return SkString("quadclosepath");
     }
diff --git a/gm/rects.cpp b/gm/rects.cpp
index 4b12605..a8d7188 100644
--- a/gm/rects.cpp
+++ b/gm/rects.cpp
@@ -25,6 +25,10 @@
     }
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     virtual SkString onShortName() SK_OVERRIDE {
         return SkString("rects");
     }
diff --git a/gm/resizeimagefilter.cpp b/gm/resizeimagefilter.cpp
index 3f4f1fa..417f4f4 100644
--- a/gm/resizeimagefilter.cpp
+++ b/gm/resizeimagefilter.cpp
@@ -21,6 +21,10 @@
     }
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     virtual SkString onShortName() {
         return SkString("resizeimagefilter");
     }
diff --git a/gm/roundrects.cpp b/gm/roundrects.cpp
index 7f5b9ea..b6e5a27 100644
--- a/gm/roundrects.cpp
+++ b/gm/roundrects.cpp
@@ -27,6 +27,10 @@
     }
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     virtual SkString onShortName() SK_OVERRIDE {
         return SkString("roundrects");
     }
diff --git a/gm/rrect.cpp b/gm/rrect.cpp
index c13f145..8e26b1b 100644
--- a/gm/rrect.cpp
+++ b/gm/rrect.cpp
@@ -126,6 +126,10 @@
     RRectGM() {}
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     virtual SkString onShortName() {
         return SkString("rrect");
     }
diff --git a/gm/rrects.cpp b/gm/rrects.cpp
index 0dc70b1..8e4b199 100644
--- a/gm/rrects.cpp
+++ b/gm/rrects.cpp
@@ -58,9 +58,9 @@
 
     virtual uint32_t onGetFlags() const SK_OVERRIDE {
         if (kEffect_Type == fType) {
-            return kGPUOnly_Flag;
+            return kGPUOnly_Flag | kSkipTiled_Flag;
         } else {
-            return 0;
+            return kSkipTiled_Flag;
         }
     }
 
diff --git a/gm/samplerstress.cpp b/gm/samplerstress.cpp
index 4303118..a809c25 100644
--- a/gm/samplerstress.cpp
+++ b/gm/samplerstress.cpp
@@ -28,6 +28,10 @@
     }
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     virtual SkString onShortName() {
         return SkString("samplerstress");
     }
diff --git a/gm/shaderbounds.cpp b/gm/shaderbounds.cpp
index 2a52ead..f0b8b97 100644
--- a/gm/shaderbounds.cpp
+++ b/gm/shaderbounds.cpp
@@ -34,6 +34,10 @@
     }
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     SkString onShortName() {
         return fName;
     }
diff --git a/gm/shadertext.cpp b/gm/shadertext.cpp
index 02b9092..b9e28be 100644
--- a/gm/shadertext.cpp
+++ b/gm/shadertext.cpp
@@ -113,6 +113,9 @@
     }
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
 
     SkString onShortName() {
         return SkString("shadertext");
diff --git a/gm/shadertext2.cpp b/gm/shadertext2.cpp
index 87fe1b2..d6a9a72 100644
--- a/gm/shadertext2.cpp
+++ b/gm/shadertext2.cpp
@@ -205,7 +205,7 @@
 
     virtual uint32_t onGetFlags() const SK_OVERRIDE {
         // disable 565 for now, til mike fixes the debug assert
-        return this->INHERITED::onGetFlags() | kSkip565_Flag;
+        return kSkip565_Flag | kSkipTiled_Flag;
     }
 
 private:
diff --git a/gm/shadertext3.cpp b/gm/shadertext3.cpp
index 6ae3159..8aa6e69 100644
--- a/gm/shadertext3.cpp
+++ b/gm/shadertext3.cpp
@@ -58,6 +58,9 @@
     }
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
 
     virtual SkString onShortName() SK_OVERRIDE {
         return SkString("shadertext3");
diff --git a/gm/shadows.cpp b/gm/shadows.cpp
index 44fa8e2..d5458e0 100644
--- a/gm/shadows.cpp
+++ b/gm/shadows.cpp
@@ -36,6 +36,10 @@
     }
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     virtual SkString onShortName() {
         return SkString("shadows");
     }
diff --git a/gm/shallowgradient.cpp b/gm/shallowgradient.cpp
index fd14943..a2b29d3 100644
--- a/gm/shallowgradient.cpp
+++ b/gm/shallowgradient.cpp
@@ -42,6 +42,13 @@
     }
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        if (fName.contains("linear") || fName.contains("radial")) {
+            return kSkipTiled_Flag;
+        }
+        return 0;
+    }
+
     virtual SkString onShortName() SK_OVERRIDE {
         return fName;
     }
diff --git a/gm/simpleaaclip.cpp b/gm/simpleaaclip.cpp
index 41fb9fba6..1e51f99 100644
--- a/gm/simpleaaclip.cpp
+++ b/gm/simpleaaclip.cpp
@@ -124,6 +124,10 @@
         canvas->restore();
     }
 
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kPath_GeomType == fGeomType ? kSkipTiled_Flag : 0;
+    }
+
     virtual SkString onShortName() {
         SkString str;
         str.printf("simpleaaclip_%s",
diff --git a/gm/skbug1719.cpp b/gm/skbug1719.cpp
index 22caffd..893ad94 100644
--- a/gm/skbug1719.cpp
+++ b/gm/skbug1719.cpp
@@ -24,6 +24,10 @@
     SkBug1719GM() {}
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     virtual SkString onShortName() SK_OVERRIDE {
         return SkString("skbug1719");
     }
diff --git a/gm/spritebitmap.cpp b/gm/spritebitmap.cpp
index f7997ee..a387dd3 100644
--- a/gm/spritebitmap.cpp
+++ b/gm/spritebitmap.cpp
@@ -62,6 +62,10 @@
     SpriteBitmapGM() {}
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     virtual SkString onShortName() {
         return SkString("spritebitmap");
     }
diff --git a/gm/stringart.cpp b/gm/stringart.cpp
index 1d81e13..24d7b14 100644
--- a/gm/stringart.cpp
+++ b/gm/stringart.cpp
@@ -23,6 +23,10 @@
     StringArtGM() {}
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     virtual SkString onShortName() {
         return SkString("stringart");
     }
diff --git a/gm/strokefill.cpp b/gm/strokefill.cpp
index 445de81..ce74b39 100644
--- a/gm/strokefill.cpp
+++ b/gm/strokefill.cpp
@@ -19,6 +19,10 @@
     }
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     virtual SkString onShortName() {
         return SkString("stroke-fill");
     }
diff --git a/gm/strokerect.cpp b/gm/strokerect.cpp
index 489f7b4..9c86aec 100644
--- a/gm/strokerect.cpp
+++ b/gm/strokerect.cpp
@@ -46,6 +46,10 @@
     StrokeRectGM() {}
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     virtual SkString onShortName() {
         return SkString("strokerect");
     }
diff --git a/gm/strokerects.cpp b/gm/strokerects.cpp
index 6abb89f..eb37f32 100644
--- a/gm/strokerects.cpp
+++ b/gm/strokerects.cpp
@@ -25,6 +25,10 @@
     StrokeRectsGM() {}
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     virtual SkString onShortName() {
         return SkString("strokerects");
     }
diff --git a/gm/strokes.cpp b/gm/strokes.cpp
index 861fd76..8174169 100644
--- a/gm/strokes.cpp
+++ b/gm/strokes.cpp
@@ -39,6 +39,10 @@
     StrokesGM() {}
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     virtual SkString onShortName() {
         return SkString("strokes_round");
     }
@@ -91,6 +95,10 @@
     }
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     virtual SkString onShortName() {
         return SkString("strokes_poly");
     }
@@ -188,6 +196,10 @@
     Strokes3GM() {}
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     virtual SkString onShortName() {
         return SkString("strokes3");
     }
diff --git a/gm/stroketext.cpp b/gm/stroketext.cpp
index b9d56f1..387843a 100644
--- a/gm/stroketext.cpp
+++ b/gm/stroketext.cpp
@@ -50,6 +50,10 @@
     StrokeTextGM() {}
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     virtual SkString onShortName() SK_OVERRIDE {
         return SkString("stroketext");
     }
diff --git a/gm/testimagefilters.cpp b/gm/testimagefilters.cpp
index 2b937ec..799b44c 100644
--- a/gm/testimagefilters.cpp
+++ b/gm/testimagefilters.cpp
@@ -101,6 +101,10 @@
         return SkString("testimagefilters");
     }
 
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     virtual SkISize onISize() { return SkISize::Make(700, 460); }
 
     virtual void onDraw(SkCanvas* canvas) {
diff --git a/gm/thinstrokedrects.cpp b/gm/thinstrokedrects.cpp
index 2f839d1..19746f7 100644
--- a/gm/thinstrokedrects.cpp
+++ b/gm/thinstrokedrects.cpp
@@ -17,6 +17,10 @@
     }
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     virtual SkString onShortName() SK_OVERRIDE {
         return SkString("thinstrokedrects");
     }
diff --git a/gm/tilemodes.cpp b/gm/tilemodes.cpp
index abecada..e04c52a 100644
--- a/gm/tilemodes.cpp
+++ b/gm/tilemodes.cpp
@@ -200,6 +200,10 @@
     }
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     SkString onShortName() {
         return fName;
     }
diff --git a/gm/tilemodes_scaled.cpp b/gm/tilemodes_scaled.cpp
index e9c6c99..a79002b 100644
--- a/gm/tilemodes_scaled.cpp
+++ b/gm/tilemodes_scaled.cpp
@@ -68,12 +68,18 @@
     SkBitmap    fTexture[SK_ARRAY_COUNT(gColorTypes)];
 
 protected:
-
     enum {
         kPOTSize = 4,
         kNPOTSize = 3,
     };
 
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        if (!fPowerOfTwoSize) {
+            return kSkipTiled_Flag;  // Only for 565.  8888 is fine.
+        }
+        return 0;
+    }
+
     SkString onShortName() {
         SkString name("scaled_tilemodes");
         if (!fPowerOfTwoSize) {
@@ -214,6 +220,10 @@
     }
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     SkString onShortName() {
         return fName;
     }
diff --git a/gm/twopointradial.cpp b/gm/twopointradial.cpp
index a10f5af..f4a4ddf 100644
--- a/gm/twopointradial.cpp
+++ b/gm/twopointradial.cpp
@@ -56,6 +56,10 @@
     TwoPointRadialGM() {}
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     SkString onShortName() {
         return SkString("twopointconical");
     }
diff --git a/gm/vertices.cpp b/gm/vertices.cpp
index 644000e..0d09dc6 100644
--- a/gm/vertices.cpp
+++ b/gm/vertices.cpp
@@ -37,6 +37,10 @@
     }
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
     virtual void onOnceBeforeDraw() SK_OVERRIDE {
         const SkScalar X = 150;
         const SkScalar Y = 150;
diff --git a/gm/verttext.cpp b/gm/verttext.cpp
index 1f1c64d..736a5cf 100644
--- a/gm/verttext.cpp
+++ b/gm/verttext.cpp
@@ -49,6 +49,9 @@
     //SkAutoTUnref<SkTypeface> fFace;
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
 
     SkString onShortName() {
         return SkString("verttext");
diff --git a/gm/verttext2.cpp b/gm/verttext2.cpp
index 33380e0..331b99d 100644
--- a/gm/verttext2.cpp
+++ b/gm/verttext2.cpp
@@ -31,6 +31,10 @@
     }
 
 protected:
+    virtual uint32_t onGetFlags() const SK_OVERRIDE {
+        return kSkipTiled_Flag;
+    }
+
 
     SkString onShortName() {
         return SkString("verttext2");
diff --git a/gm/verylargebitmap.cpp b/gm/verylargebitmap.cpp
index 6eca701..d3b16e9 100644
--- a/gm/verylargebitmap.cpp
+++ b/gm/verylargebitmap.cpp
@@ -109,7 +109,7 @@
                kSkipTiled_Flag              |
                kSkipScaledReplay_Flag;
 #else
-        return 0;
+        return kSkipTiled_Flag;
 #endif
     }
 
diff --git a/gyp/dm.gyp b/gyp/dm.gyp
index 8bb8ddf..4cfcdc6 100644
--- a/gyp/dm.gyp
+++ b/gyp/dm.gyp
@@ -33,6 +33,7 @@
             '../dm/DMExpectationsTask.cpp',
             '../dm/DMGpuGMTask.cpp',
             '../dm/DMPipeTask.cpp',
+            '../dm/DMQuiltTask.cpp',
             '../dm/DMRecordTask.cpp',
             '../dm/DMReplayTask.cpp',
             '../dm/DMReporter.cpp',
@@ -40,7 +41,6 @@
             '../dm/DMTask.cpp',
             '../dm/DMTaskRunner.cpp',
             '../dm/DMTestTask.cpp',
-            '../dm/DMTileGridTask.cpp',
             '../dm/DMUtil.cpp',
             '../dm/DMWriteTask.cpp',
             '../gm/gm.cpp',