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"
100d64356efd8a3ca40d39729f62e0fa9a5bc3a365senorblanco@chromium.org#include "SkCanvas.h"
11f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#include "SkMergeImageFilter.h"
120d64356efd8a3ca40d39729f62e0fa9a5bc3a365senorblanco@chromium.org
130d64356efd8a3ca40d39729f62e0fa9a5bc3a365senorblanco@chromium.orgenum { kNumInputs = 5 };
140d64356efd8a3ca40d39729f62e0fa9a5bc3a365senorblanco@chromium.org
150d64356efd8a3ca40d39729f62e0fa9a5bc3a365senorblanco@chromium.org// Exercise a blur filter connected to 5 inputs of the same merge filter.
160d64356efd8a3ca40d39729f62e0fa9a5bc3a365senorblanco@chromium.org// This bench shows an improvement in performance once cacheing of re-used
170d64356efd8a3ca40d39729f62e0fa9a5bc3a365senorblanco@chromium.org// nodes is implemented, since the DAG is no longer flattened to a tree.
180d64356efd8a3ca40d39729f62e0fa9a5bc3a365senorblanco@chromium.org
19f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass ImageFilterDAGBench : public Benchmark {
200d64356efd8a3ca40d39729f62e0fa9a5bc3a365senorblanco@chromium.orgpublic:
21bb6a02823929584231c8e080ee69e7fb1178cbfbmtklein    ImageFilterDAGBench() {}
220d64356efd8a3ca40d39729f62e0fa9a5bc3a365senorblanco@chromium.org
230d64356efd8a3ca40d39729f62e0fa9a5bc3a365senorblanco@chromium.orgprotected:
240d64356efd8a3ca40d39729f62e0fa9a5bc3a365senorblanco@chromium.org    virtual const char* onGetName() SK_OVERRIDE {
250d64356efd8a3ca40d39729f62e0fa9a5bc3a365senorblanco@chromium.org        return "image_filter_dag";
260d64356efd8a3ca40d39729f62e0fa9a5bc3a365senorblanco@chromium.org    }
270d64356efd8a3ca40d39729f62e0fa9a5bc3a365senorblanco@chromium.org
280d64356efd8a3ca40d39729f62e0fa9a5bc3a365senorblanco@chromium.org    virtual void onDraw(const int loops, SkCanvas* canvas) SK_OVERRIDE {
29bb6a02823929584231c8e080ee69e7fb1178cbfbmtklein        for (int j = 0; j < loops; j++) {
30bb6a02823929584231c8e080ee69e7fb1178cbfbmtklein            SkAutoTUnref<SkImageFilter> blur(SkBlurImageFilter::Create(20.0f, 20.0f));
31bb6a02823929584231c8e080ee69e7fb1178cbfbmtklein            SkImageFilter* inputs[kNumInputs];
32bb6a02823929584231c8e080ee69e7fb1178cbfbmtklein            for (int i = 0; i < kNumInputs; ++i) {
33bb6a02823929584231c8e080ee69e7fb1178cbfbmtklein                inputs[i] = blur.get();
34bb6a02823929584231c8e080ee69e7fb1178cbfbmtklein            }
35bb6a02823929584231c8e080ee69e7fb1178cbfbmtklein            SkAutoTUnref<SkImageFilter> merge(SkMergeImageFilter::Create(inputs, kNumInputs));
36bb6a02823929584231c8e080ee69e7fb1178cbfbmtklein            SkPaint paint;
37bb6a02823929584231c8e080ee69e7fb1178cbfbmtklein            paint.setImageFilter(merge);
38bb6a02823929584231c8e080ee69e7fb1178cbfbmtklein            SkRect rect = SkRect::Make(SkIRect::MakeWH(400, 400));
39bb6a02823929584231c8e080ee69e7fb1178cbfbmtklein            canvas->drawRect(rect, paint);
400d64356efd8a3ca40d39729f62e0fa9a5bc3a365senorblanco@chromium.org        }
410d64356efd8a3ca40d39729f62e0fa9a5bc3a365senorblanco@chromium.org    }
420d64356efd8a3ca40d39729f62e0fa9a5bc3a365senorblanco@chromium.org
430d64356efd8a3ca40d39729f62e0fa9a5bc3a365senorblanco@chromium.orgprivate:
44f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina    typedef Benchmark INHERITED;
450d64356efd8a3ca40d39729f62e0fa9a5bc3a365senorblanco@chromium.org};
460d64356efd8a3ca40d39729f62e0fa9a5bc3a365senorblanco@chromium.org
470d64356efd8a3ca40d39729f62e0fa9a5bc3a365senorblanco@chromium.orgDEF_BENCH(return new ImageFilterDAGBench;)
48