test+bench new swizzle SkOpts

BUG=skia:skia:4767
GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1564233002

Review URL: https://codereview.chromium.org/1564233002
This commit is contained in:
mtklein 2016-01-08 06:32:52 -08:00 committed by Commit bot
parent 06dd0a8222
commit 55c86abedc
2 changed files with 65 additions and 0 deletions

32
bench/SwizzleBench.cpp Normal file
View File

@ -0,0 +1,32 @@
/*
* 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"
#include "SkOpts.h"
class SwizzleBench : public Benchmark {
public:
SwizzleBench(const char* name, SkOpts::Swizzle_8888_8888 fn) : fName(name), fFn(fn) {}
bool isSuitableFor(Backend backend) override { return backend == kNonRendering_Backend; }
const char* onGetName() override { return fName; }
void onDraw(int loops, SkCanvas*) override {
static const int K = 1023; // Arbitrary, but nice to be a non-power-of-two to trip up SIMD.
uint32_t dst[K], src[K];
while (loops --> 0) {
fFn(dst, src, K);
}
}
private:
const char* fName;
SkOpts::Swizzle_8888_8888 fFn;
};
DEF_BENCH(return new SwizzleBench("SkOpts::premul_xxxa", SkOpts::premul_xxxa));
DEF_BENCH(return new SwizzleBench("SkOpts::swaprb_xxxa", SkOpts::swaprb_xxxa));
DEF_BENCH(return new SwizzleBench("SkOpts::premul_swaprb_xxxa", SkOpts::premul_swaprb_xxxa));

View File

@ -7,6 +7,7 @@
#include "SkSwizzler.h" #include "SkSwizzler.h"
#include "Test.h" #include "Test.h"
#include "SkOpts.h"
// These are the values that we will look for to indicate that the fill was successful // These are the values that we will look for to indicate that the fill was successful
static const uint8_t kFillIndex = 0x11; static const uint8_t kFillIndex = 0x11;
@ -124,3 +125,35 @@ DEF_TEST(SwizzlerFill, r) {
} }
} }
} }
DEF_TEST(SwizzleOpts, r) {
uint32_t dst, src;
// forall c, c*255 == c, c*0 == 0
for (int c = 0; c <= 255; c++) {
src = (255<<24) | c;
SkOpts::premul_xxxa(&dst, &src, 1);
REPORTER_ASSERT(r, dst == src);
SkOpts::premul_swaprb_xxxa(&dst, &src, 1);
REPORTER_ASSERT(r, dst == (uint32_t)((255<<24) | (c<<16)));
src = (0<<24) | c;
SkOpts::premul_xxxa(&dst, &src, 1);
REPORTER_ASSERT(r, dst == 0);
SkOpts::premul_swaprb_xxxa(&dst, &src, 1);
REPORTER_ASSERT(r, dst == 0);
}
// check a totally arbitrary color
src = 0xFACEB004;
SkOpts::premul_xxxa(&dst, &src, 1);
REPORTER_ASSERT(r, dst == 0xFACAAD04);
// swap red and blue
SkOpts::swaprb_xxxa(&dst, &src, 1);
REPORTER_ASSERT(r, dst == 0xFA04B0CE);
// all together now
SkOpts::premul_swaprb_xxxa(&dst, &src, 1);
REPORTER_ASSERT(r, dst == 0xFA04ADCA);
}