diff options
-rw-r--r-- | bench/ImageFilterDAGBench.cpp | 32 | ||||
-rw-r--r-- | src/core/SkImageFilter.cpp | 26 |
2 files changed, 43 insertions, 15 deletions
diff --git a/bench/ImageFilterDAGBench.cpp b/bench/ImageFilterDAGBench.cpp index 74e23efb00..d66d287e18 100644 --- a/bench/ImageFilterDAGBench.cpp +++ b/bench/ImageFilterDAGBench.cpp @@ -7,6 +7,7 @@ #include "Benchmark.h" #include "SkBlurImageFilter.h" +#include "SkDisplacementMapEffect.h" #include "SkCanvas.h" #include "SkMergeImageFilter.h" @@ -44,4 +45,35 @@ private: typedef Benchmark INHERITED; }; +// Exercise a blur filter connected to both inputs of an SkDisplacementMapEffect. + +class ImageFilterDisplacedBlur : public Benchmark { +public: + ImageFilterDisplacedBlur() {} + +protected: + const char* onGetName() override { + return "image_filter_displaced_blur"; + } + + void onDraw(int loops, SkCanvas* canvas) override { + for (int j = 0; j < loops; j++) { + SkAutoTUnref<SkImageFilter> blur(SkBlurImageFilter::Create(4.0f, 4.0f)); + SkDisplacementMapEffect::ChannelSelectorType xSelector = SkDisplacementMapEffect::kR_ChannelSelectorType; + SkDisplacementMapEffect::ChannelSelectorType ySelector = SkDisplacementMapEffect::kB_ChannelSelectorType; + SkScalar scale = 2; + SkAutoTUnref<SkImageFilter> displ(SkDisplacementMapEffect::Create(xSelector, ySelector, scale, + blur.get(), blur.get())); + SkPaint paint; + paint.setImageFilter(displ); + SkRect rect = SkRect::Make(SkIRect::MakeWH(400, 400)); + canvas->drawRect(rect, paint); + } + } + +private: + typedef Benchmark INHERITED; +}; + DEF_BENCH(return new ImageFilterDAGBench;) +DEF_BENCH(return new ImageFilterDisplacedBlur;) diff --git a/src/core/SkImageFilter.cpp b/src/core/SkImageFilter.cpp index fef88fdf37..95793025e8 100644 --- a/src/core/SkImageFilter.cpp +++ b/src/core/SkImageFilter.cpp @@ -496,23 +496,19 @@ bool SkImageFilter::filterInputGPU(int index, SkImageFilter::Proxy* proxy, } Context ctx(origCtx.ctm(), origCtx.clipBounds(), origCtx.cache(), constraint); - if (input->canFilterImageGPU()) { - return input->filterImageGPU(proxy, src, ctx, result, offset); - } else { - if (input->filterImage(proxy, src, ctx, result, offset)) { - if (!result->getTexture()) { - const SkImageInfo info = result->info(); - if (kUnknown_SkColorType == info.colorType()) { - return false; - } - SkAutoTUnref<GrTexture> resultTex( - GrRefCachedBitmapTexture(context, *result,GrTextureParams::ClampNoFilter())); - result->setPixelRef(new SkGrPixelRef(info, resultTex))->unref(); + if (input->filterImage(proxy, src, ctx, result, offset)) { + if (!result->getTexture()) { + const SkImageInfo info = result->info(); + if (kUnknown_SkColorType == info.colorType()) { + return false; } - return true; - } else { - return false; + SkAutoTUnref<GrTexture> resultTex( + GrRefCachedBitmapTexture(context, *result,GrTextureParams::ClampNoFilter())); + result->setPixelRef(new SkGrPixelRef(info, resultTex))->unref(); } + return true; + } else { + return false; } } #endif |