10d64356efd8a3ca40d39729f62e0fa9a5bc3a365senorblanco@chromium.org/*
20d64356efd8a3ca40d39729f62e0fa9a5bc3a365senorblanco@chromium.org * Copyright 2014 Google Inc.
30d64356efd8a3ca40d39729f62e0fa9a5bc3a365senorblanco@chromium.org *
40d64356efd8a3ca40d39729f62e0fa9a5bc3a365senorblanco@chromium.org * Use of this source code is governed by a BSD-style license that can be
50d64356efd8a3ca40d39729f62e0fa9a5bc3a365senorblanco@chromium.org * found in the LICENSE file.
60d64356efd8a3ca40d39729f62e0fa9a5bc3a365senorblanco@chromium.org */
70d64356efd8a3ca40d39729f62e0fa9a5bc3a365senorblanco@chromium.org
8f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#include "Benchmark.h"
90d64356efd8a3ca40d39729f62e0fa9a5bc3a365senorblanco@chromium.org#include "SkBlurImageFilter.h"
102880df2609eba09b555ca37be04b6ad89290c765Tom Hudson#include "SkDisplacementMapEffect.h"
110d64356efd8a3ca40d39729f62e0fa9a5bc3a365senorblanco@chromium.org#include "SkCanvas.h"
12f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#include "SkMergeImageFilter.h"
130d64356efd8a3ca40d39729f62e0fa9a5bc3a365senorblanco@chromium.org
140d64356efd8a3ca40d39729f62e0fa9a5bc3a365senorblanco@chromium.orgenum { kNumInputs = 5 };
150d64356efd8a3ca40d39729f62e0fa9a5bc3a365senorblanco@chromium.org
160d64356efd8a3ca40d39729f62e0fa9a5bc3a365senorblanco@chromium.org// Exercise a blur filter connected to 5 inputs of the same merge filter.
170d64356efd8a3ca40d39729f62e0fa9a5bc3a365senorblanco@chromium.org// This bench shows an improvement in performance once cacheing of re-used
180d64356efd8a3ca40d39729f62e0fa9a5bc3a365senorblanco@chromium.org// nodes is implemented, since the DAG is no longer flattened to a tree.
190d64356efd8a3ca40d39729f62e0fa9a5bc3a365senorblanco@chromium.org
20f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass ImageFilterDAGBench : public Benchmark {
210d64356efd8a3ca40d39729f62e0fa9a5bc3a365senorblanco@chromium.orgpublic:
22bb6a02823929584231c8e080ee69e7fb1178cbfbmtklein    ImageFilterDAGBench() {}
230d64356efd8a3ca40d39729f62e0fa9a5bc3a365senorblanco@chromium.org
240d64356efd8a3ca40d39729f62e0fa9a5bc3a365senorblanco@chromium.orgprotected:
2536352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    const char* onGetName() override {
260d64356efd8a3ca40d39729f62e0fa9a5bc3a365senorblanco@chromium.org        return "image_filter_dag";
270d64356efd8a3ca40d39729f62e0fa9a5bc3a365senorblanco@chromium.org    }
280d64356efd8a3ca40d39729f62e0fa9a5bc3a365senorblanco@chromium.org
292880df2609eba09b555ca37be04b6ad89290c765Tom Hudson    void onDraw(int loops, SkCanvas* canvas) override {
30bb6a02823929584231c8e080ee69e7fb1178cbfbmtklein        for (int j = 0; j < loops; j++) {
31bb6a02823929584231c8e080ee69e7fb1178cbfbmtklein            SkAutoTUnref<SkImageFilter> blur(SkBlurImageFilter::Create(20.0f, 20.0f));
32bb6a02823929584231c8e080ee69e7fb1178cbfbmtklein            SkImageFilter* inputs[kNumInputs];
33bb6a02823929584231c8e080ee69e7fb1178cbfbmtklein            for (int i = 0; i < kNumInputs; ++i) {
34bb6a02823929584231c8e080ee69e7fb1178cbfbmtklein                inputs[i] = blur.get();
35bb6a02823929584231c8e080ee69e7fb1178cbfbmtklein            }
36bb6a02823929584231c8e080ee69e7fb1178cbfbmtklein            SkAutoTUnref<SkImageFilter> merge(SkMergeImageFilter::Create(inputs, kNumInputs));
37bb6a02823929584231c8e080ee69e7fb1178cbfbmtklein            SkPaint paint;
38bb6a02823929584231c8e080ee69e7fb1178cbfbmtklein            paint.setImageFilter(merge);
39bb6a02823929584231c8e080ee69e7fb1178cbfbmtklein            SkRect rect = SkRect::Make(SkIRect::MakeWH(400, 400));
40bb6a02823929584231c8e080ee69e7fb1178cbfbmtklein            canvas->drawRect(rect, paint);
410d64356efd8a3ca40d39729f62e0fa9a5bc3a365senorblanco@chromium.org        }
420d64356efd8a3ca40d39729f62e0fa9a5bc3a365senorblanco@chromium.org    }
430d64356efd8a3ca40d39729f62e0fa9a5bc3a365senorblanco@chromium.org
440d64356efd8a3ca40d39729f62e0fa9a5bc3a365senorblanco@chromium.orgprivate:
45f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina    typedef Benchmark INHERITED;
460d64356efd8a3ca40d39729f62e0fa9a5bc3a365senorblanco@chromium.org};
470d64356efd8a3ca40d39729f62e0fa9a5bc3a365senorblanco@chromium.org
482880df2609eba09b555ca37be04b6ad89290c765Tom Hudson// Exercise a blur filter connected to both inputs of an SkDisplacementMapEffect.
492880df2609eba09b555ca37be04b6ad89290c765Tom Hudson
502880df2609eba09b555ca37be04b6ad89290c765Tom Hudsonclass ImageFilterDisplacedBlur : public Benchmark {
512880df2609eba09b555ca37be04b6ad89290c765Tom Hudsonpublic:
522880df2609eba09b555ca37be04b6ad89290c765Tom Hudson    ImageFilterDisplacedBlur() {}
532880df2609eba09b555ca37be04b6ad89290c765Tom Hudson
542880df2609eba09b555ca37be04b6ad89290c765Tom Hudsonprotected:
552880df2609eba09b555ca37be04b6ad89290c765Tom Hudson    const char* onGetName() override {
562880df2609eba09b555ca37be04b6ad89290c765Tom Hudson        return "image_filter_displaced_blur";
572880df2609eba09b555ca37be04b6ad89290c765Tom Hudson    }
582880df2609eba09b555ca37be04b6ad89290c765Tom Hudson
592880df2609eba09b555ca37be04b6ad89290c765Tom Hudson    void onDraw(int loops, SkCanvas* canvas) override {
602880df2609eba09b555ca37be04b6ad89290c765Tom Hudson        for (int j = 0; j < loops; j++) {
612880df2609eba09b555ca37be04b6ad89290c765Tom Hudson            SkAutoTUnref<SkImageFilter> blur(SkBlurImageFilter::Create(4.0f, 4.0f));
622880df2609eba09b555ca37be04b6ad89290c765Tom Hudson            SkDisplacementMapEffect::ChannelSelectorType xSelector = SkDisplacementMapEffect::kR_ChannelSelectorType;
632880df2609eba09b555ca37be04b6ad89290c765Tom Hudson            SkDisplacementMapEffect::ChannelSelectorType ySelector = SkDisplacementMapEffect::kB_ChannelSelectorType;
642880df2609eba09b555ca37be04b6ad89290c765Tom Hudson            SkScalar scale = 2;
652880df2609eba09b555ca37be04b6ad89290c765Tom Hudson            SkAutoTUnref<SkImageFilter> displ(SkDisplacementMapEffect::Create(xSelector, ySelector, scale,
662880df2609eba09b555ca37be04b6ad89290c765Tom Hudson                                                                              blur.get(), blur.get()));
672880df2609eba09b555ca37be04b6ad89290c765Tom Hudson            SkPaint paint;
682880df2609eba09b555ca37be04b6ad89290c765Tom Hudson            paint.setImageFilter(displ);
692880df2609eba09b555ca37be04b6ad89290c765Tom Hudson            SkRect rect = SkRect::Make(SkIRect::MakeWH(400, 400));
702880df2609eba09b555ca37be04b6ad89290c765Tom Hudson            canvas->drawRect(rect, paint);
712880df2609eba09b555ca37be04b6ad89290c765Tom Hudson        }
722880df2609eba09b555ca37be04b6ad89290c765Tom Hudson    }
732880df2609eba09b555ca37be04b6ad89290c765Tom Hudson
742880df2609eba09b555ca37be04b6ad89290c765Tom Hudsonprivate:
752880df2609eba09b555ca37be04b6ad89290c765Tom Hudson    typedef Benchmark INHERITED;
762880df2609eba09b555ca37be04b6ad89290c765Tom Hudson};
772880df2609eba09b555ca37be04b6ad89290c765Tom Hudson
780d64356efd8a3ca40d39729f62e0fa9a5bc3a365senorblanco@chromium.orgDEF_BENCH(return new ImageFilterDAGBench;)
792880df2609eba09b555ca37be04b6ad89290c765Tom HudsonDEF_BENCH(return new ImageFilterDisplacedBlur;)
80