diff options
author | Florin Malita <fmalita@chromium.org> | 2018-04-18 11:14:50 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2018-04-18 19:52:53 +0000 |
commit | 15a64e71f68f7d1fcd16247c3d30375d3e2f41e8 (patch) | |
tree | a4aec01af06e2f855ea339312cf68e1b175a4e4d /bench | |
parent | 63f69cdc326b2bbd4361aa4997f41a197a08d2f0 (diff) |
Convert A8 D32 mask blitters to Sk4px
Improves the newly added bench by ~25% (hsw):
-- before --
micros bench
2298.34 shadermaskfilter_picture_80 8888
2339.60 shadermaskfilter_picture_ff 8888
2287.11 shadermaskfilter_bitmap_80 8888
2223.14 shadermaskfilter_bitmap_ff 8888
-- after --
1693.36 shadermaskfilter_picture_80 8888
1637.45 shadermaskfilter_picture_ff 8888
1691.65 shadermaskfilter_bitmap_80 8888
1637.70 shadermaskfilter_bitmap_ff 8888
But: skia:7810
Change-Id: I7274b10f517551ee2c0646842f72e0372d55e509
Reviewed-on: https://skia-review.googlesource.com/121642
Commit-Queue: Florin Malita <fmalita@chromium.org>
Reviewed-by: Mike Klein <mtklein@google.com>
Diffstat (limited to 'bench')
-rw-r--r-- | bench/ShaderMaskFilterBench.cpp | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/bench/ShaderMaskFilterBench.cpp b/bench/ShaderMaskFilterBench.cpp new file mode 100644 index 0000000000..4a2ec14b78 --- /dev/null +++ b/bench/ShaderMaskFilterBench.cpp @@ -0,0 +1,80 @@ +/* + * Copyright 2018 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "Benchmark.h" +#include "SkCanvas.h" +#include "SkPaint.h" +#include "SkPictureRecorder.h" +#include "SkPictureShader.h" +#include "SkShaderMaskFilter.h" +#include "SkSurface.h" + +static sk_sp<SkShader> make_bitmap_shader() { + SkPaint p; + p.setColor(SK_ColorBLACK); + p.setAntiAlias(true); + + auto surface = SkSurface::MakeRasterN32Premul(100, 100); + surface->getCanvas()->drawCircle(50, 50, 50, p); + + return surface->makeImageSnapshot()->makeShader(SkShader::kRepeat_TileMode, + SkShader::kRepeat_TileMode); +} + +static sk_sp<SkShader> make_picture_shader() { + SkPaint p; + p.setColor(SK_ColorBLACK); + p.setAntiAlias(true); + + SkPictureRecorder recorder; + recorder.beginRecording(100, 100)->drawCircle(50, 50, 50, p); + + return SkPictureShader::Make(recorder.finishRecordingAsPicture(), + SkShader::kRepeat_TileMode, + SkShader::kRepeat_TileMode, + nullptr, nullptr); +} + +class ShaderMFBench final : public Benchmark { + +public: + using ShaderMaker = sk_sp<SkShader>(*)(); + + ShaderMFBench(const char* nm, bool opaque, const ShaderMaker& maker) { + fMaskFilter = SkShaderMaskFilter::Make(maker()); + fColor = opaque ? 0xff00ff00 : 0x8000ff00; + fName = SkStringPrintf("shadermaskfilter_%s_%x", nm, SkColorGetA(fColor)); + } + +protected: + const char* onGetName() override { + return fName.c_str(); + } + + void onDraw(int loops, SkCanvas* canvas) override { + SkPaint maskPaint; + maskPaint.setMaskFilter(fMaskFilter); + + for (int i = 0; i < loops; ++i) { + SkAutoCanvasRestore arc(canvas, false); + canvas->saveLayer(nullptr, &maskPaint); + canvas->drawColor(fColor); + } + } + +private: + SkString fName; + sk_sp<SkMaskFilter> fMaskFilter; + SkColor fColor; + + using INHERITED = Benchmark; +}; + +DEF_BENCH( return new ShaderMFBench("bitmap" , true , make_bitmap_shader ); ) +DEF_BENCH( return new ShaderMFBench("bitmap" , false, make_bitmap_shader ); ) +DEF_BENCH( return new ShaderMFBench("picture", true , make_picture_shader); ) +DEF_BENCH( return new ShaderMFBench("picture", false, make_picture_shader); ) |