1d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com// Main binary for DM.
2d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com// For a high-level overview, please see dm/README.
3d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com
4f168b86d7fafc5c20c87bebc6fd393cb17e120catfarina#include "CrashHandler.h"
572ebb9f1dc1ed4d64127b02fed93446b278069d1mtklein#include "LazyDecodeBitmap.h"
617f0b6df7248b9bbdaddacc3a6c9c6efe4ae278ecaryclark#include "SkCommonFlags.h"
7d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com#include "SkForceLinking.h"
8d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com#include "SkGraphics.h"
91d0f1642e8bc0fda200972926e2eaa99744e4d93mtklein#include "SkOSFile.h"
1090b5a2a653b312ff9bcd7102412da2dbeb52368ccommit-bot@chromium.org#include "SkPicture.h"
11d6bab0238655dbab24dfe92bd0b16b464310a8c7rmistry@google.com#include "SkString.h"
12406654be7a930b484159f5bca107d3b11d8a9edemtklein#include "SkTaskGroup.h"
130dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.org#include "Test.h"
14d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com#include "gm.h"
15992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark#include "sk_tool_utils.h"
16992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark#include "sk_tool_utils_flags.h"
17d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com
18ef57b7e65330d5f794a513630517907500f1c1d0commit-bot@chromium.org#include "DMCpuGMTask.h"
19ef57b7e65330d5f794a513630517907500f1c1d0commit-bot@chromium.org#include "DMGpuGMTask.h"
20787227d3560bd8021394b76ada2cb184ecf5c919commit-bot@chromium.org#include "DMGpuSupport.h"
2130bf3e2ffcb78fc76e5a62b2ca67638e0411cba9mtklein#include "DMPDFTask.h"
22d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com#include "DMReporter.h"
2390b5a2a653b312ff9bcd7102412da2dbeb52368ccommit-bot@chromium.org#include "DMSKPTask.h"
24d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com#include "DMTask.h"
25d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com#include "DMTaskRunner.h"
260dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.org#include "DMTestTask.h"
2799589af4e333422639d7e873207dd323fdd6e808commit-bot@chromium.org#include "DMWriteTask.h"
28d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com
2930bf3e2ffcb78fc76e5a62b2ca67638e0411cba9mtklein#ifdef SK_BUILD_POPPLER
3030bf3e2ffcb78fc76e5a62b2ca67638e0411cba9mtklein#  include "SkPDFRasterizer.h"
3130bf3e2ffcb78fc76e5a62b2ca67638e0411cba9mtklein#  define RASTERIZE_PDF_PROC SkPopplerRasterizePDF
3230bf3e2ffcb78fc76e5a62b2ca67638e0411cba9mtklein#else
3330bf3e2ffcb78fc76e5a62b2ca67638e0411cba9mtklein#  define RASTERIZE_PDF_PROC NULL
3430bf3e2ffcb78fc76e5a62b2ca67638e0411cba9mtklein#endif
3530bf3e2ffcb78fc76e5a62b2ca67638e0411cba9mtklein
36120c99993e60e7aedb0838f09d6f1b1d2f576c78commit-bot@chromium.org#include <ctype.h>
37d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com
38d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.comusing skiagm::GM;
39d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.comusing skiagm::GMRegistry;
400dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.orgusing skiatest::Test;
410dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.orgusing skiatest::TestRegistry;
42d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com
4380549fcdd50269d7e069d6db02b395fca128056ckkinnunenstatic const char kGpuAPINameGL[] = "gl";
4480549fcdd50269d7e069d6db02b395fca128056ckkinnunenstatic const char kGpuAPINameGLES[] = "gles";
4580549fcdd50269d7e069d6db02b395fca128056ckkinnunen
460dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.orgDEFINE_bool(gms, true, "Run GMs?");
470dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.orgDEFINE_bool(tests, true, "Run tests?");
48992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary ClarkDEFINE_bool(reportUsedChars, false, "Output test font construction data to be pasted into"
49992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark                                    " create_test_font.cpp.");
50d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com
51d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com__SK_FORCE_IMAGE_DECODER_LINKING;
52d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com
53d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com// "FooBar" -> "foobar".  Obviously, ASCII only.
54d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.comstatic SkString lowercase(SkString s) {
55d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com    for (size_t i = 0; i < s.size(); i++) {
56d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com        s[i] = tolower(s[i]);
57d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com    }
58d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com    return s;
59d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com}
60d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com
6138aeb0fd7a2bdab5e44531d96045dffe25c8e2b0commit-bot@chromium.orgstatic const GrContextFactory::GLContextType native = GrContextFactory::kNative_GLContextType;
6260c7707958a542112add1dcb246cdf9135dda870mtkleinstatic const GrContextFactory::GLContextType nvpr   = GrContextFactory::kNVPR_GLContextType;
6338aeb0fd7a2bdab5e44531d96045dffe25c8e2b0commit-bot@chromium.orgstatic const GrContextFactory::GLContextType null   = GrContextFactory::kNull_GLContextType;
6438aeb0fd7a2bdab5e44531d96045dffe25c8e2b0commit-bot@chromium.orgstatic const GrContextFactory::GLContextType debug  = GrContextFactory::kDebug_GLContextType;
6538aeb0fd7a2bdab5e44531d96045dffe25c8e2b0commit-bot@chromium.org#if SK_ANGLE
6660c7707958a542112add1dcb246cdf9135dda870mtkleinstatic const GrContextFactory::GLContextType angle  = GrContextFactory::kANGLE_GLContextType;
6738aeb0fd7a2bdab5e44531d96045dffe25c8e2b0commit-bot@chromium.org#endif
6838aeb0fd7a2bdab5e44531d96045dffe25c8e2b0commit-bot@chromium.org#if SK_MESA
6960c7707958a542112add1dcb246cdf9135dda870mtkleinstatic const GrContextFactory::GLContextType mesa   = GrContextFactory::kMESA_GLContextType;
7038aeb0fd7a2bdab5e44531d96045dffe25c8e2b0commit-bot@chromium.org#endif
7138aeb0fd7a2bdab5e44531d96045dffe25c8e2b0commit-bot@chromium.org
720dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.orgstatic void kick_off_gms(const SkTDArray<GMRegistry::Factory>& gms,
730dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.org                         const SkTArray<SkString>& configs,
7480549fcdd50269d7e069d6db02b395fca128056ckkinnunen                         GrGLStandard gpuAPI,
750dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.org                         DM::Reporter* reporter,
760dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.org                         DM::TaskRunner* tasks) {
77e4d3e605f74a23d050abad29909af421d8b1cf1amtklein#define START(name, type, ...)                                                              \
78e4d3e605f74a23d050abad29909af421d8b1cf1amtklein    if (lowercase(configs[j]).equals(name)) {                                               \
79e4d3e605f74a23d050abad29909af421d8b1cf1amtklein        tasks->add(SkNEW_ARGS(DM::type, (name, reporter, tasks, gms[i], ## __VA_ARGS__)));  \
8038aeb0fd7a2bdab5e44531d96045dffe25c8e2b0commit-bot@chromium.org    }
81d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com    for (int i = 0; i < gms.count(); i++) {
8238aeb0fd7a2bdab5e44531d96045dffe25c8e2b0commit-bot@chromium.org        for (int j = 0; j < configs.count(); j++) {
8380549fcdd50269d7e069d6db02b395fca128056ckkinnunen
84197ceda92966359962c51923a01dd2b0018b080fmtklein            START("565",        CpuGMTask, kRGB_565_SkColorType);
85197ceda92966359962c51923a01dd2b0018b080fmtklein            START("8888",       CpuGMTask, kN32_SkColorType);
86197ceda92966359962c51923a01dd2b0018b080fmtklein            START("gpu",        GpuGMTask, native, gpuAPI, 0);
87197ceda92966359962c51923a01dd2b0018b080fmtklein            START("msaa4",      GpuGMTask, native, gpuAPI, 4);
88197ceda92966359962c51923a01dd2b0018b080fmtklein            START("msaa16",     GpuGMTask, native, gpuAPI, 16);
89197ceda92966359962c51923a01dd2b0018b080fmtklein            START("nvprmsaa4",  GpuGMTask, nvpr,   gpuAPI, 4);
90197ceda92966359962c51923a01dd2b0018b080fmtklein            START("nvprmsaa16", GpuGMTask, nvpr,   gpuAPI, 16);
91197ceda92966359962c51923a01dd2b0018b080fmtklein            START("gpunull",    GpuGMTask, null,   gpuAPI, 0);
92197ceda92966359962c51923a01dd2b0018b080fmtklein            START("gpudebug",   GpuGMTask, debug,  gpuAPI, 0);
9360c7707958a542112add1dcb246cdf9135dda870mtklein#if SK_ANGLE
94197ceda92966359962c51923a01dd2b0018b080fmtklein            START("angle",      GpuGMTask, angle,  gpuAPI, 0);
9560c7707958a542112add1dcb246cdf9135dda870mtklein#endif
9660c7707958a542112add1dcb246cdf9135dda870mtklein#if SK_MESA
97197ceda92966359962c51923a01dd2b0018b080fmtklein            START("mesa",       GpuGMTask, mesa,   gpuAPI, 0);
9860c7707958a542112add1dcb246cdf9135dda870mtklein#endif
9930bf3e2ffcb78fc76e5a62b2ca67638e0411cba9mtklein            START("pdf",        PDFTask,   RASTERIZE_PDF_PROC);
10038aeb0fd7a2bdab5e44531d96045dffe25c8e2b0commit-bot@chromium.org        }
101d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com    }
10238aeb0fd7a2bdab5e44531d96045dffe25c8e2b0commit-bot@chromium.org#undef START
10338aeb0fd7a2bdab5e44531d96045dffe25c8e2b0commit-bot@chromium.org}
10438aeb0fd7a2bdab5e44531d96045dffe25c8e2b0commit-bot@chromium.org
1050dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.orgstatic void kick_off_tests(const SkTDArray<TestRegistry::Factory>& tests,
1060dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.org                           DM::Reporter* reporter,
1070dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.org                           DM::TaskRunner* tasks) {
1080dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.org    for (int i = 0; i < tests.count(); i++) {
109ef57b7e65330d5f794a513630517907500f1c1d0commit-bot@chromium.org        SkAutoTDelete<Test> test(tests[i](NULL));
110ef57b7e65330d5f794a513630517907500f1c1d0commit-bot@chromium.org        if (test->isGPUTest()) {
111ef57b7e65330d5f794a513630517907500f1c1d0commit-bot@chromium.org            tasks->add(SkNEW_ARGS(DM::GpuTestTask, (reporter, tasks, tests[i])));
112ef57b7e65330d5f794a513630517907500f1c1d0commit-bot@chromium.org        } else {
113ef57b7e65330d5f794a513630517907500f1c1d0commit-bot@chromium.org            tasks->add(SkNEW_ARGS(DM::CpuTestTask, (reporter, tasks, tests[i])));
114ef57b7e65330d5f794a513630517907500f1c1d0commit-bot@chromium.org        }
1150dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.org    }
1160dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.org}
1170dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.org
118a98683bc50a3fe1241396f0ae20e35c7b1133fa9halcanarystatic void find_skps(SkTArray<SkString>* skps) {
11990b5a2a653b312ff9bcd7102412da2dbeb52368ccommit-bot@chromium.org    if (FLAGS_skps.isEmpty()) {
12090b5a2a653b312ff9bcd7102412da2dbeb52368ccommit-bot@chromium.org        return;
12190b5a2a653b312ff9bcd7102412da2dbeb52368ccommit-bot@chromium.org    }
12290b5a2a653b312ff9bcd7102412da2dbeb52368ccommit-bot@chromium.org
12390b5a2a653b312ff9bcd7102412da2dbeb52368ccommit-bot@chromium.org    SkOSFile::Iter it(FLAGS_skps[0], ".skp");
12490b5a2a653b312ff9bcd7102412da2dbeb52368ccommit-bot@chromium.org    SkString filename;
12590b5a2a653b312ff9bcd7102412da2dbeb52368ccommit-bot@chromium.org    while (it.next(&filename)) {
126a98683bc50a3fe1241396f0ae20e35c7b1133fa9halcanary        if (!SkCommandLineFlags::ShouldSkip(FLAGS_match, filename.c_str())) {
127a8e2e1504b9af6ba791637f228debaa23953064atfarina            skps->push_back(SkOSPath::Join(FLAGS_skps[0], filename.c_str()));
12890b5a2a653b312ff9bcd7102412da2dbeb52368ccommit-bot@chromium.org        }
129a98683bc50a3fe1241396f0ae20e35c7b1133fa9halcanary    }
130a98683bc50a3fe1241396f0ae20e35c7b1133fa9halcanary}
13190b5a2a653b312ff9bcd7102412da2dbeb52368ccommit-bot@chromium.org
132a98683bc50a3fe1241396f0ae20e35c7b1133fa9halcanarystatic void kick_off_skps(const SkTArray<SkString>& skps,
13323c94f05cad79f6f8d303c1b4ffb6d0b91671e83mtklein                          DM::Reporter* reporter,
13423c94f05cad79f6f8d303c1b4ffb6d0b91671e83mtklein                          DM::TaskRunner* tasks) {
135a98683bc50a3fe1241396f0ae20e35c7b1133fa9halcanary    for (int i = 0; i < skps.count(); ++i) {
136a98683bc50a3fe1241396f0ae20e35c7b1133fa9halcanary        SkAutoTUnref<SkStream> stream(SkStream::NewFromFile(skps[i].c_str()));
13790b5a2a653b312ff9bcd7102412da2dbeb52368ccommit-bot@chromium.org        if (stream.get() == NULL) {
138a98683bc50a3fe1241396f0ae20e35c7b1133fa9halcanary            SkDebugf("Could not read %s.\n", skps[i].c_str());
13990b5a2a653b312ff9bcd7102412da2dbeb52368ccommit-bot@chromium.org            exit(1);
14090b5a2a653b312ff9bcd7102412da2dbeb52368ccommit-bot@chromium.org        }
14172ebb9f1dc1ed4d64127b02fed93446b278069d1mtklein        SkAutoTUnref<SkPicture> pic(
14272ebb9f1dc1ed4d64127b02fed93446b278069d1mtklein                SkPicture::CreateFromStream(stream.get(), &sk_tools::LazyDecodeBitmap));
14390b5a2a653b312ff9bcd7102412da2dbeb52368ccommit-bot@chromium.org        if (pic.get() == NULL) {
144a98683bc50a3fe1241396f0ae20e35c7b1133fa9halcanary            SkDebugf("Could not read %s as an SkPicture.\n", skps[i].c_str());
14590b5a2a653b312ff9bcd7102412da2dbeb52368ccommit-bot@chromium.org            exit(1);
14690b5a2a653b312ff9bcd7102412da2dbeb52368ccommit-bot@chromium.org        }
14790b5a2a653b312ff9bcd7102412da2dbeb52368ccommit-bot@chromium.org
148a8e2e1504b9af6ba791637f228debaa23953064atfarina        SkString filename = SkOSPath::Basename(skps[i].c_str());
149197ceda92966359962c51923a01dd2b0018b080fmtklein        tasks->add(SkNEW_ARGS(DM::SKPTask, (reporter, tasks, pic, filename)));
150197ceda92966359962c51923a01dd2b0018b080fmtklein        tasks->add(SkNEW_ARGS(DM::PDFTask, (reporter, tasks, pic, filename, RASTERIZE_PDF_PROC)));
15190b5a2a653b312ff9bcd7102412da2dbeb52368ccommit-bot@chromium.org    }
15290b5a2a653b312ff9bcd7102412da2dbeb52368ccommit-bot@chromium.org}
15390b5a2a653b312ff9bcd7102412da2dbeb52368ccommit-bot@chromium.org
15439e8d93337c7e37d2b09dc710a05a9beefef5c2ccommit-bot@chromium.orgstatic void report_failures(const SkTArray<SkString>& failures) {
155d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com    if (failures.count() == 0) {
156d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com        return;
157d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com    }
158d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com
159d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com    SkDebugf("Failures:\n");
160d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com    for (int i = 0; i < failures.count(); i++) {
161d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com        SkDebugf("  %s\n", failures[i].c_str());
162d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com    }
16339e8d93337c7e37d2b09dc710a05a9beefef5c2ccommit-bot@chromium.org    SkDebugf("%d failures.\n", failures.count());
164d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com}
165d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com
16680549fcdd50269d7e069d6db02b395fca128056ckkinnunenstatic GrGLStandard get_gl_standard() {
16780549fcdd50269d7e069d6db02b395fca128056ckkinnunen  if (FLAGS_gpuAPI.contains(kGpuAPINameGL)) {
16880549fcdd50269d7e069d6db02b395fca128056ckkinnunen      return kGL_GrGLStandard;
16980549fcdd50269d7e069d6db02b395fca128056ckkinnunen  }
17080549fcdd50269d7e069d6db02b395fca128056ckkinnunen  if (FLAGS_gpuAPI.contains(kGpuAPINameGLES)) {
17180549fcdd50269d7e069d6db02b395fca128056ckkinnunen      return kGLES_GrGLStandard;
17280549fcdd50269d7e069d6db02b395fca128056ckkinnunen  }
17380549fcdd50269d7e069d6db02b395fca128056ckkinnunen  return kNone_GrGLStandard;
17480549fcdd50269d7e069d6db02b395fca128056ckkinnunen}
17580549fcdd50269d7e069d6db02b395fca128056ckkinnunen
17638aeb0fd7a2bdab5e44531d96045dffe25c8e2b0commit-bot@chromium.orgtemplate <typename T, typename Registry>
17738aeb0fd7a2bdab5e44531d96045dffe25c8e2b0commit-bot@chromium.orgstatic void append_matching_factories(Registry* head, SkTDArray<typename Registry::Factory>* out) {
17838aeb0fd7a2bdab5e44531d96045dffe25c8e2b0commit-bot@chromium.org    for (const Registry* reg = head; reg != NULL; reg = reg->next()) {
17938aeb0fd7a2bdab5e44531d96045dffe25c8e2b0commit-bot@chromium.org        SkAutoTDelete<T> forName(reg->factory()(NULL));
18038aeb0fd7a2bdab5e44531d96045dffe25c8e2b0commit-bot@chromium.org        if (!SkCommandLineFlags::ShouldSkip(FLAGS_match, forName->getName())) {
18138aeb0fd7a2bdab5e44531d96045dffe25c8e2b0commit-bot@chromium.org            *out->append() = reg->factory();
18238aeb0fd7a2bdab5e44531d96045dffe25c8e2b0commit-bot@chromium.org        }
18338aeb0fd7a2bdab5e44531d96045dffe25c8e2b0commit-bot@chromium.org    }
18438aeb0fd7a2bdab5e44531d96045dffe25c8e2b0commit-bot@chromium.org}
18538aeb0fd7a2bdab5e44531d96045dffe25c8e2b0commit-bot@chromium.org
18617f0b6df7248b9bbdaddacc3a6c9c6efe4ae278ecaryclarkint dm_main();
18717f0b6df7248b9bbdaddacc3a6c9c6efe4ae278ecaryclarkint dm_main() {
18830e6e2af14e84216b1c113fd7500d0822bc81daamtklein    SetupCrashHandler();
18939e8d93337c7e37d2b09dc710a05a9beefef5c2ccommit-bot@chromium.org    SkAutoGraphics ag;
190406654be7a930b484159f5bca107d3b11d8a9edemtklein    SkTaskGroup::Enabler enabled(FLAGS_threads);
191a65e2fdc9af4b0b0415888a560d6ebd779bc3148commit-bot@chromium.org
192a65e2fdc9af4b0b0415888a560d6ebd779bc3148commit-bot@chromium.org    if (FLAGS_dryRun) {
193a65e2fdc9af4b0b0415888a560d6ebd779bc3148commit-bot@chromium.org        FLAGS_verbose = true;
194a65e2fdc9af4b0b0415888a560d6ebd779bc3148commit-bot@chromium.org    }
1950dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.org#if SK_ENABLE_INST_COUNT
1960dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.org    gPrintInstCount = FLAGS_leaks;
1970dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.org#endif
1986bd250a2a340348434b7b16bd4e4b5da0f598e3ecommit-bot@chromium.org
1990dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.org    SkTArray<SkString> configs;
20038aeb0fd7a2bdab5e44531d96045dffe25c8e2b0commit-bot@chromium.org    for (int i = 0; i < FLAGS_config.count(); i++) {
20138aeb0fd7a2bdab5e44531d96045dffe25c8e2b0commit-bot@chromium.org        SkStrSplit(FLAGS_config[i], ", ", &configs);
20238aeb0fd7a2bdab5e44531d96045dffe25c8e2b0commit-bot@chromium.org    }
20338aeb0fd7a2bdab5e44531d96045dffe25c8e2b0commit-bot@chromium.org
20480549fcdd50269d7e069d6db02b395fca128056ckkinnunen    GrGLStandard gpuAPI = get_gl_standard();
20580549fcdd50269d7e069d6db02b395fca128056ckkinnunen
20679e13260cf94427e6ccbfff8242bf85ed4c8187bcommit-bot@chromium.org    SkTDArray<GMRegistry::Factory> gms;
2070dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.org    if (FLAGS_gms) {
20838aeb0fd7a2bdab5e44531d96045dffe25c8e2b0commit-bot@chromium.org        append_matching_factories<GM>(GMRegistry::Head(), &gms);
209d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com    }
210d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com
2110dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.org    SkTDArray<TestRegistry::Factory> tests;
2120dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.org    if (FLAGS_tests) {
21338aeb0fd7a2bdab5e44531d96045dffe25c8e2b0commit-bot@chromium.org        append_matching_factories<Test>(TestRegistry::Head(), &tests);
214d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com    }
215d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com
216a98683bc50a3fe1241396f0ae20e35c7b1133fa9halcanary    SkTArray<SkString> skps;
217a98683bc50a3fe1241396f0ae20e35c7b1133fa9halcanary    find_skps(&skps);
218a98683bc50a3fe1241396f0ae20e35c7b1133fa9halcanary
219a98683bc50a3fe1241396f0ae20e35c7b1133fa9halcanary    SkDebugf("%d GMs x %d configs, %d tests, %d pictures\n",
220a98683bc50a3fe1241396f0ae20e35c7b1133fa9halcanary             gms.count(), configs.count(), tests.count(), skps.count());
221d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com    DM::Reporter reporter;
222406654be7a930b484159f5bca107d3b11d8a9edemtklein
223406654be7a930b484159f5bca107d3b11d8a9edemtklein    DM::TaskRunner tasks;
2240dc5bd149a8b69e8dc6d3b4713b827659c9b0a6bcommit-bot@chromium.org    kick_off_tests(tests, &reporter, &tasks);
225197ceda92966359962c51923a01dd2b0018b080fmtklein    kick_off_gms(gms, configs, gpuAPI, &reporter, &tasks);
226197ceda92966359962c51923a01dd2b0018b080fmtklein    kick_off_skps(skps, &reporter, &tasks);
227d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com    tasks.wait();
228d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com
2291d0f1642e8bc0fda200972926e2eaa99744e4d93mtklein    DM::WriteTask::DumpJson();
2301d0f1642e8bc0fda200972926e2eaa99744e4d93mtklein
231d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com    SkDebugf("\n");
232992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark#ifdef SK_DEBUG
233992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    if (FLAGS_portableFonts && FLAGS_reportUsedChars) {
234992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        sk_tool_utils::report_used_chars();
235992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark    }
236992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark#endif
23792007583e43115998412ac8b0a06cc2780eb025cmtklein
23839e8d93337c7e37d2b09dc710a05a9beefef5c2ccommit-bot@chromium.org    SkTArray<SkString> failures;
23939e8d93337c7e37d2b09dc710a05a9beefef5c2ccommit-bot@chromium.org    reporter.getFailures(&failures);
24039e8d93337c7e37d2b09dc710a05a9beefef5c2ccommit-bot@chromium.org    report_failures(failures);
24139e8d93337c7e37d2b09dc710a05a9beefef5c2ccommit-bot@chromium.org    return failures.count() > 0;
242d36522d12d3e71958e50683a7eef43dc2a47d96dmtklein@google.com}
243846872f75bf3bfa86dbc3d4d672118959193487acommit-bot@chromium.org
244846872f75bf3bfa86dbc3d4d672118959193487acommit-bot@chromium.org#if !defined(SK_BUILD_FOR_IOS) && !defined(SK_BUILD_FOR_NACL)
245846872f75bf3bfa86dbc3d4d672118959193487acommit-bot@chromium.orgint main(int argc, char** argv) {
24617f0b6df7248b9bbdaddacc3a6c9c6efe4ae278ecaryclark    SkCommandLineFlags::Parse(argc, argv);
24717f0b6df7248b9bbdaddacc3a6c9c6efe4ae278ecaryclark    return dm_main();
248846872f75bf3bfa86dbc3d4d672118959193487acommit-bot@chromium.org}
249846872f75bf3bfa86dbc3d4d672118959193487acommit-bot@chromium.org#endif
250