kelvinly 2014-06-26 11:26:40 -07:00 коммит произвёл Commit bot
Родитель 93fabf4847
Коммит 4d1a364e39
6 изменённых файлов: 218 добавлений и 67 удалений

Просмотреть файл

@ -8,6 +8,8 @@
*/
#include "ResultsWriter.h"
#include "SkString.h"
#include "SkTArray.h"
Json::Value* SkFindNamedNode(Json::Value* root, const char name[]) {
Json::Value* search_results = NULL;
@ -28,3 +30,30 @@ Json::Value* SkFindNamedNode(Json::Value* root, const char name[]) {
}
}
Json::Value SkMakeBuilderJSON(const SkString &builderName) {
static const int kNumKeys = 6;
static const char* kKeys[kNumKeys] = {
"role", "os", "model", "gpu", "arch", "configuration"};
Json::Value builderData;
if (!builderName.isEmpty()) {
SkTArray<SkString> splitBuilder;
SkStrSplit(builderName.c_str(), "-", &splitBuilder);
SkASSERT(splitBuilder.count() >= kNumKeys);
for (int i = 0; i < kNumKeys && i < splitBuilder.count(); ++i) {
builderData[kKeys[i]] = splitBuilder[i].c_str();
}
builderData["builderName"] = builderName.c_str();
if (kNumKeys < splitBuilder.count()) {
SkString extras;
for (int i = kNumKeys; i < splitBuilder.count(); ++i) {
extras.append(splitBuilder[i]);
if (i != splitBuilder.count() - 1) {
extras.append("-");
}
}
builderData["badParams"] = extras.c_str();
}
}
return builderData;
}

Просмотреть файл

