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