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;
|
Consistent naming.
For stages that have {r,g,b,a} and {dr,dg,db,da} versions, name the {r,g,b,a} one "foo" and the {dr,dg,db,da} on "foo_d". The {r,g,b,a} registers are the ones most commonly used and fastest, so they get short ordinary names, and the d-registers are less commonly used and sometimes slower, so they get a suffix.
Some stages naturally opearate on all 8 registers (the xfermodes, accumulate). These names for those look fine and aren't ambiguous.
Also, a bit more re-arrangement in _opts.h.
CQ_INCLUDE_TRYBOTS=skia.primary:Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Release-SKNX_NO_SIMD
Change-Id: Ia20029247642798a60a2566e8a26b84ed101dbd0
Reviewed-on: https://skia-review.googlesource.com/5291
Reviewed-by: Mike Klein <mtklein@chromium.org>
Commit-Queue: Mike Klein <mtklein@chromium.org>
2016-11-28 23:23:23 +00:00
|
|
|
p.append(SkRasterPipeline::load_8888, &src_ctx);
|
2016-12-14 13:38:24 +00:00
|
|
|
p.append_from_srgb(kUnpremul_SkAlphaType);
|
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) {
|
Consistent naming.
For stages that have {r,g,b,a} and {dr,dg,db,da} versions, name the {r,g,b,a} one "foo" and the {dr,dg,db,da} on "foo_d". The {r,g,b,a} registers are the ones most commonly used and fastest, so they get short ordinary names, and the d-registers are less commonly used and sometimes slower, so they get a suffix.
Some stages naturally opearate on all 8 registers (the xfermodes, accumulate). These names for those look fine and aren't ambiguous.
Also, a bit more re-arrangement in _opts.h.
CQ_INCLUDE_TRYBOTS=skia.primary:Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Release-SKNX_NO_SIMD
Change-Id: Ia20029247642798a60a2566e8a26b84ed101dbd0
Reviewed-on: https://skia-review.googlesource.com/5291
Reviewed-by: Mike Klein <mtklein@chromium.org>
Commit-Queue: Mike Klein <mtklein@chromium.org>
2016-11-28 23:23:23 +00:00
|
|
|
p.append(SkRasterPipeline::load_f16_d, &dst_ctx);
|
2016-11-28 18:24:27 +00:00
|
|
|
} else {
|
Consistent naming.
For stages that have {r,g,b,a} and {dr,dg,db,da} versions, name the {r,g,b,a} one "foo" and the {dr,dg,db,da} on "foo_d". The {r,g,b,a} registers are the ones most commonly used and fastest, so they get short ordinary names, and the d-registers are less commonly used and sometimes slower, so they get a suffix.
Some stages naturally opearate on all 8 registers (the xfermodes, accumulate). These names for those look fine and aren't ambiguous.
Also, a bit more re-arrangement in _opts.h.
CQ_INCLUDE_TRYBOTS=skia.primary:Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Release-SKNX_NO_SIMD
Change-Id: Ia20029247642798a60a2566e8a26b84ed101dbd0
Reviewed-on: https://skia-review.googlesource.com/5291
Reviewed-by: Mike Klein <mtklein@chromium.org>
Commit-Queue: Mike Klein <mtklein@chromium.org>
2016-11-28 23:23:23 +00:00
|
|
|
p.append(SkRasterPipeline::load_8888_d, &dst_ctx);
|
2016-12-14 13:38:24 +00:00
|
|
|
p.append_from_srgb_d(kPremul_SkAlphaType);
|
2016-11-28 18:24:27 +00:00
|
|
|
}
|
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>; )
|