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;
}