From 15a64e71f68f7d1fcd16247c3d30375d3e2f41e8 Mon Sep 17 00:00:00 2001 From: Florin Malita Date: Wed, 18 Apr 2018 11:14:50 -0400 Subject: 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 Reviewed-by: Mike Klein --- bench/ShaderMaskFilterBench.cpp | 80 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 bench/ShaderMaskFilterBench.cpp (limited to 'bench/ShaderMaskFilterBench.cpp') 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 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 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(*)(); + + 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 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); ) -- cgit v1.2.3