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..0ddcc52b 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; }