Add standard way to indicate GM is GPU-only.

TBR=egdaniel@google.com,mtklein@google.com

Review URL: https://codereview.chromium.org/869393007
diff --git a/gm/beziereffects.cpp b/gm/beziereffects.cpp
index e49fc91..0ddcc52 100644
--- a/gm/beziereffects.cpp
+++ b/gm/beziereffects.cpp
@@ -48,6 +48,7 @@
     void onDraw(SkCanvas* canvas) SK_OVERRIDE {
         GrRenderTarget* rt = canvas->internal_private_accessTopLayerRenderTarget();
         if (NULL == rt) {
+            this->drawGpuOnlyMessage(canvas);
             return;
         }
         GrContext* context = rt->getContext();
@@ -203,6 +204,7 @@
     void onDraw(SkCanvas* canvas) SK_OVERRIDE {
         GrRenderTarget* rt = canvas->internal_private_accessTopLayerRenderTarget();
         if (NULL == rt) {
+            this->drawGpuOnlyMessage(canvas);
             return;
         }
         GrContext* context = rt->getContext();
@@ -391,6 +393,7 @@
     void onDraw(SkCanvas* canvas) SK_OVERRIDE {
         GrRenderTarget* rt = canvas->internal_private_accessTopLayerRenderTarget();
         if (NULL == rt) {
+            this->drawGpuOnlyMessage(canvas);
             return;
         }
         GrContext* context = rt->getContext();
diff --git a/gm/convexpolyeffect.cpp b/gm/convexpolyeffect.cpp
index 6e47057..281ddca 100644
--- a/gm/convexpolyeffect.cpp
+++ b/gm/convexpolyeffect.cpp
@@ -95,6 +95,7 @@
     void onDraw(SkCanvas* canvas) SK_OVERRIDE {
         GrRenderTarget* rt = canvas->internal_private_accessTopLayerRenderTarget();
         if (NULL == rt) {
+            this->drawGpuOnlyMessage(canvas);
             return;
         }
         GrContext* context = rt->getContext();
diff --git a/gm/dcshader.cpp b/gm/dcshader.cpp
index 1f5969b..4b8f5ed 100644
--- a/gm/dcshader.cpp
+++ b/gm/dcshader.cpp
@@ -248,6 +248,12 @@
     }
 
     void onDraw(SkCanvas* canvas) SK_OVERRIDE {
+        // This GM exists to test a specific feature of the GPU backend. It does not work with the
+        // sw rasterizer, tile modes, etc.
+        if (NULL == canvas->getGrContext()) {
+            this->drawGpuOnlyMessage(canvas);
+            return;
+        }
         SkPaint paint;
         SkTArray<SkMatrix> devMats;
         devMats.push_back().reset();
diff --git a/gm/gm.cpp b/gm/gm.cpp
index ff17644..1922284 100644
--- a/gm/gm.cpp
+++ b/gm/gm.cpp
@@ -6,7 +6,7 @@
  */
 
 #include "gm.h"
-
+#include "SkShader.h"
 using namespace skiagm;
 
 GM::GM() {
@@ -64,6 +64,29 @@
     canvas->drawRect(r, paint);
 }
 
+void GM::drawGpuOnlyMessage(SkCanvas* canvas) {
+    SkBitmap bmp;
+    bmp.allocN32Pixels(128, 64);
+    SkCanvas bmpCanvas(bmp);
+    bmpCanvas.drawColor(SK_ColorWHITE);
+    SkPaint paint;
+    paint.setAntiAlias(true);
+    paint.setTextSize(20);
+    paint.setColor(SK_ColorRED);
+    static const char kTxt[] = "GPU Only";
+    bmpCanvas.drawText(kTxt, strlen(kTxt), 20, 40, paint);
+    SkMatrix localM;
+    localM.setRotate(35.f);
+    localM.postTranslate(10.f, 0.f);
+    SkAutoTUnref<SkShader> shader(SkShader::CreateBitmapShader(bmp, SkShader::kMirror_TileMode,
+                                                               SkShader::kMirror_TileMode,
+                                                               &localM));
+    paint.setShader(shader);
+    paint.setFilterQuality(kMedium_SkFilterQuality);
+    canvas->drawPaint(paint);
+    return;
+}
+
 // need to explicitly declare this, or we get some weird infinite loop llist
 template GMRegistry* GMRegistry::gHead;
 
diff --git a/gm/gm.h b/gm/gm.h
index b474729..211e051 100644
--- a/gm/gm.h
+++ b/gm/gm.h
@@ -93,6 +93,9 @@
         }
 
     protected:
+        /** draws a standard message that the GM is only intended to be used with the GPU.*/
+        void drawGpuOnlyMessage(SkCanvas* 
+                                );
         virtual void onOnceBeforeDraw() {}
         virtual void onDraw(SkCanvas*) = 0;
         virtual void onDrawBackground(SkCanvas*);
diff --git a/gm/rrects.cpp b/gm/rrects.cpp
index 046e5e6..4b8e764 100644
--- a/gm/rrects.cpp
+++ b/gm/rrects.cpp
@@ -57,13 +57,15 @@
     SkISize onISize() SK_OVERRIDE { return SkISize::Make(kImageWidth, kImageHeight); }
 
     void onDraw(SkCanvas* canvas) SK_OVERRIDE {
+        GrContext* context = NULL;
 #if SK_SUPPORT_GPU
         GrRenderTarget* rt = canvas->internal_private_accessTopLayerRenderTarget();
-        GrContext* context = rt ? rt->getContext() : NULL;
+        context = rt ? rt->getContext() : NULL;
+#endif
         if (kEffect_Type == fType && NULL == context) {
+            this->drawGpuOnlyMessage(canvas);
             return;
         }
-#endif
 
         SkPaint paint;
         if (kAA_Draw_Type == fType) {
diff --git a/gm/texdata.cpp b/gm/texdata.cpp
index dafd579..4644758 100644
--- a/gm/texdata.cpp
+++ b/gm/texdata.cpp
@@ -128,6 +128,8 @@
                                      4 * stride);
                 ctx->drawRect(paint, vm, SkRect::MakeWH(2*S, 2*S));
             }
+        } else {
+            this->drawGpuOnlyMessage(canvas);
         }
     }
 
diff --git a/gm/texturedomaineffect.cpp b/gm/texturedomaineffect.cpp
index 570ec25..d39375b 100644
--- a/gm/texturedomaineffect.cpp
+++ b/gm/texturedomaineffect.cpp
@@ -75,6 +75,7 @@
         }
         GrContext* context = rt->getContext();
         if (NULL == context) {
+            this->drawGpuOnlyMessage(canvas);
             return;
         }
 
diff --git a/gm/yuvtorgbeffect.cpp b/gm/yuvtorgbeffect.cpp
index 1a2c9c9..fb0c67d 100644
--- a/gm/yuvtorgbeffect.cpp
+++ b/gm/yuvtorgbeffect.cpp
@@ -66,6 +66,7 @@
         }
         GrContext* context = rt->getContext();
         if (NULL == context) {
+            this->drawGpuOnlyMessage(canvas);
             return;
         }