| Index: bench/nanobench.cpp
|
| diff --git a/bench/nanobench.cpp b/bench/nanobench.cpp
|
| index 95d017c6da018e1c45dc2a75cbedb9b929b0de8d..0987cb7cfe1575d9c0a83bb3f5f2662a0c8b1fbc 100644
|
| --- a/bench/nanobench.cpp
|
| +++ b/bench/nanobench.cpp
|
| @@ -107,8 +107,6 @@ DEFINE_bool(loopSKP, true, "Loop SKPs like we do for micro benches?");
|
| DEFINE_int32(flushEvery, 10, "Flush --outResultsFile every Nth run.");
|
| DEFINE_bool(resetGpuContext, true, "Reset the GrContext before running each test.");
|
| DEFINE_bool(gpuStats, false, "Print GPU stats after each gpu benchmark?");
|
| -DEFINE_bool(pngBuildTileIndex, false, "If supported, use png buildTileIndex/decodeSubset.");
|
| -DEFINE_bool(jpgBuildTileIndex, false, "If supported, use jpg buildTileIndex/decodeSubset.");
|
|
|
| static double now_ms() { return SkTime::GetNSecs() * 1e-6; }
|
|
|
| @@ -499,35 +497,22 @@ static Target* is_enabled(Benchmark* bench, const Config& config) {
|
|
|
| /*
|
| * We only run our subset benches on files that are supported by BitmapRegionDecoder:
|
| - * i.e. PNG, JPEG, and WEBP. We do *not* test WEBP when using codec, since we do not
|
| - * have a scanline decoder for WEBP, which is necessary for running the subset bench.
|
| - * (Another bench must be used to test WEBP, which decodes subsets natively.)
|
| + * i.e. PNG, JPEG, and WEBP. We do *not* test WEBP, since we do not have a scanline
|
| + * decoder for WEBP, which is necessary for running the subset bench. (Another bench
|
| + * must be used to test WEBP, which decodes subsets natively.)
|
| */
|
| -static bool run_subset_bench(const SkString& path, bool useCodec) {
|
| +static bool run_subset_bench(const SkString& path) {
|
| static const char* const exts[] = {
|
| - "jpg", "jpeg",
|
| - "JPG", "JPEG",
|
| + "jpg", "jpeg", "png",
|
| + "JPG", "JPEG", "PNG",
|
| };
|
|
|
| - if (useCodec || FLAGS_jpgBuildTileIndex) {
|
| - for (uint32_t i = 0; i < SK_ARRAY_COUNT(exts); i++) {
|
| - if (path.endsWith(exts[i])) {
|
| - return true;
|
| - }
|
| + for (uint32_t i = 0; i < SK_ARRAY_COUNT(exts); i++) {
|
| + if (path.endsWith(exts[i])) {
|
| + return true;
|
| }
|
| }
|
|
|
| - // Test png in SkCodec, and optionally on SkImageDecoder. SkImageDecoder is
|
| - // disabled by default because it leaks memory.
|
| - // https://bug.skia.org/4360
|
| - if ((useCodec || FLAGS_pngBuildTileIndex) && (path.endsWith("png") || path.endsWith("PNG"))) {
|
| - return true;
|
| - }
|
| -
|
| - if (!useCodec && (path.endsWith("webp") || path.endsWith("WEBP"))) {
|
| - return true;
|
| - }
|
| -
|
| return false;
|
| }
|
|
|
| @@ -535,49 +520,31 @@ static bool run_subset_bench(const SkString& path, bool useCodec) {
|
| * Returns true if set up for a subset decode succeeds, false otherwise
|
| * If the set-up succeeds, the width and height parameters will be set
|
| */
|
| -static bool valid_subset_bench(const SkString& path, SkColorType colorType, bool useCodec,
|
| +static bool valid_subset_bench(const SkString& path, SkColorType colorType,
|
| int* width, int* height) {
|
| SkAutoTUnref<SkData> encoded(SkData::NewFromFileName(path.c_str()));
|
| SkAutoTDelete<SkMemoryStream> stream(new SkMemoryStream(encoded));
|
|
|
| - // Check that we can create a codec or image decoder.
|
| - if (useCodec) {
|
| - SkAutoTDelete<SkCodec> codec(SkCodec::NewFromStream(stream.detach()));
|
| - if (nullptr == codec) {
|
| - SkDebugf("Could not create codec for %s. Skipping bench.\n", path.c_str());
|
| - return false;
|
| - }
|
| + // Check that we can create a codec.
|
| + SkAutoTDelete<SkCodec> codec(SkCodec::NewFromStream(stream.detach()));
|
| + if (nullptr == codec) {
|
| + SkDebugf("Could not create codec for %s. Skipping bench.\n", path.c_str());
|
| + return false;
|
| + }
|
|
|
| - // These will be initialized by SkCodec if the color type is kIndex8 and
|
| - // unused otherwise.
|
| - SkPMColor colors[256];
|
| - int colorCount;
|
| - const SkImageInfo info = codec->getInfo().makeColorType(colorType);
|
| - if (codec->startScanlineDecode(info, nullptr, colors, &colorCount) != SkCodec::kSuccess)
|
| - {
|
| - SkDebugf("Could not create scanline decoder for %s with color type %s. "
|
| - "Skipping bench.\n", path.c_str(), color_type_to_str(colorType));
|
| - return false;
|
| - }
|
| - *width = info.width();
|
| - *height = info.height();
|
| - } else {
|
| - SkAutoTDelete<SkImageDecoder> decoder(SkImageDecoder::Factory(stream));
|
| - if (nullptr == decoder) {
|
| - SkDebugf("Could not create decoder for %s. Skipping bench.\n", path.c_str());
|
| - return false;
|
| - }
|
| - //FIXME: See https://bug.skia.org/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(), color_type_to_str(colorType));
|
| - return false;
|
| - }
|
| - if (!decoder->buildTileIndex(stream.detach(), width, height)) {
|
| - SkDebugf("Could not build tile index for %s. Skipping bench.\n", path.c_str());
|
| - return false;
|
| - }
|
| + // These will be initialized by SkCodec if the color type is kIndex8 and
|
| + // unused otherwise.
|
| + SkPMColor colors[256];
|
| + int colorCount;
|
| + const SkImageInfo info = codec->getInfo().makeColorType(colorType);
|
| + if (codec->startScanlineDecode(info, nullptr, colors, &colorCount) != SkCodec::kSuccess)
|
| + {
|
| + SkDebugf("Could not create scanline decoder for %s with color type %s. "
|
| + "Skipping bench.\n", path.c_str(), color_type_to_str(colorType));
|
| + return false;
|
| }
|
| + *width = info.width();
|
| + *height = info.height();
|
|
|
| // Check if the image is large enough for a meaningful subset benchmark.
|
| if (*width <= 512 && *height <= 512) {
|
| @@ -603,11 +570,6 @@ static bool valid_brd_bench(SkData* encoded, SkBitmapRegionDecoder::Strategy str
|
| 1, colorType, false)) {
|
| return false;
|
| }
|
| - if (colorType != bitmap.colorType()) {
|
| - // This indicates that conversion to the requested color type is not supported for the
|
| - // particular image.
|
| - return false;
|
| - }
|
|
|
| if (sampleSize * minOutputSize > (uint32_t) brd->width() || sampleSize * minOutputSize >
|
| (uint32_t) brd->height()) {
|
| @@ -648,7 +610,6 @@ public:
|
| , fCurrentBRDImage(0)
|
| , fCurrentColorType(0)
|
| , fCurrentSubsetType(0)
|
| - , fUseCodec(0)
|
| , fCurrentBRDStrategy(0)
|
| , fCurrentBRDSampleSize(0)
|
| , fCurrentAnimSKP(0) {
|
| @@ -898,69 +859,60 @@ public:
|
| }
|
|
|
| // Run the SubsetBenches
|
| - bool useCodecOpts[] = { true, false };
|
| - while (fUseCodec < 2) {
|
| - bool useCodec = useCodecOpts[fUseCodec];
|
| + while (fCurrentSubsetImage < fImages.count()) {
|
| fSourceType = "image";
|
| - fBenchType = useCodec ? "skcodec" : "skimagedecoder";
|
| - while (fCurrentSubsetImage < fImages.count()) {
|
| - const SkString& path = fImages[fCurrentSubsetImage];
|
| - if (!run_subset_bench(path, useCodec)) {
|
| - fCurrentSubsetImage++;
|
| - continue;
|
| - }
|
| - while (fCurrentColorType < fColorTypes.count()) {
|
| - SkColorType colorType = fColorTypes[fCurrentColorType];
|
| - while (fCurrentSubsetType <= kLast_SubsetType) {
|
| - int width = 0;
|
| - int height = 0;
|
| - int currentSubsetType = fCurrentSubsetType++;
|
| - if (valid_subset_bench(path, colorType, useCodec, &width, &height)) {
|
| - switch (currentSubsetType) {
|
| - case kTopLeft_SubsetType:
|
| - return new SubsetSingleBench(path, colorType, width/3,
|
| - height/3, 0, 0, useCodec);
|
| - case kTopRight_SubsetType:
|
| - return new SubsetSingleBench(path, colorType, width/3,
|
| - height/3, 2*width/3, 0, useCodec);
|
| - case kMiddle_SubsetType:
|
| - return new SubsetSingleBench(path, colorType, width/3,
|
| - height/3, width/3, height/3, useCodec);
|
| - case kBottomLeft_SubsetType:
|
| - return new SubsetSingleBench(path, colorType, width/3,
|
| - height/3, 0, 2*height/3, useCodec);
|
| - case kBottomRight_SubsetType:
|
| - return new SubsetSingleBench(path, colorType, width/3,
|
| - height/3, 2*width/3, 2*height/3, useCodec);
|
| - case kTranslate_SubsetType:
|
| - return new SubsetTranslateBench(path, colorType, 512, 512,
|
| - useCodec);
|
| - case kZoom_SubsetType:
|
| - return new SubsetZoomBench(path, colorType, 512, 512,
|
| - useCodec);
|
| - }
|
| - } else {
|
| - break;
|
| + fBenchType = "skcodec";
|
| + const SkString& path = fImages[fCurrentSubsetImage];
|
| + if (!run_subset_bench(path)) {
|
| + fCurrentSubsetImage++;
|
| + continue;
|
| + }
|
| + while (fCurrentColorType < fColorTypes.count()) {
|
| + SkColorType colorType = fColorTypes[fCurrentColorType];
|
| + while (fCurrentSubsetType <= kLast_SubsetType) {
|
| + int width = 0;
|
| + int height = 0;
|
| + int currentSubsetType = fCurrentSubsetType++;
|
| + if (valid_subset_bench(path, colorType, &width, &height)) {
|
| + switch (currentSubsetType) {
|
| + case kTopLeft_SubsetType:
|
| + return new SubsetSingleBench(path, colorType, width/3,
|
| + height/3, 0, 0);
|
| + case kTopRight_SubsetType:
|
| + return new SubsetSingleBench(path, colorType, width/3,
|
| + height/3, 2*width/3, 0);
|
| + case kMiddle_SubsetType:
|
| + return new SubsetSingleBench(path, colorType, width/3,
|
| + height/3, width/3, height/3);
|
| + case kBottomLeft_SubsetType:
|
| + return new SubsetSingleBench(path, colorType, width/3,
|
| + height/3, 0, 2*height/3);
|
| + case kBottomRight_SubsetType:
|
| + return new SubsetSingleBench(path, colorType, width/3,
|
| + height/3, 2*width/3, 2*height/3);
|
| + case kTranslate_SubsetType:
|
| + return new SubsetTranslateBench(path, colorType, 512, 512);
|
| + case kZoom_SubsetType:
|
| + return new SubsetZoomBench(path, colorType, 512, 512);
|
| }
|
| + } else {
|
| + break;
|
| }
|
| - fCurrentSubsetType = 0;
|
| - fCurrentColorType++;
|
| }
|
| - fCurrentColorType = 0;
|
| - fCurrentSubsetImage++;
|
| + fCurrentSubsetType = 0;
|
| + fCurrentColorType++;
|
| }
|
| - fCurrentSubsetImage = 0;
|
| - fUseCodec++;
|
| + fCurrentColorType = 0;
|
| + fCurrentSubsetImage++;
|
| }
|
|
|
| // Run the BRDBenches
|
| // We will benchmark multiple BRD strategies.
|
| static const struct {
|
| SkBitmapRegionDecoder::Strategy fStrategy;
|
| - const char* fName;
|
| + const char* fName;
|
| } strategies[] = {
|
| - { SkBitmapRegionDecoder::kOriginal_Strategy, "BRD" },
|
| - { SkBitmapRegionDecoder::kCanvas_Strategy, "BRD_canvas" },
|
| + { SkBitmapRegionDecoder::kCanvas_Strategy, "BRD_canvas" },
|
| { SkBitmapRegionDecoder::kAndroidCodec_Strategy, "BRD_android_codec" },
|
| };
|
|
|
| @@ -989,24 +941,6 @@ public:
|
| const SkBitmapRegionDecoder::Strategy strategy =
|
| strategies[fCurrentBRDStrategy].fStrategy;
|
|
|
| - if (SkBitmapRegionDecoder::kOriginal_Strategy == strategy) {
|
| - // Disable png and jpeg for SkImageDecoder:
|
| - if (!FLAGS_jpgBuildTileIndex) {
|
| - if (path.endsWith("JPEG") || path.endsWith("JPG") ||
|
| - path.endsWith("jpeg") || path.endsWith("jpg"))
|
| - {
|
| - fCurrentBRDStrategy++;
|
| - continue;
|
| - }
|
| - }
|
| - if (!FLAGS_pngBuildTileIndex) {
|
| - if (path.endsWith("PNG") || path.endsWith("png")) {
|
| - fCurrentBRDStrategy++;
|
| - continue;
|
| - }
|
| - }
|
| - }
|
| -
|
| while (fCurrentColorType < fColorTypes.count()) {
|
| while (fCurrentBRDSampleSize < (int) SK_ARRAY_COUNT(sampleSizes)) {
|
| while (fCurrentSubsetType <= kLastSingle_SubsetType) {
|
| @@ -1133,7 +1067,6 @@ private:
|
| int fCurrentBRDImage;
|
| int fCurrentColorType;
|
| int fCurrentSubsetType;
|
| - int fUseCodec;
|
| int fCurrentBRDStrategy;
|
| int fCurrentBRDSampleSize;
|
| int fCurrentAnimSKP;
|
|
|