From 60869a42a133942f852dd0f1696444c2a5c9ad83 Mon Sep 17 00:00:00 2001 From: scroggo Date: Wed, 1 Apr 2015 12:09:17 -0700 Subject: Add timing SkCodec to nanobench. CodecBench: Add new class for timing using SkCodec. DecodingBench: Include creating a decoder inside the loop. This is to have a better comparison against SkCodec. SkCodec's factory function does not necessarily read the same amount as SkImageDecoder's, so in order to have a meaningful comparison, read the entire stream from the beginning. Also for comparison, create a new SkStream from the SkData each time. Add a debugging check to make sure we have an SkImageDecoder. Add include guards. nanobench.cpp: Decode using SkCodec. When decoding using SkImageDecoder, exclude benches where we decoded to a different color type than requested. SkImageDecoder may decide to decode to a different type, in which case the name is misleading. TODOs: Now that we ignore color types that do not match the desired color type, we should add Index8. This also means calling the more complex version of getPixels so CodecBench can support kIndex8. BUG=skia:3257 Review URL: https://codereview.chromium.org/1044363002 --- bench/CodecBench.cpp | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 bench/CodecBench.cpp (limited to 'bench/CodecBench.cpp') diff --git a/bench/CodecBench.cpp b/bench/CodecBench.cpp new file mode 100644 index 0000000000..e68c5de6fa --- /dev/null +++ b/bench/CodecBench.cpp @@ -0,0 +1,66 @@ +/* + * Copyright 2015 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "CodecBench.h" +#include "SkBitmap.h" +#include "SkCodec.h" +#include "SkImageGenerator.h" +#include "SkOSFile.h" + +CodecBench::CodecBench(SkString baseName, SkData* encoded, SkColorType colorType) + : fColorType(colorType) + , fData(SkRef(encoded)) +{ + // Parse filename and the color type to give the benchmark a useful name + const char* colorName; + switch(colorType) { + case kN32_SkColorType: + colorName = "N32"; + break; + case kRGB_565_SkColorType: + colorName = "565"; + break; + case kAlpha_8_SkColorType: + colorName = "Alpha8"; + break; + default: + colorName = "Unknown"; + } + fName.printf("Codec_%s_%s", baseName.c_str(), colorName); +#ifdef SK_DEBUG + // Ensure that we can create an SkCodec from this data. + SkAutoTDelete codec(SkCodec::NewFromData(fData)); + SkASSERT(codec); +#endif +} + +const char* CodecBench::onGetName() { + return fName.c_str(); +} + +bool CodecBench::isSuitableFor(Backend backend) { + return kNonRendering_Backend == backend; +} + +void CodecBench::onPreDraw() { + SkAutoTDelete codec(SkCodec::NewFromData(fData)); + fBitmap.allocPixels(codec->getInfo().makeColorType(fColorType)); +} + +void CodecBench::onDraw(const int n, SkCanvas* canvas) { + SkAutoTDelete codec; + for (int i = 0; i < n; i++) { + codec.reset(SkCodec::NewFromData(fData)); +#ifdef SK_DEBUG + const SkImageGenerator::Result result = +#endif + // fBitmap.info() was set to use fColorType in onPreDraw. + codec->getPixels(fBitmap.info(), fBitmap.getPixels(), fBitmap.rowBytes()); + SkASSERT(result == SkImageGenerator::kSuccess + || result == SkImageGenerator::kIncompleteInput); + } +} -- cgit v1.2.3