blob: 047b8d6a50e3e1a26fe29ae0a8823ccbc3f0eacc [file] [log] [blame]
mtklein@google.comd36522d2013-10-16 13:02:15 +00001// Main binary for DM.
2// For a high-level overview, please see dm/README.
3
jcgregorio3b27ade2014-11-13 08:06:40 -08004#include "CrashHandler.h"
mtklein72ebb9f2014-08-07 14:27:03 -07005#include "LazyDecodeBitmap.h"
caryclark17f0b6d2014-07-22 10:15:34 -07006#include "SkCommonFlags.h"
mtklein@google.comd36522d2013-10-16 13:02:15 +00007#include "SkForceLinking.h"
8#include "SkGraphics.h"
mtklein1d0f1642014-09-08 08:05:18 -07009#include "SkOSFile.h"
commit-bot@chromium.org90b5a2a2014-05-14 17:55:32 +000010#include "SkPicture.h"
rmistry@google.comd6bab022013-12-02 13:50:38 +000011#include "SkString.h"
mtklein406654b2014-09-03 15:34:37 -070012#include "SkTaskGroup.h"
commit-bot@chromium.org0dc5bd12014-02-26 16:31:22 +000013#include "Test.h"
mtklein@google.comd36522d2013-10-16 13:02:15 +000014#include "gm.h"
Cary Clark992c7b02014-07-31 08:58:44 -040015#include "sk_tool_utils.h"
16#include "sk_tool_utils_flags.h"
mtklein@google.comd36522d2013-10-16 13:02:15 +000017
commit-bot@chromium.orgef57b7e2014-02-28 20:31:31 +000018#include "DMCpuGMTask.h"
19#include "DMGpuGMTask.h"
commit-bot@chromium.org787227d2014-03-26 21:26:15 +000020#include "DMGpuSupport.h"
mtkleinf6139f72014-12-12 16:41:12 -080021#include "DMImageTask.h"
scroggo7a10fb62014-11-04 07:21:10 -080022#include "DMJsonWriter.h"
mtklein30bf3e22014-06-03 13:57:14 -070023#include "DMPDFTask.h"
mtklein@google.comd36522d2013-10-16 13:02:15 +000024#include "DMReporter.h"
commit-bot@chromium.org90b5a2a2014-05-14 17:55:32 +000025#include "DMSKPTask.h"
mtklein@google.comd36522d2013-10-16 13:02:15 +000026#include "DMTask.h"
27#include "DMTaskRunner.h"
commit-bot@chromium.org0dc5bd12014-02-26 16:31:22 +000028#include "DMTestTask.h"
mtklein@google.comd36522d2013-10-16 13:02:15 +000029
mtklein30bf3e22014-06-03 13:57:14 -070030#ifdef SK_BUILD_POPPLER
31# include "SkPDFRasterizer.h"
32# define RASTERIZE_PDF_PROC SkPopplerRasterizePDF
halcanary3dc5d702014-10-27 06:24:11 -070033#elif defined(SK_BUILD_FOR_MAC) || defined(SK_BUILD_FOR_IOS)
34# include "SkCGUtils.h"
35# define RASTERIZE_PDF_PROC SkPDFDocumentToBitmap
mtklein30bf3e22014-06-03 13:57:14 -070036#else
37# define RASTERIZE_PDF_PROC NULL
38#endif
39
commit-bot@chromium.org120c9992014-05-16 18:11:51 +000040#include <ctype.h>
mtklein@google.comd36522d2013-10-16 13:02:15 +000041
42using skiagm::GM;
43using skiagm::GMRegistry;
commit-bot@chromium.org0dc5bd12014-02-26 16:31:22 +000044using skiatest::Test;
45using skiatest::TestRegistry;
mtklein@google.comd36522d2013-10-16 13:02:15 +000046
kkinnunen80549fc2014-06-30 06:36:31 -070047static const char kGpuAPINameGL[] = "gl";
48static const char kGpuAPINameGLES[] = "gles";
49
commit-bot@chromium.org0dc5bd12014-02-26 16:31:22 +000050DEFINE_bool(gms, true, "Run GMs?");
51DEFINE_bool(tests, true, "Run tests?");
Cary Clark992c7b02014-07-31 08:58:44 -040052DEFINE_bool(reportUsedChars, false, "Output test font construction data to be pasted into"
53 " create_test_font.cpp.");
mtkleinf6139f72014-12-12 16:41:12 -080054DEFINE_string(images, "resources", "Path to directory containing images to decode.");
mtklein@google.comd36522d2013-10-16 13:02:15 +000055
56__SK_FORCE_IMAGE_DECODER_LINKING;
57
mtklein@google.comd36522d2013-10-16 13:02:15 +000058// "FooBar" -> "foobar". Obviously, ASCII only.
59static SkString lowercase(SkString s) {
60 for (size_t i = 0; i < s.size(); i++) {
61 s[i] = tolower(s[i]);
62 }
63 return s;
64}
65
commit-bot@chromium.org38aeb0f2014-02-26 23:01:57 +000066static const GrContextFactory::GLContextType native = GrContextFactory::kNative_GLContextType;
mtklein60c77072014-08-14 10:36:55 -070067static const GrContextFactory::GLContextType nvpr = GrContextFactory::kNVPR_GLContextType;
commit-bot@chromium.org38aeb0f2014-02-26 23:01:57 +000068static const GrContextFactory::GLContextType null = GrContextFactory::kNull_GLContextType;
69static const GrContextFactory::GLContextType debug = GrContextFactory::kDebug_GLContextType;
commit-bot@chromium.org38aeb0f2014-02-26 23:01:57 +000070#if SK_ANGLE
mtklein60c77072014-08-14 10:36:55 -070071static const GrContextFactory::GLContextType angle = GrContextFactory::kANGLE_GLContextType;
commit-bot@chromium.org38aeb0f2014-02-26 23:01:57 +000072#endif
commit-bot@chromium.org38aeb0f2014-02-26 23:01:57 +000073#if SK_MESA
mtklein60c77072014-08-14 10:36:55 -070074static const GrContextFactory::GLContextType mesa = GrContextFactory::kMESA_GLContextType;
commit-bot@chromium.org38aeb0f2014-02-26 23:01:57 +000075#endif
76
commit-bot@chromium.org0dc5bd12014-02-26 16:31:22 +000077static void kick_off_gms(const SkTDArray<GMRegistry::Factory>& gms,
78 const SkTArray<SkString>& configs,
kkinnunen80549fc2014-06-30 06:36:31 -070079 GrGLStandard gpuAPI,
commit-bot@chromium.org0dc5bd12014-02-26 16:31:22 +000080 DM::Reporter* reporter,
81 DM::TaskRunner* tasks) {
mtkleine4d3e602014-06-06 09:28:43 -070082#define START(name, type, ...) \
83 if (lowercase(configs[j]).equals(name)) { \
84 tasks->add(SkNEW_ARGS(DM::type, (name, reporter, tasks, gms[i], ## __VA_ARGS__))); \
mtklein@google.comd36522d2013-10-16 13:02:15 +000085 }
commit-bot@chromium.org38aeb0f2014-02-26 23:01:57 +000086 for (int i = 0; i < gms.count(); i++) {
mtklein@google.comd36522d2013-10-16 13:02:15 +000087 for (int j = 0; j < configs.count(); j++) {
kkinnunen80549fc2014-06-30 06:36:31 -070088
mtklein197ceda2014-09-09 07:36:57 -070089 START("565", CpuGMTask, kRGB_565_SkColorType);
90 START("8888", CpuGMTask, kN32_SkColorType);
jvanverth4736e142014-11-07 07:12:46 -080091 START("gpu", GpuGMTask, native, gpuAPI, 0, false);
92 START("msaa4", GpuGMTask, native, gpuAPI, 4, false);
93 START("msaa16", GpuGMTask, native, gpuAPI, 16, false);
94 START("nvprmsaa4", GpuGMTask, nvpr, gpuAPI, 4, false);
95 START("nvprmsaa16", GpuGMTask, nvpr, gpuAPI, 16, false);
96 START("gpudft", GpuGMTask, native, gpuAPI, 0, true);
97 START("gpunull", GpuGMTask, null, gpuAPI, 0, false);
98 START("gpudebug", GpuGMTask, debug, gpuAPI, 0, false);
mtklein60c77072014-08-14 10:36:55 -070099#if SK_ANGLE
jvanverth4736e142014-11-07 07:12:46 -0800100 START("angle", GpuGMTask, angle, gpuAPI, 0, false);
mtklein60c77072014-08-14 10:36:55 -0700101#endif
102#if SK_MESA
jvanverth4736e142014-11-07 07:12:46 -0800103 START("mesa", GpuGMTask, mesa, gpuAPI, 0, false);
mtklein60c77072014-08-14 10:36:55 -0700104#endif
mtklein30bf3e22014-06-03 13:57:14 -0700105 START("pdf", PDFTask, RASTERIZE_PDF_PROC);
commit-bot@chromium.org38aeb0f2014-02-26 23:01:57 +0000106 }
107 }
108#undef START
109}
110
commit-bot@chromium.org0dc5bd12014-02-26 16:31:22 +0000111static void kick_off_tests(const SkTDArray<TestRegistry::Factory>& tests,
112 DM::Reporter* reporter,
113 DM::TaskRunner* tasks) {
114 for (int i = 0; i < tests.count(); i++) {
commit-bot@chromium.orgef57b7e2014-02-28 20:31:31 +0000115 SkAutoTDelete<Test> test(tests[i](NULL));
116 if (test->isGPUTest()) {
117 tasks->add(SkNEW_ARGS(DM::GpuTestTask, (reporter, tasks, tests[i])));
118 } else {
119 tasks->add(SkNEW_ARGS(DM::CpuTestTask, (reporter, tasks, tests[i])));
120 }
commit-bot@chromium.org0dc5bd12014-02-26 16:31:22 +0000121 }
122}
123
mtkleinf6139f72014-12-12 16:41:12 -0800124static void find_files(const char* dir,
125 const char* suffixes[],
126 size_t num_suffixes,
127 SkTArray<SkString>* files) {
128 if (0 == strcmp(dir, "")) {
commit-bot@chromium.org90b5a2a2014-05-14 17:55:32 +0000129 return;
130 }
131
commit-bot@chromium.org90b5a2a2014-05-14 17:55:32 +0000132 SkString filename;
mtkleinf6139f72014-12-12 16:41:12 -0800133 for (size_t i = 0; i < num_suffixes; i++) {
134 SkOSFile::Iter it(dir, suffixes[i]);
135 while (it.next(&filename)) {
136 if (!SkCommandLineFlags::ShouldSkip(FLAGS_match, filename.c_str())) {
137 files->push_back(SkOSPath::Join(dir, filename.c_str()));
138 }
commit-bot@chromium.org90b5a2a2014-05-14 17:55:32 +0000139 }
halcanarya98683b2014-07-28 07:21:24 -0700140 }
141}
commit-bot@chromium.org90b5a2a2014-05-14 17:55:32 +0000142
halcanarya98683b2014-07-28 07:21:24 -0700143static void kick_off_skps(const SkTArray<SkString>& skps,
mtklein23c94f02014-09-08 09:12:28 -0700144 DM::Reporter* reporter,
145 DM::TaskRunner* tasks) {
halcanarya98683b2014-07-28 07:21:24 -0700146 for (int i = 0; i < skps.count(); ++i) {
147 SkAutoTUnref<SkStream> stream(SkStream::NewFromFile(skps[i].c_str()));
commit-bot@chromium.org90b5a2a2014-05-14 17:55:32 +0000148 if (stream.get() == NULL) {
halcanarya98683b2014-07-28 07:21:24 -0700149 SkDebugf("Could not read %s.\n", skps[i].c_str());
commit-bot@chromium.org90b5a2a2014-05-14 17:55:32 +0000150 exit(1);
151 }
mtklein72ebb9f2014-08-07 14:27:03 -0700152 SkAutoTUnref<SkPicture> pic(
153 SkPicture::CreateFromStream(stream.get(), &sk_tools::LazyDecodeBitmap));
commit-bot@chromium.org90b5a2a2014-05-14 17:55:32 +0000154 if (pic.get() == NULL) {
halcanarya98683b2014-07-28 07:21:24 -0700155 SkDebugf("Could not read %s as an SkPicture.\n", skps[i].c_str());
commit-bot@chromium.org90b5a2a2014-05-14 17:55:32 +0000156 exit(1);
157 }
158
tfarinaa8e2e152014-07-28 19:26:58 -0700159 SkString filename = SkOSPath::Basename(skps[i].c_str());
mtklein197ceda2014-09-09 07:36:57 -0700160 tasks->add(SkNEW_ARGS(DM::SKPTask, (reporter, tasks, pic, filename)));
161 tasks->add(SkNEW_ARGS(DM::PDFTask, (reporter, tasks, pic, filename, RASTERIZE_PDF_PROC)));
commit-bot@chromium.org90b5a2a2014-05-14 17:55:32 +0000162 }
163}
164
mtkleinf6139f72014-12-12 16:41:12 -0800165static void kick_off_images(const SkTArray<SkString>& images,
166 DM::Reporter* reporter,
167 DM::TaskRunner* tasks) {
168 for (int i = 0; i < images.count(); i++) {
169 SkAutoTUnref<SkData> image(SkData::NewFromFileName(images[i].c_str()));
170 if (!image) {
171 SkDebugf("Could not read %s.\n", images[i].c_str());
172 exit(1);
173 }
174 SkString filename = SkOSPath::Basename(images[i].c_str());
175 tasks->add(SkNEW_ARGS(DM::ImageTask, (reporter, tasks, image, filename)));
176 tasks->add(SkNEW_ARGS(DM::ImageTask, (reporter, tasks, image, filename, 5/*subsets*/)));
177 }
178}
179
180
commit-bot@chromium.org39e8d932014-05-29 20:14:48 +0000181static void report_failures(const SkTArray<SkString>& failures) {
mtklein@google.comd36522d2013-10-16 13:02:15 +0000182 if (failures.count() == 0) {
183 return;
184 }
185
186 SkDebugf("Failures:\n");
187 for (int i = 0; i < failures.count(); i++) {
188 SkDebugf(" %s\n", failures[i].c_str());
189 }
commit-bot@chromium.org39e8d932014-05-29 20:14:48 +0000190 SkDebugf("%d failures.\n", failures.count());
mtklein@google.comd36522d2013-10-16 13:02:15 +0000191}
192
kkinnunen80549fc2014-06-30 06:36:31 -0700193static GrGLStandard get_gl_standard() {
194 if (FLAGS_gpuAPI.contains(kGpuAPINameGL)) {
195 return kGL_GrGLStandard;
196 }
197 if (FLAGS_gpuAPI.contains(kGpuAPINameGLES)) {
198 return kGLES_GrGLStandard;
199 }
200 return kNone_GrGLStandard;
201}
202
commit-bot@chromium.org38aeb0f2014-02-26 23:01:57 +0000203template <typename T, typename Registry>
204static void append_matching_factories(Registry* head, SkTDArray<typename Registry::Factory>* out) {
205 for (const Registry* reg = head; reg != NULL; reg = reg->next()) {
206 SkAutoTDelete<T> forName(reg->factory()(NULL));
207 if (!SkCommandLineFlags::ShouldSkip(FLAGS_match, forName->getName())) {
208 *out->append() = reg->factory();
209 }
210 }
211}
212
jcgregorio3b27ade2014-11-13 08:06:40 -0800213int dm_main();
caryclark17f0b6d2014-07-22 10:15:34 -0700214int dm_main() {
jcgregorio3b27ade2014-11-13 08:06:40 -0800215 SetupCrashHandler();
commit-bot@chromium.org39e8d932014-05-29 20:14:48 +0000216 SkAutoGraphics ag;
mtklein406654b2014-09-03 15:34:37 -0700217 SkTaskGroup::Enabler enabled(FLAGS_threads);
commit-bot@chromium.orga65e2fd2014-05-30 17:23:31 +0000218
bsalomon06cddec2014-10-24 10:40:50 -0700219 if (FLAGS_dryRun || FLAGS_veryVerbose) {
commit-bot@chromium.orga65e2fd2014-05-30 17:23:31 +0000220 FLAGS_verbose = true;
221 }
commit-bot@chromium.org0dc5bd12014-02-26 16:31:22 +0000222#if SK_ENABLE_INST_COUNT
223 gPrintInstCount = FLAGS_leaks;
224#endif
commit-bot@chromium.org0dc5bd12014-02-26 16:31:22 +0000225
mtklein@google.comd36522d2013-10-16 13:02:15 +0000226 SkTArray<SkString> configs;
commit-bot@chromium.org38aeb0f2014-02-26 23:01:57 +0000227 for (int i = 0; i < FLAGS_config.count(); i++) {
228 SkStrSplit(FLAGS_config[i], ", ", &configs);
229 }
230
kkinnunen80549fc2014-06-30 06:36:31 -0700231 GrGLStandard gpuAPI = get_gl_standard();
232
mtklein@google.comd36522d2013-10-16 13:02:15 +0000233 SkTDArray<GMRegistry::Factory> gms;
commit-bot@chromium.org0dc5bd12014-02-26 16:31:22 +0000234 if (FLAGS_gms) {
commit-bot@chromium.org38aeb0f2014-02-26 23:01:57 +0000235 append_matching_factories<GM>(GMRegistry::Head(), &gms);
mtklein@google.comd36522d2013-10-16 13:02:15 +0000236 }
237
commit-bot@chromium.org38aeb0f2014-02-26 23:01:57 +0000238 SkTDArray<TestRegistry::Factory> tests;
239 if (FLAGS_tests) {
240 append_matching_factories<Test>(TestRegistry::Head(), &tests);
241 }
242
halcanarya98683b2014-07-28 07:21:24 -0700243
mtkleinf6139f72014-12-12 16:41:12 -0800244 SkTArray<SkString> skps;
245 if (!FLAGS_skps.isEmpty()) {
246 const char* suffixes[] = { "skp" };
247 find_files(FLAGS_skps[0], suffixes, SK_ARRAY_COUNT(suffixes), &skps);
248 }
249
250 SkTArray<SkString> images;
251 if (!FLAGS_images.isEmpty()) {
scroggo1d09ee72014-12-15 08:53:35 -0800252 const char* suffixes[] = {
253 "bmp", "gif", "jpg", "jpeg", "png", "webp", "ktx", "astc", "wbmp", "ico",
254 "BMP", "GIF", "JPG", "JPEG", "PNG", "WEBP", "KTX", "ASTC", "WBMP", "ICO",
255 };
mtkleinf6139f72014-12-12 16:41:12 -0800256 find_files(FLAGS_images[0], suffixes, SK_ARRAY_COUNT(suffixes), &images);
257 }
258
259 SkDebugf("%d GMs x %d configs, %d tests, %d pictures, %d images\n",
260 gms.count(), configs.count(), tests.count(), skps.count(), images.count());
mtklein@google.comd36522d2013-10-16 13:02:15 +0000261 DM::Reporter reporter;
mtklein406654b2014-09-03 15:34:37 -0700262
263 DM::TaskRunner tasks;
commit-bot@chromium.org0dc5bd12014-02-26 16:31:22 +0000264 kick_off_tests(tests, &reporter, &tasks);
mtklein197ceda2014-09-09 07:36:57 -0700265 kick_off_gms(gms, configs, gpuAPI, &reporter, &tasks);
266 kick_off_skps(skps, &reporter, &tasks);
mtkleinf6139f72014-12-12 16:41:12 -0800267 kick_off_images(images, &reporter, &tasks);
mtklein@google.comd36522d2013-10-16 13:02:15 +0000268 tasks.wait();
269
scroggo7a10fb62014-11-04 07:21:10 -0800270 DM::JsonWriter::DumpJson();
mtklein1d0f1642014-09-08 08:05:18 -0700271
mtklein@google.comd36522d2013-10-16 13:02:15 +0000272 SkDebugf("\n");
Cary Clark992c7b02014-07-31 08:58:44 -0400273#ifdef SK_DEBUG
274 if (FLAGS_portableFonts && FLAGS_reportUsedChars) {
275 sk_tool_utils::report_used_chars();
276 }
277#endif
mtklein92007582014-08-01 07:46:52 -0700278
commit-bot@chromium.org39e8d932014-05-29 20:14:48 +0000279 SkTArray<SkString> failures;
280 reporter.getFailures(&failures);
281 report_failures(failures);
282 return failures.count() > 0;
mtklein@google.comd36522d2013-10-16 13:02:15 +0000283}
jcgregorio3b27ade2014-11-13 08:06:40 -0800284
285#if !defined(SK_BUILD_FOR_IOS) && !defined(SK_BUILD_FOR_NACL)
286int main(int argc, char** argv) {
287 SkCommandLineFlags::Parse(argc, argv);
288 return dm_main();
289}
290#endif