Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(851)

Unified Diff: bench/nanobench.cpp

Issue 1344993003: Add nanobench tests for BitmapRegionDecoder (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Move buildTileIndex to onPreDraw Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: bench/nanobench.cpp
diff --git a/bench/nanobench.cpp b/bench/nanobench.cpp
index e7019dcb8c97c0713ce653a7b3a35865e6696ef7..91b6c2a5e8ba77f6cae964185f1c6bdca7d9923e 100644
--- a/bench/nanobench.cpp
+++ b/bench/nanobench.cpp
@@ -10,6 +10,7 @@
#include "nanobench.h"
#include "Benchmark.h"
+#include "BitmapRegionDecoderBench.h"
#include "CodecBench.h"
#include "CrashHandler.h"
#include "DecodingBench.h"
@@ -19,16 +20,17 @@
#include "RecordingBench.h"
#include "SKPAnimationBench.h"
#include "SKPBench.h"
-#include "SubsetBenchPriv.h"
#include "SubsetSingleBench.h"
#include "SubsetTranslateBench.h"
#include "SubsetZoomBench.h"
#include "Stats.h"
#include "Timer.h"
+#include "SkBitmapRegionDecoderInterface.h"
#include "SkBBoxHierarchy.h"
#include "SkCanvas.h"
#include "SkCodec.h"
+#include "SkCodecBenchPriv.h"
#include "SkCommonFlags.h"
#include "SkData.h"
#include "SkForceLinking.h"
@@ -525,7 +527,7 @@ static bool valid_subset_bench(const SkString& path, SkColorType colorType, bool
colors, &colorCount) != SkCodec::kSuccess)
{
SkDebugf("Could not create scanline decoder for %s with color type %s. "
- "Skipping bench.\n", path.c_str(), get_color_name(colorType));
+ "Skipping bench.\n", path.c_str(), color_type_to_str(colorType));
return false;
}
*width = info.width();
@@ -539,7 +541,7 @@ static bool valid_subset_bench(const SkString& path, SkColorType colorType, bool
//FIXME: See skbug.com/3921
if (kIndex_8_SkColorType == colorType || kGray_8_SkColorType == colorType) {
SkDebugf("Cannot use image subset decoder for %s with color type %s. "
- "Skipping bench.\n", path.c_str(), get_color_name(colorType));
+ "Skipping bench.\n", path.c_str(), color_type_to_str(colorType));
return false;
}
if (!decoder->buildTileIndex(stream.detach(), width, height)) {
@@ -557,6 +559,33 @@ static bool valid_subset_bench(const SkString& path, SkColorType colorType, bool
return true;
}
+static bool valid_brd_bench(SkData* encoded, SkBitmapRegionDecoderInterface::Strategy strategy,
+ SkColorType colorType, SkIRect* subset) {
+ SkStreamRewindable* stream = new SkMemoryStream(encoded);
+ SkAutoTDelete<SkBitmapRegionDecoderInterface> brd(
+ SkBitmapRegionDecoderInterface::CreateBitmapRegionDecoder(stream, strategy));
+ if (nullptr == brd.get()) {
+ // This is indicates that subset decoding is not supported for a particular image format.
+ return false;
+ }
+
+ SkAutoTDelete<SkBitmap> bitmap(brd->decodeRegion(0, 0, brd->width(), brd->height(), 1,
+ colorType));
+ if (nullptr == bitmap.get() || colorType != bitmap->colorType()) {
+ // This indicates that conversion to the requested color type is not supported for the
+ // particular image.
+ return false;
+ }
+
+ // We can set the subset rect here, since we now know the height of the image. We will choose
+ // the maximum size square subset centered at the center of the image.
+ uint32_t dimension = SkTMin(brd->width(), brd->height());
+ uint32_t left = (brd->width() - dimension) / 2;
+ uint32_t top = (brd->height() - dimension) / 2;
+ *subset = SkIRect::MakeXYWH(left, top, dimension, dimension);
+ return true;
+}
+
static void cleanup_run(Target* target) {
delete target;
#if SK_SUPPORT_GPU
@@ -580,9 +609,12 @@ public:
, fCurrentCodec(0)
, fCurrentImage(0)
, fCurrentSubsetImage(0)
+ , fCurrentBRDImage(0)
, fCurrentColorType(0)
, fCurrentSubsetType(0)
, fUseCodec(0)
+ , fCurrentBRDStrategy(0)
+ , fCurrentBRDSampleSize(0)
, fCurrentAnimSKP(0) {
for (int i = 0; i < FLAGS_skps.count(); i++) {
if (SkStrEndsWith(FLAGS_skps[i], ".skp")) {
@@ -876,6 +908,45 @@ public:
fUseCodec++;
}
+ // Run the BRDBenches
+ // We will benchmark multiple BRD strategies.
+ const SkBitmapRegionDecoderInterface::Strategy strategies[] = {
+ SkBitmapRegionDecoderInterface::kOriginal_Strategy,
+ SkBitmapRegionDecoderInterface::kCanvas_Strategy,
+ };
+ // We will focus on these sample sizes, since they are most often used in real code.
+ const uint32_t sampleSizes[] = { 1, 2, 4, 8 };
+ while (fCurrentBRDImage < fImages.count()) {
+ while (fCurrentBRDStrategy < (int) SK_ARRAY_COUNT(strategies)) {
+ while (fCurrentColorType < fColorTypes.count()) {
+ while (fCurrentBRDSampleSize < (int) SK_ARRAY_COUNT(sampleSizes)) {
+ const SkString& path = fImages[fCurrentBRDImage];
+ SkAutoTUnref<SkData> encoded(SkData::NewFromFileName(path.c_str()));
+ const SkBitmapRegionDecoderInterface::Strategy strategy =
+ strategies[fCurrentBRDStrategy];
+ const SkColorType colorType = fColorTypes[fCurrentColorType];
+ uint32_t sampleSize = sampleSizes[fCurrentBRDSampleSize];
+ fCurrentBRDSampleSize++;
+
+ SkIRect subset;
+ if (valid_brd_bench(encoded.get(), strategy, colorType, &subset)) {
+ return new BitmapRegionDecoderBench(
+ SkOSPath::Basename(path.c_str()).c_str(), encoded.get(),
+ strategy, colorType, sampleSize, subset);
+ } else {
+ break;
+ }
+ }
+ fCurrentBRDSampleSize = 0;
+ fCurrentColorType++;
+ }
+ fCurrentColorType = 0;
+ fCurrentBRDStrategy++;
+ }
+ fCurrentBRDStrategy = 0;
+ fCurrentBRDImage++;
+ }
+
return nullptr;
}
@@ -932,9 +1003,12 @@ private:
int fCurrentCodec;
int fCurrentImage;
int fCurrentSubsetImage;
+ int fCurrentBRDImage;
int fCurrentColorType;
int fCurrentSubsetType;
int fUseCodec;
+ int fCurrentBRDStrategy;
+ int fCurrentBRDSampleSize;
int fCurrentAnimSKP;
};

Powered by Google App Engine
This is Rietveld 408576698