skia2/bench/ShaderMaskFilterBench.cpp
Herb Derby 12732e4ad8 Reland "remove drawing from ShaderMaskBench ctor"
This is a reland of 4c5f3ba155

Added: store the function pointer directly instead of a ref to it.

Original change's description:
> remove drawing from ShaderMaskBench ctor
>
> The drawing in the ctor makes debugging and measuring the
> RasterPipeline difficult. Move to onDelayedSetup().
>
> Change-Id: I74ca28d5d86d70d23e67188f1363b002ba85c6ef
> Reviewed-on: https://skia-review.googlesource.com/c/skia/+/452358
> Commit-Queue: Herb Derby <herb@google.com>
> Auto-Submit: Herb Derby <herb@google.com>
> Reviewed-by: John Stiles <johnstiles@google.com>

Change-Id: I38c5c97bf03c8122abeb8aa228b922cfd9e6ec76
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/452231
Commit-Queue: Herb Derby <herb@google.com>
Reviewed-by: John Stiles <johnstiles@google.com>
2021-09-24 17:14:10 +00:00

84 lines
2.5 KiB
C++

/*
* 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 "bench/Benchmark.h"
#include "include/core/SkCanvas.h"
#include "include/core/SkPaint.h"
#include "include/core/SkPictureRecorder.h"
#include "include/core/SkSurface.h"
#include "include/effects/SkShaderMaskFilter.h"
#include "src/shaders/SkPictureShader.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(SkTileMode::kRepeat, SkTileMode::kRepeat,
SkSamplingOptions());
}
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 recorder.finishRecordingAsPicture()->makeShader(SkTileMode::kRepeat, SkTileMode::kRepeat,
SkFilterMode::kNearest);
}
class ShaderMFBench final : public Benchmark {
public:
using ShaderMaker = sk_sp<SkShader>(*)();
ShaderMFBench(const char* nm, bool opaque, const ShaderMaker maker)
: fMaker{maker}
, fColor{opaque ? 0xff00ff00 : 0x8000ff00} {
fName = SkStringPrintf("shadermaskfilter_%s_%x", nm, SkColorGetA(fColor));
}
protected:
const char* onGetName() override {
return fName.c_str();
}
void onDelayedSetup() override {
fMaskFilter = SkShaderMaskFilter::Make(fMaker());
}
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:
const ShaderMaker fMaker;
const SkColor fColor;
SkString fName;
sk_sp<SkMaskFilter> fMaskFilter;
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); )