155c86abedc7dcc76f5f04a256e46bb3bb065b2cbmtklein/*
255c86abedc7dcc76f5f04a256e46bb3bb065b2cbmtklein * Copyright 2016 Google Inc.
355c86abedc7dcc76f5f04a256e46bb3bb065b2cbmtklein *
455c86abedc7dcc76f5f04a256e46bb3bb065b2cbmtklein * Use of this source code is governed by a BSD-style license that can be
555c86abedc7dcc76f5f04a256e46bb3bb065b2cbmtklein * found in the LICENSE file.
655c86abedc7dcc76f5f04a256e46bb3bb065b2cbmtklein */
755c86abedc7dcc76f5f04a256e46bb3bb065b2cbmtklein
855c86abedc7dcc76f5f04a256e46bb3bb065b2cbmtklein#include "Benchmark.h"
955c86abedc7dcc76f5f04a256e46bb3bb065b2cbmtklein#include "SkOpts.h"
1055c86abedc7dcc76f5f04a256e46bb3bb065b2cbmtklein
1155c86abedc7dcc76f5f04a256e46bb3bb065b2cbmtkleinclass SwizzleBench : public Benchmark {
1255c86abedc7dcc76f5f04a256e46bb3bb065b2cbmtkleinpublic:
138bf7b79cf9776b4edb3f6810e5ab8c80c49d3480mtklein    SwizzleBench(const char* name, SkOpts::Swizzle_8888 fn) : fName(name), fFn(fn) {}
1455c86abedc7dcc76f5f04a256e46bb3bb065b2cbmtklein
1555c86abedc7dcc76f5f04a256e46bb3bb065b2cbmtklein    bool isSuitableFor(Backend backend) override { return backend == kNonRendering_Backend; }
1655c86abedc7dcc76f5f04a256e46bb3bb065b2cbmtklein    const char* onGetName() override { return fName; }
1755c86abedc7dcc76f5f04a256e46bb3bb065b2cbmtklein    void onDraw(int loops, SkCanvas*) override {
1855c86abedc7dcc76f5f04a256e46bb3bb065b2cbmtklein        static const int K = 1023; // Arbitrary, but nice to be a non-power-of-two to trip up SIMD.
1955c86abedc7dcc76f5f04a256e46bb3bb065b2cbmtklein        uint32_t dst[K], src[K];
2055c86abedc7dcc76f5f04a256e46bb3bb065b2cbmtklein        while (loops --> 0) {
2155c86abedc7dcc76f5f04a256e46bb3bb065b2cbmtklein            fFn(dst, src, K);
2255c86abedc7dcc76f5f04a256e46bb3bb065b2cbmtklein        }
2355c86abedc7dcc76f5f04a256e46bb3bb065b2cbmtklein    }
2455c86abedc7dcc76f5f04a256e46bb3bb065b2cbmtkleinprivate:
2555c86abedc7dcc76f5f04a256e46bb3bb065b2cbmtklein    const char* fName;
268bf7b79cf9776b4edb3f6810e5ab8c80c49d3480mtklein    SkOpts::Swizzle_8888 fFn;
2755c86abedc7dcc76f5f04a256e46bb3bb065b2cbmtklein};
2855c86abedc7dcc76f5f04a256e46bb3bb065b2cbmtklein
2955c86abedc7dcc76f5f04a256e46bb3bb065b2cbmtklein
308bf7b79cf9776b4edb3f6810e5ab8c80c49d3480mtkleinDEF_BENCH(return new SwizzleBench("SkOpts::RGBA_to_rgbA", SkOpts::RGBA_to_rgbA));
318bf7b79cf9776b4edb3f6810e5ab8c80c49d3480mtkleinDEF_BENCH(return new SwizzleBench("SkOpts::RGBA_to_bgrA", SkOpts::RGBA_to_bgrA));
328bf7b79cf9776b4edb3f6810e5ab8c80c49d3480mtkleinDEF_BENCH(return new SwizzleBench("SkOpts::RGBA_to_BGRA", SkOpts::RGBA_to_BGRA));
33f1b8b6ae34e5a1f4b29e423401da39f88f0c117amsarettDEF_BENCH(return new SwizzleBench("SkOpts::RGB_to_RGB1",  SkOpts::RGB_to_RGB1));
34f1b8b6ae34e5a1f4b29e423401da39f88f0c117amsarettDEF_BENCH(return new SwizzleBench("SkOpts::RGB_to_BGR1",  SkOpts::RGB_to_BGR1));
352eff71c9b5f984b58961e5a6b4e66774c4385224msarettDEF_BENCH(return new SwizzleBench("SkOpts::gray_to_RGB1", SkOpts::gray_to_RGB1));
36095742419d0277a4fb0d499a05ff29b7506f1c5emsarettDEF_BENCH(return new SwizzleBench("SkOpts::grayA_to_RGBA", SkOpts::grayA_to_RGBA));
37095742419d0277a4fb0d499a05ff29b7506f1c5emsarettDEF_BENCH(return new SwizzleBench("SkOpts::grayA_to_rgbA", SkOpts::grayA_to_rgbA));
38c5c322d8ecfc05718f9f04360956c4f1f9dc33c1msarettDEF_BENCH(return new SwizzleBench("SkOpts::inverted_CMYK_to_RGB1", SkOpts::inverted_CMYK_to_RGB1));
39c5c322d8ecfc05718f9f04360956c4f1f9dc33c1msarettDEF_BENCH(return new SwizzleBench("SkOpts::inverted_CMYK_to_BGR1", SkOpts::inverted_CMYK_to_BGR1));
40