aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar senorblanco <senorblanco@chromium.org>2015-10-26 06:55:47 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2015-10-26 06:55:47 -0700
commit7b87ee7a1c43ad9d4d20955cc25f3c31af161bb5 (patch)
treed56064ba4c6839e440a4c1ff7bd4db6637ef612a
parentd5dcd588020ad54db385af43987b204617fdcd1e (diff)
Image filters: simplify filterInputGPU().
Remove a call to canFilterImageGPU() / filterImageGPU() from filterInputGPU(). There's no reason to do this, since the subsequent filterImage() call will do it for us anyway. And this call actually defeats caching (as demonstrated by the attached bench). BUG=skia: Review URL: https://codereview.chromium.org/1411013004
-rw-r--r--bench/ImageFilterDAGBench.cpp32
-rw-r--r--src/core/SkImageFilter.cpp26
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