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