1385fe4d4b62d7d1dd76116dd570df3290a2f487bhalcanary/* 2385fe4d4b62d7d1dd76116dd570df3290a2f487bhalcanary * Copyright 2013 Google Inc. 3385fe4d4b62d7d1dd76116dd570df3290a2f487bhalcanary * 4385fe4d4b62d7d1dd76116dd570df3290a2f487bhalcanary * Use of this source code is governed by a BSD-style license that can be 5385fe4d4b62d7d1dd76116dd570df3290a2f487bhalcanary * found in the LICENSE file. 6385fe4d4b62d7d1dd76116dd570df3290a2f487bhalcanary */ 7f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#include "Benchmark.h" 8a4083c97d48e8a4f88e2797d7363f141e3d42553Cary Clark#include "SkColorData.h" 9c25d2219cb34ffd06a24609b9013c514b58d58ffcommit-bot@chromium.org#include "SkRandom.h" 10c25d2219cb34ffd06a24609b9013c514b58d58ffcommit-bot@chromium.org#include "SkString.h" 11c25d2219cb34ffd06a24609b9013c514b58d58ffcommit-bot@chromium.org 12c25d2219cb34ffd06a24609b9013c514b58d58ffcommit-bot@chromium.orgtemplate <bool kFast, bool kScale> 13f168b86d7fafc5c20c87bebc6fd393cb17e120catfarinaclass FourByteInterpBench : public Benchmark { 14c25d2219cb34ffd06a24609b9013c514b58d58ffcommit-bot@chromium.orgpublic: 15c25d2219cb34ffd06a24609b9013c514b58d58ffcommit-bot@chromium.org FourByteInterpBench() { 16c25d2219cb34ffd06a24609b9013c514b58d58ffcommit-bot@chromium.org fName.set("four_byte_interp"); 17c25d2219cb34ffd06a24609b9013c514b58d58ffcommit-bot@chromium.org fName.append(kFast ? "_fast" : "_slow"); 18c25d2219cb34ffd06a24609b9013c514b58d58ffcommit-bot@chromium.org fName.append(kScale ? "_255" : "_256"); 19c25d2219cb34ffd06a24609b9013c514b58d58ffcommit-bot@chromium.org } 20c25d2219cb34ffd06a24609b9013c514b58d58ffcommit-bot@chromium.org 2136352bf5e38f45a70ee4f4fc132a38048d38206dmtklein bool isSuitableFor(Backend backend) override { 22c25d2219cb34ffd06a24609b9013c514b58d58ffcommit-bot@chromium.org return backend == kNonRendering_Backend; 23c25d2219cb34ffd06a24609b9013c514b58d58ffcommit-bot@chromium.org } 24c25d2219cb34ffd06a24609b9013c514b58d58ffcommit-bot@chromium.org 2536352bf5e38f45a70ee4f4fc132a38048d38206dmtklein const char* onGetName() override { return fName.c_str(); } 26c25d2219cb34ffd06a24609b9013c514b58d58ffcommit-bot@chromium.org 278a6697af95b340aad6dee7e6228048fa305c1e59joshualitt void onDelayedSetup() override { 28cc6db406e482914ab6abbe86aa89f0f0d4ec83c7commit-bot@chromium.org // A handful of random srcs and dsts. 29cc6db406e482914ab6abbe86aa89f0f0d4ec83c7commit-bot@chromium.org SkRandom rand; 30cc6db406e482914ab6abbe86aa89f0f0d4ec83c7commit-bot@chromium.org for (int i = 0; i < kInputs; i++) { 31cc6db406e482914ab6abbe86aa89f0f0d4ec83c7commit-bot@chromium.org fSrcs[i] = SkPreMultiplyColor(rand.nextU()); 32cc6db406e482914ab6abbe86aa89f0f0d4ec83c7commit-bot@chromium.org fDsts[i] = SkPreMultiplyColor(rand.nextU()); 33cc6db406e482914ab6abbe86aa89f0f0d4ec83c7commit-bot@chromium.org } 34cc6db406e482914ab6abbe86aa89f0f0d4ec83c7commit-bot@chromium.org 35cc6db406e482914ab6abbe86aa89f0f0d4ec83c7commit-bot@chromium.org // We'll exhaustively test all scales instead of using random numbers. 36cc6db406e482914ab6abbe86aa89f0f0d4ec83c7commit-bot@chromium.org for (int i = 0; i <= 256; i++) { 37cc6db406e482914ab6abbe86aa89f0f0d4ec83c7commit-bot@chromium.org fScales[i] = i; 38cc6db406e482914ab6abbe86aa89f0f0d4ec83c7commit-bot@chromium.org } 39cc6db406e482914ab6abbe86aa89f0f0d4ec83c7commit-bot@chromium.org if (kScale) fScales[256] = 255; // We'll just do 255 twice if we're limited to [0,255]. 40cc6db406e482914ab6abbe86aa89f0f0d4ec83c7commit-bot@chromium.org } 41cc6db406e482914ab6abbe86aa89f0f0d4ec83c7commit-bot@chromium.org 42a1ebeb25e9acfcd801e089e063311d716b83b8a5mtklein void onDraw(int loops, SkCanvas*) override { 43cc6db406e482914ab6abbe86aa89f0f0d4ec83c7commit-bot@chromium.org // We xor results of FourByteInterp into junk to make sure the function runs. 44c25d2219cb34ffd06a24609b9013c514b58d58ffcommit-bot@chromium.org volatile SkPMColor junk = 0; 45cc6db406e482914ab6abbe86aa89f0f0d4ec83c7commit-bot@chromium.org 46cc6db406e482914ab6abbe86aa89f0f0d4ec83c7commit-bot@chromium.org for (int loop = 0; loop < loops; loop++) { 47cc6db406e482914ab6abbe86aa89f0f0d4ec83c7commit-bot@chromium.org for (int i = 0; i < kInputs; i++) { 48cc6db406e482914ab6abbe86aa89f0f0d4ec83c7commit-bot@chromium.org for (size_t j = 0; j <= 256; j++) { 49cc6db406e482914ab6abbe86aa89f0f0d4ec83c7commit-bot@chromium.org // Note: we really want to load src and dst here and not outside in the i-loop. 50cc6db406e482914ab6abbe86aa89f0f0d4ec83c7commit-bot@chromium.org // If we put the loads there, a clever compiler will do the not-insignificant 51cc6db406e482914ab6abbe86aa89f0f0d4ec83c7commit-bot@chromium.org // work in the FourByteInterps that depends only on src and dst outside this 52cc6db406e482914ab6abbe86aa89f0f0d4ec83c7commit-bot@chromium.org // loop, so we'd only be benchmarking the back half of those functions that also 53cc6db406e482914ab6abbe86aa89f0f0d4ec83c7commit-bot@chromium.org // depends on scale. Even here, these must be volatile arrays to prevent that 54cc6db406e482914ab6abbe86aa89f0f0d4ec83c7commit-bot@chromium.org // clever compiler from hoisting the loads out of the loop on its own. 55cc6db406e482914ab6abbe86aa89f0f0d4ec83c7commit-bot@chromium.org const SkPMColor src = fSrcs[i]; 56cc6db406e482914ab6abbe86aa89f0f0d4ec83c7commit-bot@chromium.org const SkPMColor dst = fDsts[i]; 57cc6db406e482914ab6abbe86aa89f0f0d4ec83c7commit-bot@chromium.org 58cc6db406e482914ab6abbe86aa89f0f0d4ec83c7commit-bot@chromium.org const unsigned scale = fScales[j]; 59cc6db406e482914ab6abbe86aa89f0f0d4ec83c7commit-bot@chromium.org 60cc6db406e482914ab6abbe86aa89f0f0d4ec83c7commit-bot@chromium.org if (kFast && kScale) { 61cc6db406e482914ab6abbe86aa89f0f0d4ec83c7commit-bot@chromium.org junk ^= SkFastFourByteInterp(src, dst, scale); 62cc6db406e482914ab6abbe86aa89f0f0d4ec83c7commit-bot@chromium.org } else if (kFast) { 63cc6db406e482914ab6abbe86aa89f0f0d4ec83c7commit-bot@chromium.org junk ^= SkFastFourByteInterp256(src, dst, scale); 64cc6db406e482914ab6abbe86aa89f0f0d4ec83c7commit-bot@chromium.org } else if (kScale) { 65cc6db406e482914ab6abbe86aa89f0f0d4ec83c7commit-bot@chromium.org junk ^= SkFourByteInterp(src, dst, scale); 66cc6db406e482914ab6abbe86aa89f0f0d4ec83c7commit-bot@chromium.org } else { 67cc6db406e482914ab6abbe86aa89f0f0d4ec83c7commit-bot@chromium.org junk ^= SkFourByteInterp256(src, dst, scale); 68cc6db406e482914ab6abbe86aa89f0f0d4ec83c7commit-bot@chromium.org } 69c25d2219cb34ffd06a24609b9013c514b58d58ffcommit-bot@chromium.org } 70c25d2219cb34ffd06a24609b9013c514b58d58ffcommit-bot@chromium.org } 71c25d2219cb34ffd06a24609b9013c514b58d58ffcommit-bot@chromium.org } 72c25d2219cb34ffd06a24609b9013c514b58d58ffcommit-bot@chromium.org } 73c25d2219cb34ffd06a24609b9013c514b58d58ffcommit-bot@chromium.org 74c25d2219cb34ffd06a24609b9013c514b58d58ffcommit-bot@chromium.orgprivate: 75c25d2219cb34ffd06a24609b9013c514b58d58ffcommit-bot@chromium.org SkString fName; 76cc6db406e482914ab6abbe86aa89f0f0d4ec83c7commit-bot@chromium.org static const int kInputs = 10; // Arbitrary. 77cc6db406e482914ab6abbe86aa89f0f0d4ec83c7commit-bot@chromium.org volatile unsigned fSrcs[kInputs]; 78cc6db406e482914ab6abbe86aa89f0f0d4ec83c7commit-bot@chromium.org volatile unsigned fDsts[kInputs]; 79c25d2219cb34ffd06a24609b9013c514b58d58ffcommit-bot@chromium.org unsigned fScales[257]; // We need space for [0, 256]. 80c25d2219cb34ffd06a24609b9013c514b58d58ffcommit-bot@chromium.org}; 81c25d2219cb34ffd06a24609b9013c514b58d58ffcommit-bot@chromium.org 82c25d2219cb34ffd06a24609b9013c514b58d58ffcommit-bot@chromium.org#define COMMA , 83385fe4d4b62d7d1dd76116dd570df3290a2f487bhalcanaryDEF_BENCH(return (new FourByteInterpBench<true COMMA true>);) 84385fe4d4b62d7d1dd76116dd570df3290a2f487bhalcanaryDEF_BENCH(return (new FourByteInterpBench<true COMMA false>);) 85385fe4d4b62d7d1dd76116dd570df3290a2f487bhalcanaryDEF_BENCH(return (new FourByteInterpBench<false COMMA true>);) 86385fe4d4b62d7d1dd76116dd570df3290a2f487bhalcanaryDEF_BENCH(return (new FourByteInterpBench<false COMMA false>);) 87c25d2219cb34ffd06a24609b9013c514b58d58ffcommit-bot@chromium.org#undef COMMA 88