| Index: tools/PictureResultsWriter.h
|
| diff --git a/tools/PictureResultsWriter.h b/tools/PictureResultsWriter.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..0571e80d056031a00398e4db0e18d7a88d57f15f
|
| --- /dev/null
|
| +++ b/tools/PictureResultsWriter.h
|
| @@ -0,0 +1,232 @@
|
| +/*
|
| + * Copyright 2014 Google Inc.
|
| + *
|
| + * Use of this source code is governed by a BSD-style license that can be
|
| + * found in the LICENSE file.
|
| + *
|
| + * Classes for writing out bench results in various formats.
|
| + */
|
| +#ifndef SkPictureResultsWriter_DEFINED
|
| +#define SkPictureResultsWriter_DEFINED
|
| +
|
| +#include "ResultsWriter.h"
|
| +#include "SkBenchLogger.h"
|
| +#include "SkJSONCPP.h"
|
| +#include "SkStream.h"
|
| +#include "SkString.h"
|
| +#include "SkTArray.h"
|
| +
|
| +/**
|
| + * Base class for writing picture bench results.
|
| + */
|
| +class PictureResultsWriter : SkNoncopyable {
|
| +public:
|
| + enum TileFlags {kPurging, kAvg};
|
| +
|
| + PictureResultsWriter() {}
|
| + virtual ~PictureResultsWriter() {}
|
| +
|
| + virtual void bench(const char name[], int32_t x, int32_t y) = 0;
|
| + virtual void tileConfig(SkString configName) = 0;
|
| + virtual void tileMeta(int x, int y, int tx, int ty) = 0;
|
| + virtual void addTileFlag(PictureResultsWriter::TileFlags flag) = 0;
|
| + virtual void tileData(
|
| + TimerData* data,
|
| + const char format[],
|
| + const TimerData::Result result,
|
| + uint32_t timerTypes,
|
| + int numInnerLoops = 1) = 0;
|
| + virtual void end() = 0;
|
| +};
|
| +
|
| +/**
|
| + * This class allows bench data to be piped into multiple
|
| + * PictureResultWriter classes. It does not own any classes
|
| + * passed to it, so the owner is required to manage any classes
|
| + * passed to PictureResultsMultiWriter */
|
| +class PictureResultsMultiWriter : public PictureResultsWriter {
|
| +public:
|
| + PictureResultsMultiWriter()
|
| + : fWriters() {}
|
| + void add(PictureResultsWriter* newWriter) {
|
| + fWriters.push_back(newWriter);
|
| + }
|
| + virtual ~PictureResultsMultiWriter() {}
|
| + virtual void bench(const char name[], int32_t x, int32_t y) {
|
| + for(int i=0; i<fWriters.count(); ++i) {
|
| + fWriters[i]->bench(name, x, y);
|
| + }
|
| + }
|
| + virtual void tileConfig(SkString configName) {
|
| + for(int i=0; i<fWriters.count(); ++i) {
|
| + fWriters[i]->tileConfig(configName);
|
| + }
|
| + }
|
| + virtual void tileMeta(int x, int y, int tx, int ty) {
|
| + for(int i=0; i<fWriters.count(); ++i) {
|
| + fWriters[i]->tileMeta(x, y, tx, ty);
|
| + }
|
| + }
|
| + virtual void addTileFlag(PictureResultsWriter::TileFlags flag) {
|
| + for(int i=0; i<fWriters.count(); ++i) {
|
| + fWriters[i]->addTileFlag(flag);
|
| + }
|
| + }
|
| + virtual void tileData(
|
| + TimerData* data,
|
| + const char format[],
|
| + const TimerData::Result result,
|
| + uint32_t timerTypes,
|
| + int numInnerLoops = 1) {
|
| + for(int i=0; i<fWriters.count(); ++i) {
|
| + fWriters[i]->tileData(data, format, result, timerTypes,
|
| + numInnerLoops);
|
| + }
|
| + }
|
| + virtual void end() {
|
| + for(int i=0; i<fWriters.count(); ++i) {
|
| + fWriters[i]->end();
|
| + }
|
| + }
|
| +private:
|
| + SkTArray<PictureResultsWriter*> fWriters;
|
| +};
|
| +
|
| +/**
|
| + * Writes to SkBenchLogger to mimic original behavior
|
| + */
|
| +class PictureResultsLoggerWriter : public PictureResultsWriter {
|
| +private:
|
| + void logProgress(const char str[]) {
|
| + if(fLogger != NULL) {
|
| + fLogger->logProgress(str);
|
| + }
|
| + }
|
| +public:
|
| + PictureResultsLoggerWriter(SkBenchLogger* log)
|
| + : fLogger(log), currentLine() {}
|
| + virtual void bench(const char name[], int32_t x, int32_t y) {
|
| + SkString result;
|
| + result.printf("running bench [%i %i] %s ", x, y, name);
|
| + this->logProgress(result.c_str());
|
| + }
|
| + virtual void tileConfig(SkString configName) {
|
| + currentLine = configName;
|
| + }
|
| + virtual void tileMeta(int x, int y, int tx, int ty) {
|
| + currentLine.appendf(": tile [%i,%i] out of [%i,%i]", x, y, tx, ty);
|
| + }
|
| + virtual void addTileFlag(PictureResultsWriter::TileFlags flag) {
|
| + if(flag == PictureResultsWriter::kPurging) {
|
| + currentLine.append(" <withPurging>");
|
| + } else if(flag == PictureResultsWriter::kAvg) {
|
| + currentLine.append(" <averaged>");
|
| + }
|
| + }
|
| + virtual void tileData(
|
| + TimerData* data,
|
| + const char format[],
|
| + const TimerData::Result result,
|
| + uint32_t timerTypes,
|
| + int numInnerLoops = 1) {
|
| + SkString results = data->getResult(format, result,
|
| + currentLine.c_str(), timerTypes, numInnerLoops);
|
| + results.append("\n");
|
| + this->logProgress(results.c_str());
|
| + }
|
| + virtual void end() {}
|
| +private:
|
| + SkBenchLogger* fLogger;
|
| + SkString currentLine;
|
| +};
|
| +
|
| +#ifdef SK_BUILD_JSON_WRITER
|
| +/**
|
| + * This PictureResultsWriter collects data in a JSON node
|
| + *
|
| + * The format is something like
|
| + * {
|
| + * benches: [
|
| + * {
|
| + * name: "Name_of_test"
|
| + * tilesets: [
|
| + * {
|
| + * name: "Name of the configuration"
|
| + * tiles: [
|
| + * {
|
| + * flags: {
|
| + * purging: true //Flags for the current tile
|
| + * // are put here
|
| + * }
|
| + * data: {
|
| + * wsecs: [....] //Actual data ends up here
|
| + * }
|
| + * }
|
| + * ]
|
| + * }
|
| + * ]
|
| + * }
|
| + * ]
|
| + * }*/
|
| +
|
| +class PictureJSONResultsWriter : public PictureResultsWriter {
|
| +public:
|
| + PictureJSONResultsWriter(const char filename[])
|
| + : fFilename(filename),
|
| + fRoot(),
|
| + fCurrentBench(NULL),
|
| + fCurrentTileSet(NULL),
|
| + fCurrentTile(NULL) {}
|
| +
|
| + virtual void bench(const char name[], int32_t x, int32_t y) {
|
| + SkString sk_name(name);
|
| + sk_name.append("_");
|
| + sk_name.appendS32(x);
|
| + sk_name.append("_");
|
| + sk_name.appendS32(y);
|
| + Json::Value* bench_node = SkFindNamedNode(&fRoot["benches"], sk_name.c_str());
|
| + fCurrentBench = &(*bench_node)["tileSets"];
|
| + }
|
| + virtual void tileConfig(SkString configName) {
|
| + SkASSERT(fCurrentBench != NULL);
|
| + fCurrentTileSet = SkFindNamedNode(fCurrentBench, configName.c_str());
|
| + fCurrentTile = &(*fCurrentTileSet)["tiles"][0];
|
| + }
|
| + virtual void tileMeta(int x, int y, int tx, int ty) {
|
| + SkASSERT(fCurrentTileSet != NULL);
|
| + (*fCurrentTileSet)["tx"] = tx;
|
| + (*fCurrentTileSet)["ty"] = ty;
|
| + fCurrentTile = &(*fCurrentTileSet)["tiles"][x+tx*y];
|
| + }
|
| + virtual void addTileFlag(PictureResultsWriter::TileFlags flag) {
|
| + SkASSERT(fCurrentTile != NULL);
|
| + if(flag == PictureResultsWriter::kPurging) {
|
| + (*fCurrentTile)["flags"]["purging"] = true;
|
| + } else if(flag == PictureResultsWriter::kAvg) {
|
| + (*fCurrentTile)["flags"]["averaged"] = true;
|
| + }
|
| + }
|
| + virtual void tileData(
|
| + TimerData* data,
|
| + const char format[],
|
| + const TimerData::Result result,
|
| + uint32_t timerTypes,
|
| + int numInnerLoops = 1) {
|
| + SkASSERT(fCurrentTile != NULL);
|
| + (*fCurrentTile)["data"] = data->getJSON(timerTypes, result, numInnerLoops);
|
| + }
|
| + virtual void end() {
|
| + SkFILEWStream stream(fFilename.c_str());
|
| + stream.writeText(Json::FastWriter().write(fRoot).c_str());
|
| + stream.flush();
|
| + }
|
| +private:
|
| + SkString fFilename;
|
| + Json::Value fRoot;
|
| + Json::Value *fCurrentBench;
|
| + Json::Value *fCurrentTileSet;
|
| + Json::Value *fCurrentTile;
|
| +};
|
| +#endif // SK_BUILD_JSON_WRITER
|
| +
|
| +#endif
|
|
|