Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
ColorFilterBench.cpp
Go to the documentation of this file.
1/*
2 * Copyright 2013 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#include "bench/Benchmark.h"
17#include "tools/DecodeUtils.h"
18#include "tools/Resources.h"
19
20#include <functional>
21
22static constexpr char kRuntimeNone_GPU_SRC[] = R"(
23 half4 main(half4 inColor) { return inColor; }
24)";
25
26static constexpr char kRuntimeColorMatrix_GPU_SRC[] = R"(
27 // WTB matrix/vector inputs.
28 uniform half m0 , m1 , m2 , m3 , m4 ,
29 m5 , m6 , m7 , m8 , m9 ,
30 m10, m11, m12, m13, m14,
31 m15, m16, m17, m18, m19;
32 half4 main(half4 inColor) {
33 half4 c = unpremul(inColor);
34
35 half4x4 m = half4x4(m0, m5, m10, m15,
36 m1, m6, m11, m16,
37 m2, m7, m12, m17,
38 m3, m8, m13, m18);
39 c = m * c + half4 (m4, m9, m14, m19);
40
41 c = saturate(c);
42 c.rgb *= c.a;
43 return c;
44 }
45)";
46
47static constexpr float kGrayscaleMatrix[] = {
48 0.2126f, 0.7152f, 0.0722f, 0.0f, 0.0f,
49 0.2126f, 0.7152f, 0.0722f, 0.0f, 0.0f,
50 0.2126f, 0.7152f, 0.0722f, 0.0f, 0.0f,
51 0.0f, 0.0f, 0.0f, 1.0f, 0.0f,
52};
53
54// Just need an interesting filter; nothing too special about color-matrix.
58
65
66/**
67 * Different ways to draw the same thing (a red rect with a color filter)
68 * All of their timings should be about the same
69 * (we allow for slight overhead to figure out that we can undo the presence of the filters)
70 */
72public:
79
80 FilteredRectBench(Type t) : fType(t) {
81 static constexpr const char* kSuffix[] = {
82 "nofilter",
83 "colorfilter",
84 "imagefilter",
85 "runtimecolorfilter",
86 };
87 fName.printf("filteredrect_%s", kSuffix[t]);
88 fPaint.setColor(SK_ColorRED);
89 }
90
91protected:
92 const char* onGetName() override {
93 return fName.c_str();
94 }
95
96 void onDelayedSetup() override {
97 switch (fType) {
98 case kNoFilter_Type:
99 break;
102 break;
105 break;
108 break;
109 }
110 }
111
112 void onDraw(int loops, SkCanvas* canvas) override {
113 const SkRect r = { 0, 0, 256, 256 };
114 for (int i = 0; i < loops; ++i) {
115 canvas->drawRect(r, fPaint);
116 }
117 }
118
119private:
120 SkPaint fPaint;
121 SkString fName;
122 Type fType;
123
124 using INHERITED = Benchmark;
125};
126
131
132namespace {
133
134class ColorFilterBench final : public Benchmark {
135public:
136 using Factory = sk_sp<SkColorFilter>(*)();
137
138 explicit ColorFilterBench(const char* suffix, Factory f)
139 : fFactory(f)
140 , fName(SkStringPrintf("colorfilter_%s", suffix)) {}
141
142private:
143 const char* onGetName() override {
144 return fName.c_str();
145 }
146
147 SkISize onGetSize() override {
148 return { 256, 256 };
149 }
150
151 void onDelayedSetup() override {
152 // Pass the image though a premul canvas so that we "forget" it is opaque.
154 surface->getCanvas()->drawImage(
155 ToolUtils::GetResourceAsImage("images/mandrill_256.png"), 0, 0);
156
157 fImage = surface->makeImageSnapshot();
158 fColorFilter = fFactory();
159 }
160
161 void onDraw(int loops, SkCanvas* canvas) override {
162 SkPaint p;
163 p.setColorFilter(fColorFilter);
164
165 for (int i = 0; i < loops; ++i) {
166 canvas->drawImage(fImage, 0, 0, SkSamplingOptions(), &p);
167 }
168 }
169
170 const Factory fFactory;
171 const SkString fName;
172
173 sk_sp<SkImage> fImage;
174 sk_sp<SkColorFilter> fColorFilter;
175};
176
177static constexpr float kColorMatrix[] = {
178 0.3f, 0.3f, 0.0f, 0.0f, 0.3f,
179 0.0f, 0.3f, 0.3f, 0.0f, 0.3f,
180 0.0f, 0.0f, 0.3f, 0.3f, 0.3f,
181 0.3f, 0.0f, 0.3f, 0.3f, 0.0f,
182};
183
184} // namespace
185
186DEF_BENCH( return new ColorFilterBench("none",
187 []() { return sk_sp<SkColorFilter>(nullptr); }); )
188DEF_BENCH( return new ColorFilterBench("blend_src",
189 []() { return SkColorFilters::Blend(0x80808080, SkBlendMode::kSrc); }); )
190DEF_BENCH( return new ColorFilterBench("blend_srcover",
191 []() { return SkColorFilters::Blend(0x80808080, SkBlendMode::kSrcOver); }); )
192DEF_BENCH( return new ColorFilterBench("linear_to_srgb",
193 []() { return SkColorFilters::LinearToSRGBGamma(); }); )
194DEF_BENCH( return new ColorFilterBench("srgb_to_linear",
195 []() { return SkColorFilters::SRGBToLinearGamma(); }); )
196DEF_BENCH( return new ColorFilterBench("matrix_rgba",
197 []() { return SkColorFilters::Matrix(kColorMatrix); }); )
198DEF_BENCH( return new ColorFilterBench("matrix_hsla",
199 []() { return SkColorFilters::HSLAMatrix(kColorMatrix); }); )
200DEF_BENCH( return new ColorFilterBench("compose_src",
203 }); )
204DEF_BENCH( return new ColorFilterBench("lerp_src",
205 []() { return SkColorFilters::Lerp(0.3f,
208 }); )
209
210DEF_BENCH( return new ColorFilterBench("highcontrast", []() {
212 false, SkHighContrastConfig::InvertStyle::kInvertLightness, 0.2f
213 });
214}); )
215DEF_BENCH( return new ColorFilterBench("overdraw", []() {
217 0x80FF0000, 0x8000FF00, 0x800000FF, 0x80FFFF00, 0x8000FFFF, 0x80FF00FF,
218 };
220}); )
221DEF_BENCH( return new ColorFilterBench("gaussian", []() {
223}); )
224
225#if defined(SK_GANESH)
226DEF_BENCH( return new ColorFilterBench("src_runtime", []() {
227 static sk_sp<SkRuntimeEffect> gEffect =
229 return gEffect->makeColorFilter(SkData::MakeEmpty());
230 });)
231DEF_BENCH( return new ColorFilterBench("matrix_runtime", []() {
232 static sk_sp<SkRuntimeEffect> gEffect =
234 return gEffect->makeColorFilter(SkData::MakeWithCopy(kColorMatrix, sizeof(kColorMatrix)));
235 });)
236#endif
237
238class FilterColorBench final : public Benchmark {
239public:
240 explicit FilterColorBench(const char* name, std::function<sk_sp<SkColorFilter>()> f)
241 : fName(name)
242 , fFilterFn(std::move(f)) {}
243
244 bool isSuitableFor(Backend backend) override { return backend == Backend::kNonRendering; }
245
246private:
247 const char* onGetName() override { return fName; }
248
249 void onDelayedSetup() override {
250 fColorFilter = fFilterFn();
251 }
252
253 void onDraw(int loops, SkCanvas*) override {
254 SkColor4f c = { 1.f, 1.f, 0.f, 1.0f };
255
256 for (int i = 0; i < loops; ++i) {
257 c = fColorFilter->filterColor4f(c, /*srcCS=*/nullptr, /*dstCS=*/nullptr);
258 }
259 }
260
261 const char* fName;
262 std::function<sk_sp<SkColorFilter>()> fFilterFn;
263 sk_sp<SkColorFilter> fColorFilter;
264};
265
266DEF_BENCH( return new FilterColorBench("matrix_filtercolor4f", &make_grayscale); )
267DEF_BENCH( return new FilterColorBench("runtime_filtercolor4f", &make_grayscale_rt); )
#define DEF_BENCH(code)
Definition Benchmark.h:20
static constexpr char kRuntimeNone_GPU_SRC[]
static constexpr char kRuntimeColorMatrix_GPU_SRC[]
static constexpr float kGrayscaleMatrix[]
static sk_sp< SkColorFilter > make_grayscale_rt()
static sk_sp< SkColorFilter > make_grayscale()
const char * backend
const char * fName
@ kSrcOver
r = s + (1-sa)*d
uint32_t SkColor
Definition SkColor.h:37
constexpr SkColor SK_ColorRED
Definition SkColor.h:126
SK_API SkString static SkString SkStringPrintf()
Definition SkString.h:287
virtual SkISize onGetSize()
Definition Benchmark.cpp:59
virtual void onDraw(int loops, SkCanvas *)=0
virtual void onDelayedSetup()
Definition Benchmark.h:101
virtual const char * onGetName()=0
const char * onGetName() override
void onDraw(int loops, SkCanvas *) override
bool isSuitableFor(Backend backend) override
void onDelayedSetup() override
const char * onGetName() override
void onDraw(int loops, SkCanvas *canvas) override
void onDelayedSetup() override
void drawRect(const SkRect &rect, const SkPaint &paint)
void drawImage(const SkImage *image, SkScalar left, SkScalar top)
Definition SkCanvas.h:1528
static sk_sp< SkColorFilter > MakeGaussian()
static sk_sp< SkColorFilter > Compose(const sk_sp< SkColorFilter > &outer, sk_sp< SkColorFilter > inner)
static sk_sp< SkColorFilter > Blend(const SkColor4f &c, sk_sp< SkColorSpace >, SkBlendMode mode)
static sk_sp< SkColorFilter > Matrix(const SkColorMatrix &)
static sk_sp< SkColorFilter > HSLAMatrix(const SkColorMatrix &)
static sk_sp< SkColorFilter > SRGBToLinearGamma()
static sk_sp< SkColorFilter > Lerp(float t, sk_sp< SkColorFilter > dst, sk_sp< SkColorFilter > src)
static sk_sp< SkColorFilter > LinearToSRGBGamma()
static sk_sp< SkData > MakeWithCopy(const void *data, size_t length)
Definition SkData.cpp:111
static sk_sp< SkData > MakeEmpty()
Definition SkData.cpp:94
static sk_sp< SkImageFilter > ColorFilter(sk_sp< SkColorFilter > cf, sk_sp< SkImageFilter > input, const CropRect &cropRect={})
static sk_sp< SkColorFilter > MakeWithSkColors(const SkColor[kNumColors])
static constexpr int kNumColors
void setColor(SkColor color)
Definition SkPaint.cpp:119
void setImageFilter(sk_sp< SkImageFilter > imageFilter)
void setColorFilter(sk_sp< SkColorFilter > colorFilter)
static Result MakeForColorFilter(SkString sksl, const Options &)
void printf(const char format[],...) SK_PRINTF_LIKE(2
Definition SkString.cpp:534
const char * c_str() const
Definition SkString.h:133
VkSurfaceKHR surface
Definition main.cc:49
Dart_NativeFunction function
Definition fuchsia.cc:51
const char * name
Definition fuchsia.cc:50
SKSHAPER_API sk_sp< Factory > Factory()
SK_API sk_sp< SkSurface > Raster(const SkImageInfo &imageInfo, size_t rowBytes, const SkSurfaceProps *surfaceProps)
sk_sp< SkImage > GetResourceAsImage(const char *resource)
Definition DecodeUtils.h:25
Definition ref_ptr.h:256
static sk_sp< SkColorFilter > Make(const SkHighContrastConfig &config)
static SkImageInfo MakeN32Premul(int width, int height)
sk_sp< SkRuntimeEffect > effect