2013-10-16 13:02:15 +00:00
|
|
|
// Main binary for DM.
|
|
|
|
// For a high-level overview, please see dm/README.
|
|
|
|
|
2014-11-13 16:06:40 +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-11-04 15:21:10 +00:00
|
|
|
#include "DMJsonWriter.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"
|
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
|
2014-10-27 13:24:11 +00:00
|
|
|
#elif defined(SK_BUILD_FOR_MAC) || defined(SK_BUILD_FOR_IOS)
|
|
|
|
# include "SkCGUtils.h"
|
|
|
|
# define RASTERIZE_PDF_PROC SkPDFDocumentToBitmap
|
2014-06-03 20:57:14 +00:00
|
|
|
#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";
|
|
|
|
|
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
|
|
|
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-09-09 14:36:57 +00:00
|
|
|
START("565", CpuGMTask, kRGB_565_SkColorType);
|
|
|
|
START("8888", CpuGMTask, kN32_SkColorType);
|
2014-11-07 15:12:46 +00:00
|
|
|
START("gpu", GpuGMTask, native, gpuAPI, 0, false);
|
|
|
|
START("msaa4", GpuGMTask, native, gpuAPI, 4, false);
|
|
|
|
START("msaa16", GpuGMTask, native, gpuAPI, 16, false);
|
|
|
|
START("nvprmsaa4", GpuGMTask, nvpr, gpuAPI, 4, false);
|
|
|
|
START("nvprmsaa16", GpuGMTask, nvpr, gpuAPI, 16, false);
|
|
|
|
START("gpudft", GpuGMTask, native, gpuAPI, 0, true);
|
|
|
|
START("gpunull", GpuGMTask, null, gpuAPI, 0, false);
|
|
|
|
START("gpudebug", GpuGMTask, debug, gpuAPI, 0, false);
|
2014-08-14 17:36:55 +00:00
|
|
|
#if SK_ANGLE
|
2014-11-07 15:12:46 +00:00
|
|
|
START("angle", GpuGMTask, angle, gpuAPI, 0, false);
|
2014-08-14 17:36:55 +00:00
|
|
|
#endif
|
|
|
|
#if SK_MESA
|
2014-11-07 15:12:46 +00:00
|
|
|
START("mesa", GpuGMTask, mesa, gpuAPI, 0, false);
|
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,
|
2014-09-08 16:12:28 +00:00
|
|
|
DM::Reporter* reporter,
|
|
|
|
DM::TaskRunner* tasks) {
|
2014-07-28 14:21:24 +00:00
|
|
|
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-09-09 14:36:57 +00:00
|
|
|
tasks->add(SkNEW_ARGS(DM::SKPTask, (reporter, tasks, pic, filename)));
|
|
|
|
tasks->add(SkNEW_ARGS(DM::PDFTask, (reporter, tasks, pic, filename, 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-11-13 16:06:40 +00:00
|
|
|
int dm_main();
|
2014-07-22 17:15:34 +00:00
|
|
|
int dm_main() {
|
2014-11-13 16:06:40 +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
|
|
|
|
2014-10-24 17:40:50 +00:00
|
|
|
if (FLAGS_dryRun || FLAGS_veryVerbose) {
|
2014-05-30 17:23:31 +00:00
|
|
|
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();
|
|
|
|
|
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-09-09 14:36:57 +00:00
|
|
|
kick_off_gms(gms, configs, gpuAPI, &reporter, &tasks);
|
|
|
|
kick_off_skps(skps, &reporter, &tasks);
|
2013-10-16 13:02:15 +00:00
|
|
|
tasks.wait();
|
|
|
|
|
2014-11-04 15:21:10 +00:00
|
|
|
DM::JsonWriter::DumpJson();
|
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
|
|
|
|
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
|
|
|
}
|
2014-11-13 16:06:40 +00:00
|
|
|
|
|
|
|
#if !defined(SK_BUILD_FOR_IOS) && !defined(SK_BUILD_FOR_NACL)
|
|
|
|
int main(int argc, char** argv) {
|
|
|
|
SkCommandLineFlags::Parse(argc, argv);
|
|
|
|
return dm_main();
|
|
|
|
}
|
|
|
|
#endif
|