2 * Copyright 2016 Google Inc.
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
10 #include "SkRasterPipeline.h"
12 static const int N = 15;
14 static uint64_t dst[N]; // sRGB or F16
15 static uint32_t src[N]; // sRGB
16 static uint8_t mask[N]; // 8-bit linear
18 // We'll build up a somewhat realistic useful pipeline:
20 // - scale src by 8-bit mask
21 // - load srgb/f16 dst
22 // - src = srcover(dst, src)
23 // - store src back as srgb/f16
26 class SkRasterPipelineBench : public Benchmark {
28 bool isSuitableFor(Backend backend) override { return backend == kNonRendering_Backend; }
29 const char* onGetName() override {
31 case 0: return "SkRasterPipeline_srgb";
32 case 1: return "SkRasterPipeline_f16";
37 void onDraw(int loops, SkCanvas*) override {
38 void* mask_ctx = mask;
42 SkRasterPipeline_<256> p;
43 p.append(SkRasterPipeline::load_8888, &src_ctx);
44 p.append_from_srgb(kUnpremul_SkAlphaType);
45 p.append(SkRasterPipeline::scale_u8, &mask_ctx);
46 p.append(SkRasterPipeline::move_src_dst);
48 p.append(SkRasterPipeline::load_f16, &dst_ctx);
50 p.append(SkRasterPipeline::load_8888, &dst_ctx);
51 p.append_from_srgb(kPremul_SkAlphaType);
53 p.append(SkRasterPipeline::dstover);
55 p.append(SkRasterPipeline::store_f16, &dst_ctx);
57 p.append(SkRasterPipeline::to_srgb);
58 p.append(SkRasterPipeline::store_8888, &dst_ctx);
66 DEF_BENCH( return (new SkRasterPipelineBench< true>); )
67 DEF_BENCH( return (new SkRasterPipelineBench<false>); )
69 class SkRasterPipelineCompileVsRunBench : public Benchmark {
71 explicit SkRasterPipelineCompileVsRunBench(bool compile) : fCompile(compile) {}
72 bool isSuitableFor(Backend backend) override { return backend == kNonRendering_Backend; }
73 const char* onGetName() override {
74 return fCompile ? "SkRasterPipeline_compile"
75 : "SkRasterPipeline_run";
78 void onDraw(int loops, SkCanvas*) override {
82 SkRasterPipeline_<256> p;
83 p.append(SkRasterPipeline::load_8888, &dst_ctx);
84 p.append(SkRasterPipeline::move_src_dst);
85 p.append(SkRasterPipeline::load_8888, &src_ctx);
86 p.append(SkRasterPipeline::srcover);
87 p.append(SkRasterPipeline::store_8888, &dst_ctx);
90 auto fn = p.compile();
103 DEF_BENCH( return (new SkRasterPipelineCompileVsRunBench(true )); )
104 DEF_BENCH( return (new SkRasterPipelineCompileVsRunBench(false)); )
106 static SkColorSpaceTransferFn gamma(float g) {
107 SkColorSpaceTransferFn fn = {0,0,0,0,0,0,0};
113 class SkRasterPipeline_2dot2 : public Benchmark {
115 bool isSuitableFor(Backend backend) override { return backend == kNonRendering_Backend; }
116 const char* onGetName() override {
117 return "SkRasterPipeline_2dot2";
120 void onDraw(int loops, SkCanvas*) override {
121 SkColor4f c = { 1.0f, 1.0f, 1.0f, 1.0f };
123 SkColorSpaceTransferFn from_2dot2 = gamma( 2.2f),
124 to_2dot2 = gamma(1/2.2f);
125 SkRasterPipeline_<256> p;
126 p.append(SkRasterPipeline::constant_color, &c);
127 p.append(SkRasterPipeline::parametric_r, &from_2dot2);
128 p.append(SkRasterPipeline::parametric_g, &from_2dot2);
129 p.append(SkRasterPipeline::parametric_b, &from_2dot2);
130 p.append(SkRasterPipeline::parametric_r, & to_2dot2);
131 p.append(SkRasterPipeline::parametric_g, & to_2dot2);
132 p.append(SkRasterPipeline::parametric_b, & to_2dot2);
134 while (loops --> 0) {
139 DEF_BENCH( return (new SkRasterPipeline_2dot2); )
141 class SkRasterPipelineToSRGB : public Benchmark {
143 bool isSuitableFor(Backend backend) override { return backend == kNonRendering_Backend; }
144 const char* onGetName() override {
145 return "SkRasterPipeline_to_srgb";
148 void onDraw(int loops, SkCanvas*) override {
149 SkRasterPipeline_<256> p;
150 p.append(SkRasterPipeline::to_srgb);
152 while (loops --> 0) {
157 DEF_BENCH( return (new SkRasterPipelineToSRGB); )