| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2011 Google Inc. | 2 * Copyright 2011 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 /* | 8 /* |
| 9 * Code for the "gm" (Golden Master) rendering comparison tool. | 9 * Code for the "gm" (Golden Master) rendering comparison tool. |
| 10 * | 10 * |
| (...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 167 uint32_t flags; | 167 uint32_t flags; |
| 168 }; | 168 }; |
| 169 | 169 |
| 170 static PipeFlagComboData gPipeWritingFlagCombos[] = { | 170 static PipeFlagComboData gPipeWritingFlagCombos[] = { |
| 171 { "", 0 }, | 171 { "", 0 }, |
| 172 { " cross-process", SkGPipeWriter::kCrossProcess_Flag }, | 172 { " cross-process", SkGPipeWriter::kCrossProcess_Flag }, |
| 173 { " cross-process, shared address", SkGPipeWriter::kCrossProcess_Flag | 173 { " cross-process, shared address", SkGPipeWriter::kCrossProcess_Flag |
| 174 | SkGPipeWriter::kSharedAddressSpace_Flag } | 174 | SkGPipeWriter::kSharedAddressSpace_Flag } |
| 175 }; | 175 }; |
| 176 | 176 |
| 177 const static ErrorCombination kDefaultIgnorableErrorTypes = ErrorCombination() |
| 178 .plus(kMissingExpectations_ErrorType) |
| 179 .plus(kIntentionallySkipped_ErrorType); |
| 180 |
| 177 class GMMain { | 181 class GMMain { |
| 178 public: | 182 public: |
| 179 GMMain() : fUseFileHierarchy(false), fMismatchPath(NULL), fTestsRun(0), | 183 GMMain() : fUseFileHierarchy(false), fIgnorableErrorTypes(kDefaultIgnorableE
rrorTypes), |
| 180 fRenderModesEncountered(1) { | 184 fMismatchPath(NULL), fTestsRun(0), fRenderModesEncountered(1) {} |
| 181 fIgnorableErrorCombination.add(kMissingExpectations_ErrorType); | |
| 182 fIgnorableErrorCombination.add(kIntentionallySkipped_ErrorType); | |
| 183 } | |
| 184 | 185 |
| 185 SkString make_name(const char shortName[], const char configName[]) { | 186 SkString make_name(const char shortName[], const char configName[]) { |
| 186 SkString name; | 187 SkString name; |
| 187 if (0 == strlen(configName)) { | 188 if (0 == strlen(configName)) { |
| 188 name.append(shortName); | 189 name.append(shortName); |
| 189 } else if (fUseFileHierarchy) { | 190 } else if (fUseFileHierarchy) { |
| 190 name.appendf("%s%c%s", configName, SkPATH_SEPARATOR, shortName); | 191 name.appendf("%s%c%s", configName, SkPATH_SEPARATOR, shortName); |
| 191 } else { | 192 } else { |
| 192 name.appendf("%s_%s", shortName, configName); | 193 name.appendf("%s_%s", shortName, configName); |
| 193 } | 194 } |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 284 } | 285 } |
| 285 | 286 |
| 286 /** | 287 /** |
| 287 * Return the number of significant (non-ignorable) errors we have | 288 * Return the number of significant (non-ignorable) errors we have |
| 288 * encountered so far. | 289 * encountered so far. |
| 289 */ | 290 */ |
| 290 int NumSignificantErrors() { | 291 int NumSignificantErrors() { |
| 291 int significantErrors = 0; | 292 int significantErrors = 0; |
| 292 for (int typeInt = 0; typeInt <= kLast_ErrorType; typeInt++) { | 293 for (int typeInt = 0; typeInt <= kLast_ErrorType; typeInt++) { |
| 293 ErrorType type = static_cast<ErrorType>(typeInt); | 294 ErrorType type = static_cast<ErrorType>(typeInt); |
| 294 if (!fIgnorableErrorCombination.includes(type)) { | 295 if (!fIgnorableErrorTypes.includes(type)) { |
| 295 significantErrors += fFailedTests[type].count(); | 296 significantErrors += fFailedTests[type].count(); |
| 296 } | 297 } |
| 297 } | 298 } |
| 298 return significantErrors; | 299 return significantErrors; |
| 299 } | 300 } |
| 300 | 301 |
| 301 /** | 302 /** |
| 302 * Display the summary of results with this ErrorType. | 303 * Display the summary of results with this ErrorType. |
| 303 * | 304 * |
| 304 * @param type which ErrorType | 305 * @param type which ErrorType |
| 305 * @param verbose whether to be all verbose about it | 306 * @param verbose whether to be all verbose about it |
| 306 */ | 307 */ |
| 307 void DisplayResultTypeSummary(ErrorType type, bool verbose) { | 308 void DisplayResultTypeSummary(ErrorType type, bool verbose) { |
| 308 bool isIgnorableType = fIgnorableErrorCombination.includes(type); | 309 bool isIgnorableType = fIgnorableErrorTypes.includes(type); |
| 309 | 310 |
| 310 SkString line; | 311 SkString line; |
| 311 if (isIgnorableType) { | 312 if (isIgnorableType) { |
| 312 line.append("[ ] "); | 313 line.append("[ ] "); |
| 313 } else { | 314 } else { |
| 314 line.append("[*] "); | 315 line.append("[*] "); |
| 315 } | 316 } |
| 316 | 317 |
| 317 SkTArray<SkString> *failedTestsOfThisType = &fFailedTests[type]; | 318 SkTArray<SkString> *failedTestsOfThisType = &fFailedTests[type]; |
| 318 int count = failedTestsOfThisType->count(); | 319 int count = failedTestsOfThisType->count(); |
| (...skipping 779 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1098 } | 1099 } |
| 1099 return errors; | 1100 return errors; |
| 1100 } | 1101 } |
| 1101 | 1102 |
| 1102 // | 1103 // |
| 1103 // member variables. | 1104 // member variables. |
| 1104 // They are public for now, to allow easier setting by tool_main(). | 1105 // They are public for now, to allow easier setting by tool_main(). |
| 1105 // | 1106 // |
| 1106 | 1107 |
| 1107 bool fUseFileHierarchy; | 1108 bool fUseFileHierarchy; |
| 1108 ErrorCombination fIgnorableErrorCombination; | 1109 ErrorCombination fIgnorableErrorTypes; |
| 1109 | 1110 |
| 1110 const char* fMismatchPath; | 1111 const char* fMismatchPath; |
| 1111 | 1112 |
| 1112 // collection of tests that have failed with each ErrorType | 1113 // collection of tests that have failed with each ErrorType |
| 1113 SkTArray<SkString> fFailedTests[kLast_ErrorType+1]; | 1114 SkTArray<SkString> fFailedTests[kLast_ErrorType+1]; |
| 1114 int fTestsRun; | 1115 int fTestsRun; |
| 1115 SkTDict<int> fRenderModesEncountered; | 1116 SkTDict<int> fRenderModesEncountered; |
| 1116 | 1117 |
| 1117 // Where to read expectations (expected image hash digests, etc.) from. | 1118 // Where to read expectations (expected image hash digests, etc.) from. |
| 1118 // If unset, we don't do comparisons. | 1119 // If unset, we don't do comparisons. |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1202 DEFINE_bool(deferred, true, "Exercise the deferred rendering test pass."); | 1203 DEFINE_bool(deferred, true, "Exercise the deferred rendering test pass."); |
| 1203 DEFINE_string(excludeConfig, "", "Space delimited list of configs to skip."); | 1204 DEFINE_string(excludeConfig, "", "Space delimited list of configs to skip."); |
| 1204 DEFINE_bool(forceBWtext, false, "Disable text anti-aliasing."); | 1205 DEFINE_bool(forceBWtext, false, "Disable text anti-aliasing."); |
| 1205 #if SK_SUPPORT_GPU | 1206 #if SK_SUPPORT_GPU |
| 1206 DEFINE_string(gpuCacheSize, "", "<bytes> <count>: Limit the gpu cache to byte si
ze or " | 1207 DEFINE_string(gpuCacheSize, "", "<bytes> <count>: Limit the gpu cache to byte si
ze or " |
| 1207 "object count. " TOSTRING(DEFAULT_CACHE_VALUE) " for either value
means " | 1208 "object count. " TOSTRING(DEFAULT_CACHE_VALUE) " for either value
means " |
| 1208 "use the default. 0 for either disables the cache."); | 1209 "use the default. 0 for either disables the cache."); |
| 1209 #endif | 1210 #endif |
| 1210 DEFINE_bool(hierarchy, false, "Whether to use multilevel directory structure " | 1211 DEFINE_bool(hierarchy, false, "Whether to use multilevel directory structure " |
| 1211 "when reading/writing files."); | 1212 "when reading/writing files."); |
| 1213 // TODO(epoger): Maybe should make SkCommandLineFlags handle default string |
| 1214 // values differently, so that the first definition of ignoreErrorTypes worked? |
| 1215 #if 0 |
| 1216 DEFINE_string(ignoreErrorTypes, kDefaultIgnorableErrorTypes.asString(" ").c_str(
), |
| 1217 "Space-separated list of ErrorTypes that should be ignored. If any
*other* error " |
| 1218 "types are encountered, the tool will exit with a nonzero return v
alue."); |
| 1219 #else |
| 1220 DEFINE_string(ignoreErrorTypes, "", SkString(SkString( |
| 1221 "Space-separated list of ErrorTypes that should be ignored. If any
*other* error " |
| 1222 "types are encountered, the tool will exit with a nonzero return v
alue. " |
| 1223 "Defaults to: ") += kDefaultIgnorableErrorTypes.asString(" ")).c_s
tr()); |
| 1224 #endif |
| 1212 DEFINE_string(match, "", "Only run tests whose name includes this substring/the
se substrings " | 1225 DEFINE_string(match, "", "Only run tests whose name includes this substring/the
se substrings " |
| 1213 "(more than one can be supplied, separated by spaces)."); | 1226 "(more than one can be supplied, separated by spaces)."); |
| 1214 DEFINE_string(mismatchPath, "", "Write images for tests that failed due to " | 1227 DEFINE_string(mismatchPath, "", "Write images for tests that failed due to " |
| 1215 "pixel mismatches into this directory."); | 1228 "pixel mismatches into this directory."); |
| 1216 DEFINE_string(modulo, "", "[--modulo <remainder> <divisor>]: only run tests for
which " | 1229 DEFINE_string(modulo, "", "[--modulo <remainder> <divisor>]: only run tests for
which " |
| 1217 "testIndex %% divisor == remainder."); | 1230 "testIndex %% divisor == remainder."); |
| 1218 DEFINE_bool(pdf, true, "Exercise the pdf rendering test pass."); | 1231 DEFINE_bool(pdf, true, "Exercise the pdf rendering test pass."); |
| 1219 DEFINE_bool(pipe, true, "Exercise the SkGPipe replay test pass."); | 1232 DEFINE_bool(pipe, true, "Exercise the SkGPipe replay test pass."); |
| 1220 DEFINE_string2(readPath, r, "", "Read reference images from this dir, and report
" | 1233 DEFINE_string2(readPath, r, "", "Read reference images from this dir, and report
" |
| 1221 "any differences between those and the newly generated ones."); | 1234 "any differences between those and the newly generated ones."); |
| (...skipping 410 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1632 | 1645 |
| 1633 if (FLAGS_modulo.count() == 2) { | 1646 if (FLAGS_modulo.count() == 2) { |
| 1634 moduloRemainder = atoi(FLAGS_modulo[0]); | 1647 moduloRemainder = atoi(FLAGS_modulo[0]); |
| 1635 moduloDivisor = atoi(FLAGS_modulo[1]); | 1648 moduloDivisor = atoi(FLAGS_modulo[1]); |
| 1636 if (moduloRemainder < 0 || moduloDivisor <= 0 || moduloRemainder >= modu
loDivisor) { | 1649 if (moduloRemainder < 0 || moduloDivisor <= 0 || moduloRemainder >= modu
loDivisor) { |
| 1637 gm_fprintf(stderr, "invalid modulo values."); | 1650 gm_fprintf(stderr, "invalid modulo values."); |
| 1638 return -1; | 1651 return -1; |
| 1639 } | 1652 } |
| 1640 } | 1653 } |
| 1641 | 1654 |
| 1655 if (FLAGS_ignoreErrorTypes.count() > 0) { |
| 1656 gmmain.fIgnorableErrorTypes = ErrorCombination(); |
| 1657 for (int i = 0; i < FLAGS_ignoreErrorTypes.count(); i++) { |
| 1658 ErrorType type; |
| 1659 const char *name = FLAGS_ignoreErrorTypes[i]; |
| 1660 if (!getErrorTypeByName(name, &type)) { |
| 1661 gm_fprintf(stderr, "cannot find ErrorType with name '%s'\n", nam
e); |
| 1662 return -1; |
| 1663 } else { |
| 1664 gmmain.fIgnorableErrorTypes.add(type); |
| 1665 } |
| 1666 } |
| 1667 } |
| 1668 |
| 1642 #if SK_SUPPORT_GPU | 1669 #if SK_SUPPORT_GPU |
| 1643 if (FLAGS_gpuCacheSize.count() > 0) { | 1670 if (FLAGS_gpuCacheSize.count() > 0) { |
| 1644 if (FLAGS_gpuCacheSize.count() != 2) { | 1671 if (FLAGS_gpuCacheSize.count() != 2) { |
| 1645 gm_fprintf(stderr, "--gpuCacheSize requires two arguments\n"); | 1672 gm_fprintf(stderr, "--gpuCacheSize requires two arguments\n"); |
| 1646 return -1; | 1673 return -1; |
| 1647 } | 1674 } |
| 1648 gGpuCacheSizeBytes = atoi(FLAGS_gpuCacheSize[0]); | 1675 gGpuCacheSizeBytes = atoi(FLAGS_gpuCacheSize[0]); |
| 1649 gGpuCacheSizeCount = atoi(FLAGS_gpuCacheSize[1]); | 1676 gGpuCacheSizeCount = atoi(FLAGS_gpuCacheSize[1]); |
| 1650 } else { | 1677 } else { |
| 1651 gGpuCacheSizeBytes = DEFAULT_CACHE_VALUE; | 1678 gGpuCacheSizeBytes = DEFAULT_CACHE_VALUE; |
| (...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1887 if (FLAGS_forceBWtext) { | 1914 if (FLAGS_forceBWtext) { |
| 1888 canvas->setDrawFilter(SkNEW(BWTextDrawFilter))->unref(); | 1915 canvas->setDrawFilter(SkNEW(BWTextDrawFilter))->unref(); |
| 1889 } | 1916 } |
| 1890 } | 1917 } |
| 1891 | 1918 |
| 1892 #if !defined(SK_BUILD_FOR_IOS) && !defined(SK_BUILD_FOR_NACL) | 1919 #if !defined(SK_BUILD_FOR_IOS) && !defined(SK_BUILD_FOR_NACL) |
| 1893 int main(int argc, char * const argv[]) { | 1920 int main(int argc, char * const argv[]) { |
| 1894 return tool_main(argc, (char**) argv); | 1921 return tool_main(argc, (char**) argv); |
| 1895 } | 1922 } |
| 1896 #endif | 1923 #endif |
| OLD | NEW |