OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2013 Google Inc. | 2 * Copyright 2013 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "CrashHandler.h" | 8 #include "CrashHandler.h" |
9 #include "DMJsonWriter.h" | 9 #include "DMJsonWriter.h" |
10 #include "DMSrcSink.h" | 10 #include "DMSrcSink.h" |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
68 | 68 |
69 DEFINE_int32(shards, 1, "We're splitting source data into this many shards."); | 69 DEFINE_int32(shards, 1, "We're splitting source data into this many shards."); |
70 DEFINE_int32(shard, 0, "Which shard do I run?"); | 70 DEFINE_int32(shard, 0, "Which shard do I run?"); |
71 DEFINE_bool2(pre_log, p, false, "Log before running each test. May be incomprehe
nsible when threading"); | 71 DEFINE_bool2(pre_log, p, false, "Log before running each test. May be incomprehe
nsible when threading"); |
72 | 72 |
73 __SK_FORCE_IMAGE_DECODER_LINKING; | 73 __SK_FORCE_IMAGE_DECODER_LINKING; |
74 using namespace DM; | 74 using namespace DM; |
75 | 75 |
76 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~*/ | 76 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~*/ |
77 | 77 |
| 78 static double now_ms() { return SkTime::GetNSecs() * 1e-6; } |
| 79 |
78 SK_DECLARE_STATIC_MUTEX(gFailuresMutex); | 80 SK_DECLARE_STATIC_MUTEX(gFailuresMutex); |
79 static SkTArray<SkString> gFailures; | 81 static SkTArray<SkString> gFailures; |
80 | 82 |
81 static void fail(ImplicitString err) { | 83 static void fail(ImplicitString err) { |
82 SkAutoMutexAcquire lock(gFailuresMutex); | 84 SkAutoMutexAcquire lock(gFailuresMutex); |
83 SkDebugf("\n\nFAILURE: %s\n\n", err.c_str()); | 85 SkDebugf("\n\nFAILURE: %s\n\n", err.c_str()); |
84 gFailures.push_back(err); | 86 gFailures.push_back(err); |
85 } | 87 } |
86 | 88 |
87 static int32_t gPending = 0; // Atomic. Total number of running and queued tas
ks. | 89 static int32_t gPending = 0; // Atomic. Total number of running and queued tas
ks. |
(...skipping 735 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
823 // - this Src / Sink combination is on the blacklist; | 825 // - this Src / Sink combination is on the blacklist; |
824 // - it's a dry run. | 826 // - it's a dry run. |
825 SkString note(task->src->veto(task->sink->flags()) ? " (veto)" : ""); | 827 SkString note(task->src->veto(task->sink->flags()) ? " (veto)" : ""); |
826 SkString whyBlacklisted = is_blacklisted(task->sink.tag, task->src.tag.c
_str(), | 828 SkString whyBlacklisted = is_blacklisted(task->sink.tag, task->src.tag.c
_str(), |
827 task->src.options.c_str(), name
.c_str()); | 829 task->src.options.c_str(), name
.c_str()); |
828 if (!whyBlacklisted.isEmpty()) { | 830 if (!whyBlacklisted.isEmpty()) { |
829 note.appendf(" (--blacklist %s)", whyBlacklisted.c_str()); | 831 note.appendf(" (--blacklist %s)", whyBlacklisted.c_str()); |
830 } | 832 } |
831 | 833 |
832 SkString log; | 834 SkString log; |
833 WallTimer timer; | 835 auto timerStart = now_ms(); |
834 timer.start(); | |
835 if (!FLAGS_dryRun && note.isEmpty()) { | 836 if (!FLAGS_dryRun && note.isEmpty()) { |
836 SkBitmap bitmap; | 837 SkBitmap bitmap; |
837 SkDynamicMemoryWStream stream; | 838 SkDynamicMemoryWStream stream; |
838 if (FLAGS_pre_log) { | 839 if (FLAGS_pre_log) { |
839 SkDebugf("\nRunning %s->%s", name.c_str(), task->sink.tag); | 840 SkDebugf("\nRunning %s->%s", name.c_str(), task->sink.tag); |
840 } | 841 } |
841 start(task->sink.tag, task->src.tag, task->src.options, name.c_str()
); | 842 start(task->sink.tag, task->src.tag, task->src.options, name.c_str()
); |
842 Error err = task->sink->draw(*task->src, &bitmap, &stream, &log); | 843 Error err = task->sink->draw(*task->src, &bitmap, &stream, &log); |
843 if (!err.isEmpty()) { | 844 if (!err.isEmpty()) { |
844 timer.end(); | 845 auto elapsed = now_ms() - timerStart; |
845 if (err.isFatal()) { | 846 if (err.isFatal()) { |
846 fail(SkStringPrintf("%s %s %s %s: %s", | 847 fail(SkStringPrintf("%s %s %s %s: %s", |
847 task->sink.tag, | 848 task->sink.tag, |
848 task->src.tag.c_str(), | 849 task->src.tag.c_str(), |
849 task->src.options.c_str(), | 850 task->src.options.c_str(), |
850 name.c_str(), | 851 name.c_str(), |
851 err.c_str())); | 852 err.c_str())); |
852 } else { | 853 } else { |
853 note.appendf(" (skipped: %s)", err.c_str()); | 854 note.appendf(" (skipped: %s)", err.c_str()); |
854 } | 855 } |
855 done(timer.fWall, task->sink.tag, task->src.tag, task->src.optio
ns, | 856 done(elapsed, task->sink.tag, task->src.tag, task->src.options, |
856 name, note, log); | 857 name, note, log); |
857 return; | 858 return; |
858 } | 859 } |
859 SkAutoTDelete<SkStreamAsset> data(stream.detachAsStream()); | 860 SkAutoTDelete<SkStreamAsset> data(stream.detachAsStream()); |
860 | 861 |
861 SkString md5; | 862 SkString md5; |
862 if (!FLAGS_writePath.isEmpty() || !FLAGS_readPath.isEmpty()) { | 863 if (!FLAGS_writePath.isEmpty() || !FLAGS_readPath.isEmpty()) { |
863 SkMD5 hash; | 864 SkMD5 hash; |
864 if (data->getLength()) { | 865 if (data->getLength()) { |
865 hash.writeStream(data, data->getLength()); | 866 hash.writeStream(data, data->getLength()); |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
899 if (!FLAGS_writePath.isEmpty()) { | 900 if (!FLAGS_writePath.isEmpty()) { |
900 const char* ext = task->sink->fileExtension(); | 901 const char* ext = task->sink->fileExtension(); |
901 if (data->getLength()) { | 902 if (data->getLength()) { |
902 WriteToDisk(*task, md5, ext, data, data->getLength(), nullpt
r); | 903 WriteToDisk(*task, md5, ext, data, data->getLength(), nullpt
r); |
903 SkASSERT(bitmap.drawsNothing()); | 904 SkASSERT(bitmap.drawsNothing()); |
904 } else if (!bitmap.drawsNothing()) { | 905 } else if (!bitmap.drawsNothing()) { |
905 WriteToDisk(*task, md5, ext, nullptr, 0, &bitmap); | 906 WriteToDisk(*task, md5, ext, nullptr, 0, &bitmap); |
906 } | 907 } |
907 } | 908 } |
908 } | 909 } |
909 timer.end(); | 910 done(now_ms()-timerStart, task->sink.tag, task->src.tag.c_str(), task->s
rc.options.c_str(), |
910 done(timer.fWall, task->sink.tag, task->src.tag.c_str(), task->src.optio
ns.c_str(), name, | 911 name, note, log); |
911 note, log); | |
912 } | 912 } |
913 | 913 |
914 static void WriteToDisk(const Task& task, | 914 static void WriteToDisk(const Task& task, |
915 SkString md5, | 915 SkString md5, |
916 const char* ext, | 916 const char* ext, |
917 SkStream* data, size_t len, | 917 SkStream* data, size_t len, |
918 const SkBitmap* bitmap) { | 918 const SkBitmap* bitmap) { |
919 JsonWriter::BitmapResult result; | 919 JsonWriter::BitmapResult result; |
920 result.name = task.src->name(); | 920 result.name = task.src->name(); |
921 result.config = task.sink.tag; | 921 result.config = task.sink.tag; |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1025 } | 1025 } |
1026 bool verbose() const override { return FLAGS_veryVerbose; } | 1026 bool verbose() const override { return FLAGS_veryVerbose; } |
1027 } reporter; | 1027 } reporter; |
1028 | 1028 |
1029 SkString note; | 1029 SkString note; |
1030 SkString whyBlacklisted = is_blacklisted("_", "tests", "_", test->name); | 1030 SkString whyBlacklisted = is_blacklisted("_", "tests", "_", test->name); |
1031 if (!whyBlacklisted.isEmpty()) { | 1031 if (!whyBlacklisted.isEmpty()) { |
1032 note.appendf(" (--blacklist %s)", whyBlacklisted.c_str()); | 1032 note.appendf(" (--blacklist %s)", whyBlacklisted.c_str()); |
1033 } | 1033 } |
1034 | 1034 |
1035 WallTimer timer; | 1035 auto timerStart = now_ms(); |
1036 timer.start(); | |
1037 if (!FLAGS_dryRun && whyBlacklisted.isEmpty()) { | 1036 if (!FLAGS_dryRun && whyBlacklisted.isEmpty()) { |
1038 start("unit", "test", "", test->name); | 1037 start("unit", "test", "", test->name); |
1039 GrContextFactory factory; | 1038 GrContextFactory factory; |
1040 if (FLAGS_pre_log) { | 1039 if (FLAGS_pre_log) { |
1041 SkDebugf("\nRunning test %s", test->name); | 1040 SkDebugf("\nRunning test %s", test->name); |
1042 } | 1041 } |
1043 test->proc(&reporter, &factory); | 1042 test->proc(&reporter, &factory); |
1044 } | 1043 } |
1045 timer.end(); | 1044 done(now_ms()-timerStart, "unit", "test", "", test->name, note, ""); |
1046 done(timer.fWall, "unit", "test", "", test->name, note, ""); | |
1047 } | 1045 } |
1048 | 1046 |
1049 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~*/ | 1047 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~*/ |
1050 | 1048 |
1051 // If we're isolating all GPU-bound work to one thread (the default), this funct
ion runs all that. | 1049 // If we're isolating all GPU-bound work to one thread (the default), this funct
ion runs all that. |
1052 static void run_enclave_and_gpu_tests(SkTArray<Task>* tasks) { | 1050 static void run_enclave_and_gpu_tests(SkTArray<Task>* tasks) { |
1053 run_enclave(tasks); | 1051 run_enclave(tasks); |
1054 for (int i = 0; i < gGPUTests.count(); i++) { | 1052 for (int i = 0; i < gGPUTests.count(); i++) { |
1055 run_test(&gGPUTests[i]); | 1053 run_test(&gGPUTests[i]); |
1056 } | 1054 } |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1165 #endif // SK_PDF_IMAGE_STATS | 1163 #endif // SK_PDF_IMAGE_STATS |
1166 return 0; | 1164 return 0; |
1167 } | 1165 } |
1168 | 1166 |
1169 #if !defined(SK_BUILD_FOR_IOS) | 1167 #if !defined(SK_BUILD_FOR_IOS) |
1170 int main(int argc, char** argv) { | 1168 int main(int argc, char** argv) { |
1171 SkCommandLineFlags::Parse(argc, argv); | 1169 SkCommandLineFlags::Parse(argc, argv); |
1172 return dm_main(); | 1170 return dm_main(); |
1173 } | 1171 } |
1174 #endif | 1172 #endif |
OLD | NEW |