2013-10-16 13:02:15 +00:00
|
|
|
// Main binary for DM.
|
|
|
|
// For a high-level overview, please see dm/README.
|
|
|
|
|
2014-06-19 19:32:29 +00:00
|
|
|
#include "CrashHandler.h"
|
2014-08-07 21:27:03 +00:00
|
|
|
#include "LazyDecodeBitmap.h"
|
2014-07-22 17:15:34 +00:00
|
|
|
#include "SkCommonFlags.h"
|
2013-10-16 13:02:15 +00:00
|
|
|
#include "SkForceLinking.h"
|
|
|
|
#include "SkGraphics.h"
|
Start to rework DM JSON handling.
DM's striking off into its own JSON world. This gets strawman implementations
in place for writing and reading a JSON file mapping test name to hashes.
For what it's worth, I basically want to change _all_ these pieces,
- MD5 is slow and we can replace it with something faster,
- JSON schema needs room to grow more data,
- it'd be nice to hash once instead of twice when reading and writing,
- this code wants lots of refactoring,
but this gives us a starting platform to work on these bits at our leisure.
E.x. file for now:
mtklein@mtklein ~/skia (dm)> cat good/dm.json
{
"3x3bitmaprect_565" : "fc70d985fbfbe70e3a3c9dc626d4f5bc",
"3x3bitmaprect_8888" : "df1591dde35907399734ea19feb76663",
"3x3bitmaprect_gpu" : "df1591dde35907399734ea19feb76663",
"aaclip_565" : "1862798689b838a7ab0dc0652b9ace3a",
"aaclip_8888" : "47bb314329f0ce243f1d83fd583decb7",
"aaclip_gpu" : "75f72412d0ef4815770202d297246e7d",
...
BUG=skia:
R=jcgregorio@google.com, stephana@google.com, mtklein@google.com
Author: mtklein@chromium.org
Review URL: https://codereview.chromium.org/546873002
2014-09-08 15:05:18 +00:00
|
|
|
#include "SkOSFile.h"
|
2014-05-14 17:55:32 +00:00
|
|
|
#include "SkPicture.h"
|
2013-12-02 13:50:38 +00:00
|
|
|
#include "SkString.h"
|
SkThreadPool ~~> SkTaskGroup
SkTaskGroup is like SkThreadPool except the threads stay in
one global pool. Each SkTaskGroup itself is tiny (4 bytes)
and its wait() method applies only to tasks add()ed to that
instance, not the whole thread pool.
This means we don't need to bring up new thread pools when
tests themselves want to use multithreading (e.g. pathops,
quilt). We just create a new SkTaskGroup and wait for that
to complete. This should be more efficient, and allow us
to expand where we use threads to really latency sensitive
places. E.g. we can probably now use these in nanobench
for CPU .skp rendering.
Now that all threads are sharing the same pool, I think we
can remove most of the custom mechanism pathops tests use
to control threading. They'll just ride on the global pool
with all other tests now.
This (temporarily?) removes the GPU multithreading feature
from DM, which we don't use.
On my desktop, DM runs a little faster (57s -> 55s) in
Debug, and a lot faster in Release (36s -> 24s). The bots
show speedups of similar proportions, cutting more than a
minute off the N4/Release and Win7/Debug runtimes.
BUG=skia:
Committed: https://skia.googlesource.com/skia/+/9c7207b5dc71dc5a96a2eb107d401133333d5b6f
R=caryclark@google.com, bsalomon@google.com, bungeman@google.com, mtklein@google.com, reed@google.com
Author: mtklein@chromium.org
Review URL: https://codereview.chromium.org/531653002
2014-09-03 22:34:37 +00:00
|
|
|
#include "SkTaskGroup.h"
|
2014-02-26 16:31:22 +00:00
|
|
|
#include "Test.h"
|
2013-10-16 13:02:15 +00:00
|
|
|
#include "gm.h"
|
2014-07-31 12:58:44 +00:00
|
|
|
#include "sk_tool_utils.h"
|
|
|
|
#include "sk_tool_utils_flags.h"
|
2013-10-16 13:02:15 +00:00
|
|
|
|
2014-02-28 20:31:31 +00:00
|
|
|
#include "DMCpuGMTask.h"
|
|
|
|
#include "DMGpuGMTask.h"
|
2014-03-26 21:26:15 +00:00
|
|
|
#include "DMGpuSupport.h"
|
2014-06-03 20:57:14 +00:00
|
|
|
#include "DMPDFTask.h"
|
2013-10-16 13:02:15 +00:00
|
|
|
#include "DMReporter.h"
|
2014-05-14 17:55:32 +00:00
|
|
|
#include "DMSKPTask.h"
|
2013-10-16 13:02:15 +00:00
|
|
|
#include "DMTask.h"
|
|
|
|
#include "DMTaskRunner.h"
|
2014-02-26 16:31:22 +00:00
|
|
|
#include "DMTestTask.h"
|
Add support for reading a directory of images with --expectations (-r).
DM writes out its images in a hierarchy that's a little different than GM,
so this can't read GM's output. But it can read its own, written with -w.
Example usage:
$ out/Release/dm -w /tmp/baseline
$ out/Release/dm -r /tmp/baseline -w /tmp/new
(and optionally)
$ mkdir /tmp/diff; out/Release/skdiff /tmp/baseline /tmp/new /tmp/diff
GM's IndividualImageExpectationsSource and Expectations are a little too eager
about decoding and hashing the expected images, so I took the opportunity to
add DM::Expectations that mostly replaces skiagm::ExpectationsSource and
skiagm::Expectations in DM. It mainly exists to move the image decoding and
comparison off the main thread, which would otherwise be a major speed
bottleneck.
I tried to use skiagm code where possible. One notable place where I differed
is in this new feature. When -r is a directory of images, DM does no hashing.
It considerably faster to read the expected file into an SkBitmap and do a
byte-for-byte comparison than to hash the two bitmaps and check those.
The example usage above isn't quite working 100% yet. Expectations on some GMs
fail, even with no binary change. I haven't pinned down whether this is due to
- a bug in DM
- flaky GMs
- unthreadsafe GMs
- flaky image decoding
- unthreadsafe image decoding
- something else
but I intend to. Leon, Derek and I have suspected PNG decoding isn't
threadsafe, but are as yet unable to prove it.
I also seem to be able to cause malloc to fail on my laptop if I run too many
configs at once, though I never seem to be using more than ~1G of RAM. Will
track that down too.
BUG=
R=reed@google.com, bsalomon@google.com
Author: mtklein@google.com
Review URL: https://codereview.chromium.org/108963002
git-svn-id: http://skia.googlecode.com/svn/trunk@12596 2bbb7eff-a529-9590-31e7-b0007b416f81
2013-12-10 14:53:16 +00:00
|
|
|
#include "DMWriteTask.h"
|
2013-10-16 13:02:15 +00:00
|
|
|
|
2014-06-03 20:57:14 +00:00
|
|
|
#ifdef SK_BUILD_POPPLER
|
|
|
|
# include "SkPDFRasterizer.h"
|
|
|
|
# define RASTERIZE_PDF_PROC SkPopplerRasterizePDF
|
|
|
|
#else
|
|
|
|
# define RASTERIZE_PDF_PROC NULL
|
|
|
|
#endif
|
|
|
|
|
2014-05-16 18:11:51 +00:00
|
|
|
#include <ctype.h>
|
2013-10-16 13:02:15 +00:00
|
|
|
|
|
|
|
using skiagm::GM;
|
|
|
|
using skiagm::GMRegistry;
|
2014-02-26 16:31:22 +00:00
|
|
|
using skiatest::Test;
|
|
|
|
using skiatest::TestRegistry;
|
2013-10-16 13:02:15 +00:00
|
|
|
|
2014-06-30 13:36:31 +00:00
|
|
|
static const char kGpuAPINameGL[] = "gl";
|
|
|
|
static const char kGpuAPINameGLES[] = "gles";
|
|
|
|
|
Add support for reading a directory of images with --expectations (-r).
DM writes out its images in a hierarchy that's a little different than GM,
so this can't read GM's output. But it can read its own, written with -w.
Example usage:
$ out/Release/dm -w /tmp/baseline
$ out/Release/dm -r /tmp/baseline -w /tmp/new
(and optionally)
$ mkdir /tmp/diff; out/Release/skdiff /tmp/baseline /tmp/new /tmp/diff
GM's IndividualImageExpectationsSource and Expectations are a little too eager
about decoding and hashing the expected images, so I took the opportunity to
add DM::Expectations that mostly replaces skiagm::ExpectationsSource and
skiagm::Expectations in DM. It mainly exists to move the image decoding and
comparison off the main thread, which would otherwise be a major speed
bottleneck.
I tried to use skiagm code where possible. One notable place where I differed
is in this new feature. When -r is a directory of images, DM does no hashing.
It considerably faster to read the expected file into an SkBitmap and do a
byte-for-byte comparison than to hash the two bitmaps and check those.
The example usage above isn't quite working 100% yet. Expectations on some GMs
fail, even with no binary change. I haven't pinned down whether this is due to
- a bug in DM
- flaky GMs
- unthreadsafe GMs
- flaky image decoding
- unthreadsafe image decoding
- something else
but I intend to. Leon, Derek and I have suspected PNG decoding isn't
threadsafe, but are as yet unable to prove it.
I also seem to be able to cause malloc to fail on my laptop if I run too many
configs at once, though I never seem to be using more than ~1G of RAM. Will
track that down too.
BUG=
R=reed@google.com, bsalomon@google.com
Author: mtklein@google.com
Review URL: https://codereview.chromium.org/108963002
git-svn-id: http://skia.googlecode.com/svn/trunk@12596 2bbb7eff-a529-9590-31e7-b0007b416f81
2013-12-10 14:53:16 +00:00
|
|
|
DEFINE_string2(expectations, r, "",
|
|
|
|
"If a directory, compare generated images against images under this path. "
|
2014-05-16 18:11:51 +00:00
|
|
|
"If a file, compare generated images against JSON expectations at this path."
|
|
|
|
);
|
2014-07-22 17:15:34 +00:00
|
|
|
|
2014-02-26 16:31:22 +00:00
|
|
|
DEFINE_bool(gms, true, "Run GMs?");
|
|
|
|
DEFINE_bool(tests, true, "Run tests?");
|
2014-07-31 12:58:44 +00:00
|
|
|
DEFINE_bool(reportUsedChars, false, "Output test font construction data to be pasted into"
|
|
|
|
" create_test_font.cpp.");
|
2013-10-16 13:02:15 +00:00
|
|
|
|
|
|
|
__SK_FORCE_IMAGE_DECODER_LINKING;
|
|
|
|
|
|
|
|
// "FooBar" -> "foobar". Obviously, ASCII only.
|
|
|
|
static SkString lowercase(SkString s) {
|
|
|
|
for (size_t i = 0; i < s.size(); i++) {
|
|
|
|
s[i] = tolower(s[i]);
|
|
|
|
}
|
|
|
|
return s;
|
|
|
|
}
|
|
|
|
|
2014-02-26 23:01:57 +00:00
|
|
|
static const GrContextFactory::GLContextType native = GrContextFactory::kNative_GLContextType;
|
2014-08-14 17:36:55 +00:00
|
|
|
static const GrContextFactory::GLContextType nvpr = GrContextFactory::kNVPR_GLContextType;
|
2014-02-26 23:01:57 +00:00
|
|
|
static const GrContextFactory::GLContextType null = GrContextFactory::kNull_GLContextType;
|
|
|
|
static const GrContextFactory::GLContextType debug = GrContextFactory::kDebug_GLContextType;
|
|
|
|
#if SK_ANGLE
|
2014-08-14 17:36:55 +00:00
|
|
|
static const GrContextFactory::GLContextType angle = GrContextFactory::kANGLE_GLContextType;
|
2014-02-26 23:01:57 +00:00
|
|
|
#endif
|
|
|
|
#if SK_MESA
|
2014-08-14 17:36:55 +00:00
|
|
|
static const GrContextFactory::GLContextType mesa = GrContextFactory::kMESA_GLContextType;
|
2014-02-26 23:01:57 +00:00
|
|
|
#endif
|
|
|
|
|
2014-02-26 16:31:22 +00:00
|
|
|
static void kick_off_gms(const SkTDArray<GMRegistry::Factory>& gms,
|
|
|
|
const SkTArray<SkString>& configs,
|
2014-06-30 13:36:31 +00:00
|
|
|
GrGLStandard gpuAPI,
|
2014-02-26 16:31:22 +00:00
|
|
|
const DM::Expectations& expectations,
|
|
|
|
DM::Reporter* reporter,
|
|
|
|
DM::TaskRunner* tasks) {
|
2014-06-06 16:28:43 +00:00
|
|
|
#define START(name, type, ...) \
|
|
|
|
if (lowercase(configs[j]).equals(name)) { \
|
|
|
|
tasks->add(SkNEW_ARGS(DM::type, (name, reporter, tasks, gms[i], ## __VA_ARGS__))); \
|
2014-02-26 23:01:57 +00:00
|
|
|
}
|
2013-10-16 13:02:15 +00:00
|
|
|
for (int i = 0; i < gms.count(); i++) {
|
2014-02-26 23:01:57 +00:00
|
|
|
for (int j = 0; j < configs.count(); j++) {
|
2014-06-30 13:36:31 +00:00
|
|
|
|
2014-06-06 16:28:43 +00:00
|
|
|
START("565", CpuGMTask, expectations, kRGB_565_SkColorType);
|
|
|
|
START("8888", CpuGMTask, expectations, kN32_SkColorType);
|
2014-06-30 13:36:31 +00:00
|
|
|
START("gpu", GpuGMTask, expectations, native, gpuAPI, 0);
|
|
|
|
START("msaa4", GpuGMTask, expectations, native, gpuAPI, 4);
|
|
|
|
START("msaa16", GpuGMTask, expectations, native, gpuAPI, 16);
|
|
|
|
START("nvprmsaa4", GpuGMTask, expectations, nvpr, gpuAPI, 4);
|
|
|
|
START("nvprmsaa16", GpuGMTask, expectations, nvpr, gpuAPI, 16);
|
|
|
|
START("gpunull", GpuGMTask, expectations, null, gpuAPI, 0);
|
|
|
|
START("gpudebug", GpuGMTask, expectations, debug, gpuAPI, 0);
|
2014-08-14 17:36:55 +00:00
|
|
|
#if SK_ANGLE
|
2014-06-30 13:36:31 +00:00
|
|
|
START("angle", GpuGMTask, expectations, angle, gpuAPI, 0);
|
2014-08-14 17:36:55 +00:00
|
|
|
#endif
|
|
|
|
#if SK_MESA
|
2014-06-30 13:36:31 +00:00
|
|
|
START("mesa", GpuGMTask, expectations, mesa, gpuAPI, 0);
|
2014-08-14 17:36:55 +00:00
|
|
|
#endif
|
2014-06-03 20:57:14 +00:00
|
|
|
START("pdf", PDFTask, RASTERIZE_PDF_PROC);
|
2014-02-26 23:01:57 +00:00
|
|
|
}
|
2013-10-16 13:02:15 +00:00
|
|
|
}
|
2014-02-26 23:01:57 +00:00
|
|
|
#undef START
|
|
|
|
}
|
|
|
|
|
2014-02-26 16:31:22 +00:00
|
|
|
static void kick_off_tests(const SkTDArray<TestRegistry::Factory>& tests,
|
|
|
|
DM::Reporter* reporter,
|
|
|
|
DM::TaskRunner* tasks) {
|
|
|
|
for (int i = 0; i < tests.count(); i++) {
|
2014-02-28 20:31:31 +00:00
|
|
|
SkAutoTDelete<Test> test(tests[i](NULL));
|
|
|
|
if (test->isGPUTest()) {
|
|
|
|
tasks->add(SkNEW_ARGS(DM::GpuTestTask, (reporter, tasks, tests[i])));
|
|
|
|
} else {
|
|
|
|
tasks->add(SkNEW_ARGS(DM::CpuTestTask, (reporter, tasks, tests[i])));
|
|
|
|
}
|
2014-02-26 16:31:22 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-07-28 14:21:24 +00:00
|
|
|
static void find_skps(SkTArray<SkString>* skps) {
|
2014-05-14 17:55:32 +00:00
|
|
|
if (FLAGS_skps.isEmpty()) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
SkOSFile::Iter it(FLAGS_skps[0], ".skp");
|
|
|
|
SkString filename;
|
|
|
|
while (it.next(&filename)) {
|
2014-07-28 14:21:24 +00:00
|
|
|
if (!SkCommandLineFlags::ShouldSkip(FLAGS_match, filename.c_str())) {
|
2014-07-29 02:26:58 +00:00
|
|
|
skps->push_back(SkOSPath::Join(FLAGS_skps[0], filename.c_str()));
|
2014-05-14 17:55:32 +00:00
|
|
|
}
|
2014-07-28 14:21:24 +00:00
|
|
|
}
|
|
|
|
}
|
2014-05-14 17:55:32 +00:00
|
|
|
|
2014-07-28 14:21:24 +00:00
|
|
|
static void kick_off_skps(const SkTArray<SkString>& skps,
|
|
|
|
DM::Reporter* reporter, DM::TaskRunner* tasks) {
|
|
|
|
for (int i = 0; i < skps.count(); ++i) {
|
|
|
|
SkAutoTUnref<SkStream> stream(SkStream::NewFromFile(skps[i].c_str()));
|
2014-05-14 17:55:32 +00:00
|
|
|
if (stream.get() == NULL) {
|
2014-07-28 14:21:24 +00:00
|
|
|
SkDebugf("Could not read %s.\n", skps[i].c_str());
|
2014-05-14 17:55:32 +00:00
|
|
|
exit(1);
|
|
|
|
}
|
2014-08-07 21:27:03 +00:00
|
|
|
SkAutoTUnref<SkPicture> pic(
|
|
|
|
SkPicture::CreateFromStream(stream.get(), &sk_tools::LazyDecodeBitmap));
|
2014-05-14 17:55:32 +00:00
|
|
|
if (pic.get() == NULL) {
|
2014-07-28 14:21:24 +00:00
|
|
|
SkDebugf("Could not read %s as an SkPicture.\n", skps[i].c_str());
|
2014-05-14 17:55:32 +00:00
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
|
2014-07-29 02:26:58 +00:00
|
|
|
SkString filename = SkOSPath::Basename(skps[i].c_str());
|
2014-06-27 19:34:44 +00:00
|
|
|
tasks->add(SkNEW_ARGS(DM::SKPTask, (reporter, tasks, pic, filename)));
|
|
|
|
tasks->add(SkNEW_ARGS(DM::PDFTask, (reporter, tasks, pic, filename,
|
2014-06-06 16:28:43 +00:00
|
|
|
RASTERIZE_PDF_PROC)));
|
2014-05-14 17:55:32 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-05-29 20:14:48 +00:00
|
|
|
static void report_failures(const SkTArray<SkString>& failures) {
|
2013-10-16 13:02:15 +00:00
|
|
|
if (failures.count() == 0) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
SkDebugf("Failures:\n");
|
|
|
|
for (int i = 0; i < failures.count(); i++) {
|
|
|
|
SkDebugf(" %s\n", failures[i].c_str());
|
|
|
|
}
|
2014-05-29 20:14:48 +00:00
|
|
|
SkDebugf("%d failures.\n", failures.count());
|
2013-10-16 13:02:15 +00:00
|
|
|
}
|
|
|
|
|
2014-06-30 13:36:31 +00:00
|
|
|
static GrGLStandard get_gl_standard() {
|
|
|
|
if (FLAGS_gpuAPI.contains(kGpuAPINameGL)) {
|
|
|
|
return kGL_GrGLStandard;
|
|
|
|
}
|
|
|
|
if (FLAGS_gpuAPI.contains(kGpuAPINameGLES)) {
|
|
|
|
return kGLES_GrGLStandard;
|
|
|
|
}
|
|
|
|
return kNone_GrGLStandard;
|
|
|
|
}
|
|
|
|
|
2014-02-26 23:01:57 +00:00
|
|
|
template <typename T, typename Registry>
|
|
|
|
static void append_matching_factories(Registry* head, SkTDArray<typename Registry::Factory>* out) {
|
|
|
|
for (const Registry* reg = head; reg != NULL; reg = reg->next()) {
|
|
|
|
SkAutoTDelete<T> forName(reg->factory()(NULL));
|
|
|
|
if (!SkCommandLineFlags::ShouldSkip(FLAGS_match, forName->getName())) {
|
|
|
|
*out->append() = reg->factory();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-07-22 17:15:34 +00:00
|
|
|
int dm_main();
|
|
|
|
int dm_main() {
|
2014-06-18 18:44:15 +00:00
|
|
|
SetupCrashHandler();
|
2014-05-29 20:14:48 +00:00
|
|
|
SkAutoGraphics ag;
|
SkThreadPool ~~> SkTaskGroup
SkTaskGroup is like SkThreadPool except the threads stay in
one global pool. Each SkTaskGroup itself is tiny (4 bytes)
and its wait() method applies only to tasks add()ed to that
instance, not the whole thread pool.
This means we don't need to bring up new thread pools when
tests themselves want to use multithreading (e.g. pathops,
quilt). We just create a new SkTaskGroup and wait for that
to complete. This should be more efficient, and allow us
to expand where we use threads to really latency sensitive
places. E.g. we can probably now use these in nanobench
for CPU .skp rendering.
Now that all threads are sharing the same pool, I think we
can remove most of the custom mechanism pathops tests use
to control threading. They'll just ride on the global pool
with all other tests now.
This (temporarily?) removes the GPU multithreading feature
from DM, which we don't use.
On my desktop, DM runs a little faster (57s -> 55s) in
Debug, and a lot faster in Release (36s -> 24s). The bots
show speedups of similar proportions, cutting more than a
minute off the N4/Release and Win7/Debug runtimes.
BUG=skia:
Committed: https://skia.googlesource.com/skia/+/9c7207b5dc71dc5a96a2eb107d401133333d5b6f
R=caryclark@google.com, bsalomon@google.com, bungeman@google.com, mtklein@google.com, reed@google.com
Author: mtklein@chromium.org
Review URL: https://codereview.chromium.org/531653002
2014-09-03 22:34:37 +00:00
|
|
|
SkTaskGroup::Enabler enabled(FLAGS_threads);
|
2014-05-30 17:23:31 +00:00
|
|
|
|
|
|
|
if (FLAGS_dryRun) {
|
|
|
|
FLAGS_verbose = true;
|
|
|
|
}
|
2014-02-26 16:31:22 +00:00
|
|
|
#if SK_ENABLE_INST_COUNT
|
|
|
|
gPrintInstCount = FLAGS_leaks;
|
|
|
|
#endif
|
2014-02-25 19:32:15 +00:00
|
|
|
|
2014-02-26 16:31:22 +00:00
|
|
|
SkTArray<SkString> configs;
|
2014-02-26 23:01:57 +00:00
|
|
|
for (int i = 0; i < FLAGS_config.count(); i++) {
|
|
|
|
SkStrSplit(FLAGS_config[i], ", ", &configs);
|
|
|
|
}
|
|
|
|
|
2014-06-30 13:36:31 +00:00
|
|
|
GrGLStandard gpuAPI = get_gl_standard();
|
|
|
|
|
Start to rework DM JSON handling.
DM's striking off into its own JSON world. This gets strawman implementations
in place for writing and reading a JSON file mapping test name to hashes.
For what it's worth, I basically want to change _all_ these pieces,
- MD5 is slow and we can replace it with something faster,
- JSON schema needs room to grow more data,
- it'd be nice to hash once instead of twice when reading and writing,
- this code wants lots of refactoring,
but this gives us a starting platform to work on these bits at our leisure.
E.x. file for now:
mtklein@mtklein ~/skia (dm)> cat good/dm.json
{
"3x3bitmaprect_565" : "fc70d985fbfbe70e3a3c9dc626d4f5bc",
"3x3bitmaprect_8888" : "df1591dde35907399734ea19feb76663",
"3x3bitmaprect_gpu" : "df1591dde35907399734ea19feb76663",
"aaclip_565" : "1862798689b838a7ab0dc0652b9ace3a",
"aaclip_8888" : "47bb314329f0ce243f1d83fd583decb7",
"aaclip_gpu" : "75f72412d0ef4815770202d297246e7d",
...
BUG=skia:
R=jcgregorio@google.com, stephana@google.com, mtklein@google.com
Author: mtklein@chromium.org
Review URL: https://codereview.chromium.org/546873002
2014-09-08 15:05:18 +00:00
|
|
|
SkAutoTDelete<DM::Expectations> expectations(SkNEW(DM::Expectations));
|
|
|
|
if (FLAGS_expectations.count() > 0) {
|
|
|
|
expectations.reset(DM::WriteTask::Expectations::Create(FLAGS_expectations[0]));
|
|
|
|
if (!expectations.get()) {
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-02-25 20:02:09 +00:00
|
|
|
SkTDArray<GMRegistry::Factory> gms;
|
2014-02-26 16:31:22 +00:00
|
|
|
if (FLAGS_gms) {
|
2014-02-26 23:01:57 +00:00
|
|
|
append_matching_factories<GM>(GMRegistry::Head(), &gms);
|
2013-10-16 13:02:15 +00:00
|
|
|
}
|
|
|
|
|
2014-02-26 16:31:22 +00:00
|
|
|
SkTDArray<TestRegistry::Factory> tests;
|
|
|
|
if (FLAGS_tests) {
|
2014-02-26 23:01:57 +00:00
|
|
|
append_matching_factories<Test>(TestRegistry::Head(), &tests);
|
2013-10-16 13:02:15 +00:00
|
|
|
}
|
|
|
|
|
2014-07-28 14:21:24 +00:00
|
|
|
SkTArray<SkString> skps;
|
|
|
|
find_skps(&skps);
|
|
|
|
|
|
|
|
SkDebugf("%d GMs x %d configs, %d tests, %d pictures\n",
|
|
|
|
gms.count(), configs.count(), tests.count(), skps.count());
|
2013-10-16 13:02:15 +00:00
|
|
|
DM::Reporter reporter;
|
SkThreadPool ~~> SkTaskGroup
SkTaskGroup is like SkThreadPool except the threads stay in
one global pool. Each SkTaskGroup itself is tiny (4 bytes)
and its wait() method applies only to tasks add()ed to that
instance, not the whole thread pool.
This means we don't need to bring up new thread pools when
tests themselves want to use multithreading (e.g. pathops,
quilt). We just create a new SkTaskGroup and wait for that
to complete. This should be more efficient, and allow us
to expand where we use threads to really latency sensitive
places. E.g. we can probably now use these in nanobench
for CPU .skp rendering.
Now that all threads are sharing the same pool, I think we
can remove most of the custom mechanism pathops tests use
to control threading. They'll just ride on the global pool
with all other tests now.
This (temporarily?) removes the GPU multithreading feature
from DM, which we don't use.
On my desktop, DM runs a little faster (57s -> 55s) in
Debug, and a lot faster in Release (36s -> 24s). The bots
show speedups of similar proportions, cutting more than a
minute off the N4/Release and Win7/Debug runtimes.
BUG=skia:
Committed: https://skia.googlesource.com/skia/+/9c7207b5dc71dc5a96a2eb107d401133333d5b6f
R=caryclark@google.com, bsalomon@google.com, bungeman@google.com, mtklein@google.com, reed@google.com
Author: mtklein@chromium.org
Review URL: https://codereview.chromium.org/531653002
2014-09-03 22:34:37 +00:00
|
|
|
|
|
|
|
DM::TaskRunner tasks;
|
2014-02-26 16:31:22 +00:00
|
|
|
kick_off_tests(tests, &reporter, &tasks);
|
2014-08-05 14:19:46 +00:00
|
|
|
kick_off_gms(gms, configs, gpuAPI, *expectations, &reporter, &tasks);
|
2014-07-28 14:21:24 +00:00
|
|
|
kick_off_skps(skps, &reporter, &tasks);
|
2013-10-16 13:02:15 +00:00
|
|
|
tasks.wait();
|
|
|
|
|
Start to rework DM JSON handling.
DM's striking off into its own JSON world. This gets strawman implementations
in place for writing and reading a JSON file mapping test name to hashes.
For what it's worth, I basically want to change _all_ these pieces,
- MD5 is slow and we can replace it with something faster,
- JSON schema needs room to grow more data,
- it'd be nice to hash once instead of twice when reading and writing,
- this code wants lots of refactoring,
but this gives us a starting platform to work on these bits at our leisure.
E.x. file for now:
mtklein@mtklein ~/skia (dm)> cat good/dm.json
{
"3x3bitmaprect_565" : "fc70d985fbfbe70e3a3c9dc626d4f5bc",
"3x3bitmaprect_8888" : "df1591dde35907399734ea19feb76663",
"3x3bitmaprect_gpu" : "df1591dde35907399734ea19feb76663",
"aaclip_565" : "1862798689b838a7ab0dc0652b9ace3a",
"aaclip_8888" : "47bb314329f0ce243f1d83fd583decb7",
"aaclip_gpu" : "75f72412d0ef4815770202d297246e7d",
...
BUG=skia:
R=jcgregorio@google.com, stephana@google.com, mtklein@google.com
Author: mtklein@chromium.org
Review URL: https://codereview.chromium.org/546873002
2014-09-08 15:05:18 +00:00
|
|
|
DM::WriteTask::DumpJson();
|
|
|
|
|
2013-10-16 13:02:15 +00:00
|
|
|
SkDebugf("\n");
|
2014-07-31 12:58:44 +00:00
|
|
|
#ifdef SK_DEBUG
|
|
|
|
if (FLAGS_portableFonts && FLAGS_reportUsedChars) {
|
|
|
|
sk_tool_utils::report_used_chars();
|
|
|
|
}
|
|
|
|
#endif
|
2014-08-01 14:46:52 +00:00
|
|
|
|
2014-05-29 20:14:48 +00:00
|
|
|
SkTArray<SkString> failures;
|
|
|
|
reporter.getFailures(&failures);
|
|
|
|
report_failures(failures);
|
|
|
|
return failures.count() > 0;
|
2013-10-16 13:02:15 +00:00
|
|
|
}
|
2013-10-16 18:21:03 +00:00
|
|
|
|
|
|
|
#if !defined(SK_BUILD_FOR_IOS) && !defined(SK_BUILD_FOR_NACL)
|
|
|
|
int main(int argc, char** argv) {
|
2014-07-22 17:15:34 +00:00
|
|
|
SkCommandLineFlags::Parse(argc, argv);
|
|
|
|
return dm_main();
|
2013-10-16 18:21:03 +00:00
|
|
|
}
|
|
|
|
#endif
|