2016-07-12 22:01:26 +00:00
|
|
|
/*
|
|
|
|
* Copyright 2016 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"
|
2016-09-29 13:04:15 +00:00
|
|
|
#include "SkOpts.h"
|
2016-07-12 22:01:26 +00:00
|
|
|
#include "SkRasterPipeline.h"
|
|
|
|
|
|
|
|
static const int N = 1023;
|
|
|
|
|
2016-10-03 19:14:04 +00:00
|
|
|
static uint64_t dst[N]; // sRGB or F16
|
|
|
|
static uint32_t src[N]; // sRGB
|
|
|
|
static uint8_t mask[N]; // 8-bit linear
|
2016-07-12 22:01:26 +00:00
|
|
|
|
|
|
|
// We'll build up a somewhat realistic useful pipeline:
|
|
|
|
// - load srgb src
|
|
|
|
// - scale src by 8-bit mask
|
2016-10-03 19:14:04 +00:00
|
|
|
// - load srgb/f16 dst
|
2016-07-12 22:01:26 +00:00
|
|
|
// - src = srcover(dst, src)
|
2016-10-03 19:14:04 +00:00
|
|
|
// - store src back as srgb/f16
|
2016-07-12 22:01:26 +00:00
|
|
|
|
2016-10-03 19:14:04 +00:00
|
|
|
template <bool kF16>
|
2016-07-12 22:01:26 +00:00
|
|
|
class SkRasterPipelineBench : public Benchmark {
|
|
|
|
public:
|
|
|
|
bool isSuitableFor(Backend backend) override { return backend == kNonRendering_Backend; }
|
2016-10-03 19:14:04 +00:00
|
|
|
const char* onGetName() override {
|
|
|
|
return kF16 ? "SkRasterPipeline_f16"
|
|
|
|
: "SkRasterPipeline_srgb";
|
|
|
|
}
|
2016-07-12 22:01:26 +00:00
|
|
|
|
|
|
|
void onDraw(int loops, SkCanvas*) override {
|
2016-10-25 19:43:46 +00:00
|
|
|
void* mask_ctx = mask;
|
|
|
|
void* src_ctx = src;
|
|
|
|
void* dst_ctx = dst;
|
|
|
|
|
2016-10-25 17:31:21 +00:00
|
|
|
SkRasterPipeline p;
|
2016-11-28 18:24:27 +00:00
|
|
|
p.append(SkRasterPipeline::load_s_8888, &src_ctx);
|
|
|
|
p.append(SkRasterPipeline::from_srgb_s);
|
2016-10-25 19:43:46 +00:00
|
|
|
p.append(SkRasterPipeline::scale_u8, &mask_ctx);
|
2016-11-28 18:24:27 +00:00
|
|
|
if (kF16) {
|
|
|
|
p.append(SkRasterPipeline::load_d_f16, &dst_ctx);
|
|
|
|
} else {
|
|
|
|
p.append(SkRasterPipeline::load_d_8888, &dst_ctx);
|
|
|
|
p.append(SkRasterPipeline::from_srgb_d);
|
|
|
|
}
|
2016-10-25 19:43:46 +00:00
|
|
|
p.append(SkRasterPipeline::srcover);
|
2016-11-28 18:24:27 +00:00
|
|
|
if (kF16) {
|
|
|
|
p.append(SkRasterPipeline::store_f16, &dst_ctx);
|
|
|
|
} else {
|
|
|
|
p.append(SkRasterPipeline::to_srgb);
|
|
|
|
p.append(SkRasterPipeline::store_8888, &dst_ctx);
|
|
|
|
}
|
2016-10-25 17:31:21 +00:00
|
|
|
auto compiled = p.compile();
|
|
|
|
|
2016-07-12 22:01:26 +00:00
|
|
|
while (loops --> 0) {
|
Start each pipeline with (x,y) in (dr,dg) registers for the shader.
Image shaders need to do some geometry work before sampling the image colors:
1) determine dst coordinates
2) map back to src coordinates
3) tiling
Feeding (x,y) through as (dr,dg) registers makes step 1) easy, perhaps trivial, while leaving (r,g,b,a) with their usual meanings, "the color", starting with the paint color.
This is easy to tweak into something like (x+0.5, y+0.5, 1) in (dr,dg,db) once this lands. Mostly I just want to get all the uninteresting boilerplate out of the way first.
BUG=skia:
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=4791
CQ_INCLUDE_TRYBOTS=master.client.skia:Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Release-SKNX_NO_SIMD-Trybot
Change-Id: Ia07815d942ded6672dc1df785caf80a508fc8f37
Reviewed-on: https://skia-review.googlesource.com/4791
Reviewed-by: Herb Derby <herb@google.com>
Commit-Queue: Mike Klein <mtklein@chromium.org>
2016-11-15 13:52:04 +00:00
|
|
|
compiled(0,0, N);
|
2016-07-12 22:01:26 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
2016-10-03 19:14:04 +00:00
|
|
|
DEF_BENCH( return new SkRasterPipelineBench<true>; )
|
|
|
|
DEF_BENCH( return new SkRasterPipelineBench<false>; )
|