@ -102,6 +102,8 @@ private:
*/
Json::Value* SkFindNamedNode(Json::Value* root, const char name[]);
Json::Value SkMakeBuilderJSON(const SkString &buildername);
class JSONResultsWriter : public ResultsWriter {
public:
explicit JSONResultsWriter(const char filename[])

Просмотреть файл

@ -173,7 +173,7 @@ void PictureBenchmark::run(SkPicture* pict) {
SkAssertResult(longRunningTimerData.appendTimes(longRunningTimer.get()));
}
fWriter->tileConfig(tiledRenderer->getConfigName());
fWriter->logRenderer(tiledRenderer);
fWriter->tileMeta(x, y, xTiles, yTiles);
// TODO(borenet): Turn off per-iteration tile time reporting for now.
@ -236,7 +236,7 @@ void PictureBenchmark::run(SkPicture* pict) {
SkAssertResult(longRunningTimerData.appendTimes(longRunningTimer.get()));
}
fWriter->tileConfig(fRenderer->getConfigName());
fWriter->logRenderer(fRenderer);
if (fPurgeDecodedTex) {
fWriter->addTileFlag(PictureResultsWriter::kPurging);
}

Просмотреть файл

@ -11,6 +11,7 @@
#include "SkCanvas.h"
#include "SkCountdown.h"
#include "SkDrawFilter.h"
#include "SkJSONCPP.h"
#include "SkMath.h"
#include "SkPaint.h"
#include "SkPicture.h"
@ -296,6 +297,60 @@ public:
return config;
}
Json::Value getJSONConfig() {
Json::Value result;
result["mode"] = this->getConfigNameInternal().c_str();
result["scale"] = 1.0f;
if (SK_Scalar1 != fScaleFactor) {
result["scale"] = SkScalarToFloat(fScaleFactor);
}
if (kRTree_BBoxHierarchyType == fBBoxHierarchyType) {
result["bbh"] = "rtree";
} else if (kQuadTree_BBoxHierarchyType == fBBoxHierarchyType) {
result["bbh"] = "quadtree";
} else if (kTileGrid_BBoxHierarchyType == fBBoxHierarchyType) {
SkString tmp("grid_");
tmp.appendS32(fGridInfo.fTileInterval.width());
tmp.append("x");
tmp.appendS32(fGridInfo.fTileInterval.height());
result["bbh"] = tmp.c_str();
}
#if SK_SUPPORT_GPU
SkString tmp;
switch (fDeviceType) {
case kGPU_DeviceType:
if (0 != fSampleCount) {
tmp = "msaa";
tmp.appendS32(fSampleCount);
result["config"] = tmp.c_str();
} else {
result["config"] = "gpu";
}
break;
case kNVPR_DeviceType:
tmp = "nvprmsaa";
tmp.appendS32(fSampleCount);
result["config"] = tmp.c_str();
break;
#if SK_ANGLE
case kAngle_DeviceType:
result["config"] = "angle";
break;
#endif
#if SK_MESA
case kMesa_DeviceType:
result["config"] = "mesa";
break;
#endif
default:
// Assume that no extra info means bitmap.
break;
}
#endif
return result;
}
#if SK_SUPPORT_GPU
bool isUsingGpuDevice() {
switch (fDeviceType) {

Просмотреть файл

@ -10,6 +10,8 @@
#ifndef SkPictureResultsWriter_DEFINED
#define SkPictureResultsWriter_DEFINED
#include "PictureRenderer.h"
#include "BenchLogger.h"
#include "ResultsWriter.h"
#include "SkJSONCPP.h"
@ -29,7 +31,7 @@ public:
virtual ~PictureResultsWriter() {}
virtual void bench(const char name[], int32_t x, int32_t y) = 0;
virtual void tileConfig(SkString configName) = 0;
virtual void logRenderer(sk_tools::PictureRenderer *pr) = 0;
virtual void tileMeta(int x, int y, int tx, int ty) = 0;
virtual void addTileFlag(PictureResultsWriter::TileFlags flag) = 0;
virtual void tileData(
@ -54,22 +56,22 @@ public:
fWriters.push_back(newWriter);
}
virtual ~PictureResultsMultiWriter() {}
virtual void bench(const char name[], int32_t x, int32_t y) {
virtual void bench(const char name[], int32_t x, int32_t y) SK_OVERRIDE {
for(int i=0; i<fWriters.count(); ++i) {
fWriters[i]->bench(name, x, y);
}
}
virtual void tileConfig(SkString configName) {
virtual void logRenderer(sk_tools::PictureRenderer *pr) SK_OVERRIDE {
for(int i=0; i<fWriters.count(); ++i) {
fWriters[i]->tileConfig(configName);
fWriters[i]->logRenderer(pr);
}
}
virtual void tileMeta(int x, int y, int tx, int ty) {
virtual void tileMeta(int x, int y, int tx, int ty) SK_OVERRIDE {
for(int i=0; i<fWriters.count(); ++i) {
fWriters[i]->tileMeta(x, y, tx, ty);
}
}
virtual void addTileFlag(PictureResultsWriter::TileFlags flag) {
virtual void addTileFlag(PictureResultsWriter::TileFlags flag) SK_OVERRIDE {
for(int i=0; i<fWriters.count(); ++i) {
fWriters[i]->addTileFlag(flag);
}
@ -79,13 +81,13 @@ public:
const char format[],
const TimerData::Result result,
uint32_t timerTypes,
int numInnerLoops = 1) {
int numInnerLoops = 1) SK_OVERRIDE {
for(int i=0; i<fWriters.count(); ++i) {
fWriters[i]->tileData(data, format, result, timerTypes,
numInnerLoops);
}
}
virtual void end() {
virtual void end() SK_OVERRIDE {
for(int i=0; i<fWriters.count(); ++i) {
fWriters[i]->end();
}
@ -106,23 +108,23 @@ private:
}
public:
PictureResultsLoggerWriter(BenchLogger* log)
: fLogger(log), currentLine() {}
virtual void bench(const char name[], int32_t x, int32_t y) {
: fLogger(log), fCurrentLine() {}
virtual void bench(const char name[], int32_t x, int32_t y) SK_OVERRIDE {
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 logRenderer(sk_tools::PictureRenderer* renderer) SK_OVERRIDE {
fCurrentLine = renderer->getConfigName();
}
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 tileMeta(int x, int y, int tx, int ty) SK_OVERRIDE {
fCurrentLine.appendf(": tile [%i,%i] out of [%i,%i]", x, y, tx, ty);
}
virtual void addTileFlag(PictureResultsWriter::TileFlags flag) {
virtual void addTileFlag(PictureResultsWriter::TileFlags flag) SK_OVERRIDE {
if(flag == PictureResultsWriter::kPurging) {
currentLine.append(" <withPurging>");
fCurrentLine.append(" <withPurging>");
} else if(flag == PictureResultsWriter::kAvg) {
currentLine.append(" <averaged>");
fCurrentLine.append(" <averaged>");
}
}
virtual void tileData(
@ -130,16 +132,16 @@ public:
const char format[],
const TimerData::Result result,
uint32_t timerTypes,
int numInnerLoops = 1) {
int numInnerLoops = 1) SK_OVERRIDE {
SkString results = data->getResult(format, result,
currentLine.c_str(), timerTypes, numInnerLoops);
fCurrentLine.c_str(), timerTypes, numInnerLoops);
results.append("\n");
this->logProgress(results.c_str());
}
virtual void end() {}
private:
BenchLogger* fLogger;
SkString currentLine;
SkString fCurrentLine;
};
/**
@ -172,61 +174,109 @@ private:
class PictureJSONResultsWriter : public PictureResultsWriter {
public:
PictureJSONResultsWriter(const char filename[])
: fFilename(filename),
fRoot(),
fCurrentBench(NULL),
fCurrentTileSet(NULL),
fCurrentTile(NULL) {}
PictureJSONResultsWriter(const char filename[],
const char builderName[],
int buildNumber,
int timestamp,
const char gitHash[],
int gitNumber)
: fStream(filename) {
fBuilderName = SkString(builderName);
fBuildNumber = buildNumber;
fTimestamp = timestamp;
fGitHash = SkString(gitHash);
fGitNumber = gitNumber;
fBuilderData = SkMakeBuilderJSON(fBuilderName);
}
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 bench(const char name[], int32_t x, int32_t y) SK_OVERRIDE {
fBenchName = SkString(name);
}
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 logRenderer(sk_tools::PictureRenderer* pr) SK_OVERRIDE {
fParams = pr->getJSONConfig();
fConfigString = pr->getConfigName();
}
// Apparently tiles aren't used, so tileMeta is empty
virtual void tileMeta(int x, int y, int tx, int ty) SK_OVERRIDE {}
// Flags aren't used, so addTileFlag is empty
virtual void addTileFlag(PictureResultsWriter::TileFlags flag) SK_OVERRIDE {}
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);
int numInnerLoops = 1) SK_OVERRIDE {
Json::Value newData = data->getJSON(timerTypes, result, numInnerLoops);
Json::Value combinedParams(fBuilderData);
for(Json::ValueIterator iter = fParams.begin(); iter != fParams.end();
iter++) {
combinedParams[iter.key().asString()]= *iter;
}
// For each set of timer data
for(Json::ValueIterator iter = newData.begin(); iter != newData.end();
iter++) {
Json::Value data;
data["buildNumber"] = fBuildNumber;
data["timestamp"] = fTimestamp;
data["gitHash"] = fGitHash.c_str();
data["gitNumber"] = fGitNumber;
data["isTrybot"] = fBuilderName.endsWith("Trybot");
data["params"] = combinedParams;
data["params"]["benchName"] = fBenchName.c_str();
// Not including skpSize because that's deprecated?
data["key"] = this->makeKey(iter.key().asString().c_str()).c_str();
// Get the data
SkTArray<double> times;
Json::Value val = *iter;
for(Json::ValueIterator vals = val.begin(); vals != val.end();
vals++) {
times.push_back((*vals).asDouble());
}
qsort(static_cast<void*>(times.begin()), times.count(),
sizeof(double), PictureJSONResultsWriter::CompareDoubles);
data["value"] = times[static_cast<int>(times.count() * 0.25f)];
data["params"]["measurementType"] = iter.key().asString();
fStream.writeText(Json::FastWriter().write(data).c_str());
}
}
virtual void end() {
SkFILEWStream stream(fFilename.c_str());
stream.writeText(Json::FastWriter().write(fRoot).c_str());
stream.flush();
virtual void end() SK_OVERRIDE {
fStream.flush();
}
private:
SkString fFilename;
Json::Value fRoot;
Json::Value *fCurrentBench;
Json::Value *fCurrentTileSet;
Json::Value *fCurrentTile;
static int CompareDoubles(const void* p1, const void* p2) {
if(*static_cast<const double*>(p1) < *static_cast<const double*>(p2)) {
return -1;
} else if(*static_cast<const double*>(p1) ==
*static_cast<const double*>(p2)) {
return 0;
} else {
return 1;
}
}
SkString makeKey(const char measurementType[]) const {
SkString tmp(fBuilderName);
tmp.append("_");
tmp.append(fBenchName);
tmp.append("_");
tmp.append(fConfigString);
tmp.append("_");
tmp.append(measurementType);
return tmp;
}
SkFILEWStream fStream;
Json::Value fBuilderData;
SkString fBenchName;
Json::Value fParams;
SkString fConfigString;
SkString fBuilderName;
int fBuildNumber;
int fTimestamp;
SkString fGitHash;
int fGitNumber;
};
#endif

Просмотреть файл

@ -57,6 +57,14 @@ DEFINE_bool(trackDeferredCaching, false, "Only meaningful with --deferImageDecod
DEFINE_bool(preprocess, false, "If true, perform device specific preprocessing before timing.");
// Buildbot-specific parameters
DEFINE_string(builderName, "", "Name of the builder this is running on.");
DEFINE_int32(buildNumber, -1, "Build number of the build this test is running on");
DEFINE_int32(timestamp, 0, "Timestamp of the revision of Skia being tested.");
DEFINE_string(gitHash, "", "Commit hash of the revision of Skia being run.");
DEFINE_int32(gitNumber, -1, "Git number of the revision of Skia being run.");
static char const * const gFilterTypes[] = {
"paint",
"point",
@ -421,7 +429,14 @@ int tool_main(int argc, char** argv) {
SkAutoTDelete<PictureJSONResultsWriter> jsonWriter;
if (FLAGS_jsonLog.count() == 1) {
jsonWriter.reset(SkNEW(PictureJSONResultsWriter(FLAGS_jsonLog[0])));
SkASSERT(FLAGS_builderName.count() == 1 && FLAGS_gitHash.count() == 1);
jsonWriter.reset(SkNEW(PictureJSONResultsWriter(
FLAGS_jsonLog[0],
FLAGS_builderName[0],
FLAGS_buildNumber,
FLAGS_timestamp,
FLAGS_gitHash[0],
FLAGS_gitNumber)));
gWriter.add(jsonWriter.get());
}