Chromium Code Reviews| 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 20 matching lines...) Expand all Loading... | |
| 31 #include "SkImageEncoder.h" | 31 #include "SkImageEncoder.h" |
| 32 #include "SkOSFile.h" | 32 #include "SkOSFile.h" |
| 33 #include "SkPicture.h" | 33 #include "SkPicture.h" |
| 34 #include "SkRefCnt.h" | 34 #include "SkRefCnt.h" |
| 35 #include "SkStream.h" | 35 #include "SkStream.h" |
| 36 #include "SkTArray.h" | 36 #include "SkTArray.h" |
| 37 #include "SkTDict.h" | 37 #include "SkTDict.h" |
| 38 #include "SkTileGridPicture.h" | 38 #include "SkTileGridPicture.h" |
| 39 #include "SamplePipeControllers.h" | 39 #include "SamplePipeControllers.h" |
| 40 | 40 |
| 41 #define EPOGER_TEST | |
|
epoger
2013/04/24 17:07:07
patchset 1 adds timing reports, and disables --wri
| |
| 42 #ifdef EPOGER_TEST | |
| 43 #include "SkTime.h" | |
| 44 #endif | |
| 45 | |
| 41 #ifdef SK_BUILD_FOR_WIN | 46 #ifdef SK_BUILD_FOR_WIN |
| 42 // json includes xlocale which generates warning 4530 because we're compilin g without | 47 // json includes xlocale which generates warning 4530 because we're compilin g without |
| 43 // exceptions; see https://code.google.com/p/skia/issues/detail?id=1067 | 48 // exceptions; see https://code.google.com/p/skia/issues/detail?id=1067 |
| 44 #pragma warning(push) | 49 #pragma warning(push) |
| 45 #pragma warning(disable : 4530) | 50 #pragma warning(disable : 4530) |
| 46 #endif | 51 #endif |
| 47 #include "json/value.h" | 52 #include "json/value.h" |
| 48 #ifdef SK_BUILD_FOR_WIN | 53 #ifdef SK_BUILD_FOR_WIN |
| 49 #pragma warning(pop) | 54 #pragma warning(pop) |
| 50 #endif | 55 #endif |
| (...skipping 1389 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1440 } | 1445 } |
| 1441 if (!grSuccess) { | 1446 if (!grSuccess) { |
| 1442 errorsForThisConfig.add(kNoGpuContext_ErrorType); | 1447 errorsForThisConfig.add(kNoGpuContext_ErrorType); |
| 1443 } | 1448 } |
| 1444 } | 1449 } |
| 1445 #endif | 1450 #endif |
| 1446 | 1451 |
| 1447 SkBitmap comparisonBitmap; | 1452 SkBitmap comparisonBitmap; |
| 1448 | 1453 |
| 1449 const char* writePath; | 1454 const char* writePath; |
| 1455 #ifdef EPOGER_TEST | |
| 1456 writePath = NULL; | |
| 1457 #else | |
| 1450 if (FLAGS_writePath.count() == 1) { | 1458 if (FLAGS_writePath.count() == 1) { |
| 1451 writePath = FLAGS_writePath[0]; | 1459 writePath = FLAGS_writePath[0]; |
| 1452 } else { | 1460 } else { |
| 1453 writePath = NULL; | 1461 writePath = NULL; |
| 1454 } | 1462 } |
| 1463 #endif | |
| 1455 if (errorsForThisConfig.isEmpty()) { | 1464 if (errorsForThisConfig.isEmpty()) { |
| 1456 errorsForThisConfig.add(gmmain.test_drawing(gm,config, writePath, gp uTarget, | 1465 errorsForThisConfig.add(gmmain.test_drawing(gm,config, writePath, gp uTarget, |
| 1457 &comparisonBitmap)); | 1466 &comparisonBitmap)); |
| 1458 } | 1467 } |
| 1459 | 1468 |
| 1460 if (FLAGS_deferred && errorsForThisConfig.isEmpty() && | 1469 if (FLAGS_deferred && errorsForThisConfig.isEmpty() && |
| 1461 (kGPU_Backend == config.fBackend || kRaster_Backend == config.fBacke nd)) { | 1470 (kGPU_Backend == config.fBackend || kRaster_Backend == config.fBacke nd)) { |
| 1462 errorsForThisConfig.add(gmmain.test_deferred_drawing(gm, config, com parisonBitmap, | 1471 errorsForThisConfig.add(gmmain.test_deferred_drawing(gm, config, com parisonBitmap, |
| 1463 gpuTarget)); | 1472 gpuTarget)); |
| 1464 } | 1473 } |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1508 } else { | 1517 } else { |
| 1509 SkPicture* repict = gmmain.stream_to_new_picture(*pict); | 1518 SkPicture* repict = gmmain.stream_to_new_picture(*pict); |
| 1510 SkAutoUnref aurr(repict); | 1519 SkAutoUnref aurr(repict); |
| 1511 SkBitmap bitmap; | 1520 SkBitmap bitmap; |
| 1512 gmmain.generate_image_from_picture(gm, compareConfig, repict, &bitma p); | 1521 gmmain.generate_image_from_picture(gm, compareConfig, repict, &bitma p); |
| 1513 errorsForAllModes.add(gmmain.compare_test_results_to_reference_bitma p( | 1522 errorsForAllModes.add(gmmain.compare_test_results_to_reference_bitma p( |
| 1514 name, renderModeDescriptor, bitmap, &comparisonBitmap)); | 1523 name, renderModeDescriptor, bitmap, &comparisonBitmap)); |
| 1515 } | 1524 } |
| 1516 } | 1525 } |
| 1517 | 1526 |
| 1527 #ifdef EPOGER_TEST | |
| 1528 #else | |
| 1518 if ((1 == FLAGS_writePicturePath.count()) && | 1529 if ((1 == FLAGS_writePicturePath.count()) && |
| 1519 !(gmFlags & GM::kSkipPicture_Flag)) { | 1530 !(gmFlags & GM::kSkipPicture_Flag)) { |
| 1520 const char* pictureSuffix = "skp"; | 1531 const char* pictureSuffix = "skp"; |
| 1521 SkString path = make_filename(FLAGS_writePicturePath[0], "", | 1532 SkString path = make_filename(FLAGS_writePicturePath[0], "", |
| 1522 gm->shortName(), pictureSuffix); | 1533 gm->shortName(), pictureSuffix); |
| 1523 SkFILEWStream stream(path.c_str()); | 1534 SkFILEWStream stream(path.c_str()); |
| 1524 pict->serialize(&stream); | 1535 pict->serialize(&stream); |
| 1525 } | 1536 } |
| 1537 #endif | |
| 1526 | 1538 |
| 1527 if (FLAGS_rtree) { | 1539 if (FLAGS_rtree) { |
| 1528 const char renderModeDescriptor[] = "-rtree"; | 1540 const char renderModeDescriptor[] = "-rtree"; |
| 1529 if (gmFlags & GM::kSkipPicture_Flag) { | 1541 if (gmFlags & GM::kSkipPicture_Flag) { |
| 1530 gmmain.RecordTestResults(kIntentionallySkipped_ErrorType, name, rend erModeDescriptor); | 1542 gmmain.RecordTestResults(kIntentionallySkipped_ErrorType, name, rend erModeDescriptor); |
| 1531 errorsForAllModes.add(kIntentionallySkipped_ErrorType); | 1543 errorsForAllModes.add(kIntentionallySkipped_ErrorType); |
| 1532 } else { | 1544 } else { |
| 1533 SkPicture* pict = gmmain.generate_new_picture( | 1545 SkPicture* pict = gmmain.generate_new_picture( |
| 1534 gm, kRTree_BbhType, SkPicture::kUsePathBoundsForClip_RecordingFl ag); | 1546 gm, kRTree_BbhType, SkPicture::kUsePathBoundsForClip_RecordingFl ag); |
| 1535 SkAutoUnref aur(pict); | 1547 SkAutoUnref aur(pict); |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1625 return total; | 1637 return total; |
| 1626 } | 1638 } |
| 1627 | 1639 |
| 1628 int tool_main(int argc, char** argv); | 1640 int tool_main(int argc, char** argv); |
| 1629 int tool_main(int argc, char** argv) { | 1641 int tool_main(int argc, char** argv) { |
| 1630 | 1642 |
| 1631 #if SK_ENABLE_INST_COUNT | 1643 #if SK_ENABLE_INST_COUNT |
| 1632 gPrintInstCount = true; | 1644 gPrintInstCount = true; |
| 1633 #endif | 1645 #endif |
| 1634 | 1646 |
| 1647 #ifdef EPOGER_TEST | |
| 1648 SkMSec timeStart = SkTime::GetMSecs(); | |
| 1649 #endif | |
| 1650 | |
| 1635 SkGraphics::Init(); | 1651 SkGraphics::Init(); |
| 1636 // we don't need to see this during a run | 1652 // we don't need to see this during a run |
| 1637 gSkSuppressFontCachePurgeSpew = true; | 1653 gSkSuppressFontCachePurgeSpew = true; |
| 1638 | 1654 |
| 1639 setSystemPreferences(); | 1655 setSystemPreferences(); |
| 1640 GMMain gmmain; | 1656 GMMain gmmain; |
| 1641 | 1657 |
| 1642 SkTDArray<size_t> configs; | 1658 SkTDArray<size_t> configs; |
| 1643 SkTDArray<size_t> excludeConfigs; | 1659 SkTDArray<size_t> excludeConfigs; |
| 1644 bool userConfig = false; | 1660 bool userConfig = false; |
| (...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1792 } else { | 1808 } else { |
| 1793 if (FLAGS_verbose) { | 1809 if (FLAGS_verbose) { |
| 1794 gm_fprintf(stdout, "reading expectations from JSON summary file %s\n", readPath); | 1810 gm_fprintf(stdout, "reading expectations from JSON summary file %s\n", readPath); |
| 1795 } | 1811 } |
| 1796 gmmain.fExpectationsSource.reset(SkNEW_ARGS( | 1812 gmmain.fExpectationsSource.reset(SkNEW_ARGS( |
| 1797 JsonExpectationsSource, (readPath))); | 1813 JsonExpectationsSource, (readPath))); |
| 1798 } | 1814 } |
| 1799 } | 1815 } |
| 1800 if (FLAGS_verbose) { | 1816 if (FLAGS_verbose) { |
| 1801 if (FLAGS_writePath.count() == 1) { | 1817 if (FLAGS_writePath.count() == 1) { |
| 1818 #ifdef EPOGER_TEST | |
| 1819 gm_fprintf(stdout, "EPOGER_TEST: NOT writing to %s\n", FLAGS_writePa th[0]); | |
| 1820 #else | |
| 1802 gm_fprintf(stdout, "writing to %s\n", FLAGS_writePath[0]); | 1821 gm_fprintf(stdout, "writing to %s\n", FLAGS_writePath[0]); |
| 1822 #endif | |
| 1803 } | 1823 } |
| 1804 if (FLAGS_writePicturePath.count() == 1) { | 1824 if (FLAGS_writePicturePath.count() == 1) { |
| 1825 #ifdef EPOGER_TEST | |
| 1826 gm_fprintf(stdout, "EPOGER_TEST: NOT writing pictures to %s\n", FLAG S_writePicturePath[0]); | |
| 1827 #else | |
| 1805 gm_fprintf(stdout, "writing pictures to %s\n", FLAGS_writePicturePat h[0]); | 1828 gm_fprintf(stdout, "writing pictures to %s\n", FLAGS_writePicturePat h[0]); |
| 1829 #endif | |
| 1806 } | 1830 } |
| 1807 if (FLAGS_resourcePath.count() == 1) { | 1831 if (FLAGS_resourcePath.count() == 1) { |
| 1808 gm_fprintf(stdout, "reading resources from %s\n", FLAGS_resourcePath [0]); | 1832 gm_fprintf(stdout, "reading resources from %s\n", FLAGS_resourcePath [0]); |
| 1809 } | 1833 } |
| 1810 } | 1834 } |
| 1811 | 1835 |
| 1812 if (moduloDivisor <= 0) { | 1836 if (moduloDivisor <= 0) { |
| 1813 moduloRemainder = -1; | 1837 moduloRemainder = -1; |
| 1814 } | 1838 } |
| 1815 if (moduloRemainder < 0 || moduloRemainder >= moduloDivisor) { | 1839 if (moduloRemainder < 0 || moduloRemainder >= moduloDivisor) { |
| 1816 moduloRemainder = -1; | 1840 moduloRemainder = -1; |
| 1817 } | 1841 } |
| 1818 | 1842 |
| 1819 int gmsRun = 0; | 1843 int gmsRun = 0; |
| 1820 int gmIndex = -1; | 1844 int gmIndex = -1; |
| 1821 SkString moduloStr; | 1845 SkString moduloStr; |
| 1822 | 1846 |
| 1847 #ifdef EPOGER_TEST | |
| 1848 #else | |
| 1823 // If we will be writing out files, prepare subdirectories. | 1849 // If we will be writing out files, prepare subdirectories. |
| 1824 if (FLAGS_writePath.count() == 1) { | 1850 if (FLAGS_writePath.count() == 1) { |
| 1825 if (!sk_mkdir(FLAGS_writePath[0])) { | 1851 if (!sk_mkdir(FLAGS_writePath[0])) { |
| 1826 return -1; | 1852 return -1; |
| 1827 } | 1853 } |
| 1828 if (gmmain.fUseFileHierarchy) { | 1854 if (gmmain.fUseFileHierarchy) { |
| 1829 for (int i = 0; i < configs.count(); i++) { | 1855 for (int i = 0; i < configs.count(); i++) { |
| 1830 ConfigData config = gRec[configs[i]]; | 1856 ConfigData config = gRec[configs[i]]; |
| 1831 SkString subdir; | 1857 SkString subdir; |
| 1832 subdir.appendf("%s%c%s", FLAGS_writePath[0], SkPATH_SEPARATOR, | 1858 subdir.appendf("%s%c%s", FLAGS_writePath[0], SkPATH_SEPARATOR, |
| 1833 config.fName); | 1859 config.fName); |
| 1834 if (!sk_mkdir(subdir.c_str())) { | 1860 if (!sk_mkdir(subdir.c_str())) { |
| 1835 return -1; | 1861 return -1; |
| 1836 } | 1862 } |
| 1837 } | 1863 } |
| 1838 } | 1864 } |
| 1839 } | 1865 } |
| 1866 #endif | |
| 1840 | 1867 |
| 1841 if (FLAGS_pdfJpegQuality < -1 || FLAGS_pdfJpegQuality > 100) { | 1868 if (FLAGS_pdfJpegQuality < -1 || FLAGS_pdfJpegQuality > 100) { |
| 1842 gm_fprintf(stderr, "%s\n", "pdfJpegQuality must be in [-1 .. 100] range. "); | 1869 gm_fprintf(stderr, "%s\n", "pdfJpegQuality must be in [-1 .. 100] range. "); |
| 1843 } | 1870 } |
| 1844 | 1871 |
| 1845 Iter iter; | 1872 Iter iter; |
| 1846 GM* gm; | 1873 GM* gm; |
| 1847 while ((gm = iter.next()) != NULL) { | 1874 while ((gm = iter.next()) != NULL) { |
| 1848 SkAutoTDelete<GM> adgm(gm); | 1875 SkAutoTDelete<GM> adgm(gm); |
| 1849 ++gmIndex; | 1876 ++gmIndex; |
| (...skipping 27 matching lines...) Expand all Loading... | |
| 1877 } | 1904 } |
| 1878 | 1905 |
| 1879 SkTArray<SkString> modes; | 1906 SkTArray<SkString> modes; |
| 1880 gmmain.GetRenderModesEncountered(modes); | 1907 gmmain.GetRenderModesEncountered(modes); |
| 1881 bool reportError = false; | 1908 bool reportError = false; |
| 1882 if (gmmain.NumSignificantErrors() > 0) { | 1909 if (gmmain.NumSignificantErrors() > 0) { |
| 1883 reportError = true; | 1910 reportError = true; |
| 1884 } | 1911 } |
| 1885 int expectedNumberOfTests = gmsRun * (configs.count() + modes.count()); | 1912 int expectedNumberOfTests = gmsRun * (configs.count() + modes.count()); |
| 1886 | 1913 |
| 1914 #ifdef EPOGER_TEST | |
| 1915 SkMSec timeBeforeSummaryOutput = SkTime::GetMSecs(); | |
| 1916 #endif | |
| 1917 | |
| 1887 // Output summary to stdout. | 1918 // Output summary to stdout. |
| 1888 if (FLAGS_verbose) { | 1919 if (FLAGS_verbose) { |
| 1889 gm_fprintf(stdout, "Ran %d GMs\n", gmsRun); | 1920 gm_fprintf(stdout, "Ran %d GMs\n", gmsRun); |
| 1890 gm_fprintf(stdout, "... over %2d configs [%s]\n", configs.count(), | 1921 gm_fprintf(stdout, "... over %2d configs [%s]\n", configs.count(), |
| 1891 list_all_config_names(configs).c_str()); | 1922 list_all_config_names(configs).c_str()); |
| 1892 gm_fprintf(stdout, "... and %2d modes [%s]\n", modes.count(), list_al l(modes).c_str()); | 1923 gm_fprintf(stdout, "... and %2d modes [%s]\n", modes.count(), list_al l(modes).c_str()); |
| 1893 gm_fprintf(stdout, "... so there should be a total of %d tests.\n", expe ctedNumberOfTests); | 1924 gm_fprintf(stdout, "... so there should be a total of %d tests.\n", expe ctedNumberOfTests); |
| 1894 } | 1925 } |
| 1895 gmmain.ListErrors(FLAGS_verbose); | 1926 gmmain.ListErrors(FLAGS_verbose); |
| 1896 | 1927 |
| 1897 // TODO(epoger): Enable this check for Android, too, once we resolve | 1928 // TODO(epoger): Enable this check for Android, too, once we resolve |
| 1898 // https://code.google.com/p/skia/issues/detail?id=1222 | 1929 // https://code.google.com/p/skia/issues/detail?id=1222 |
| 1899 // ('GM is unexpectedly skipping tests on Android') | 1930 // ('GM is unexpectedly skipping tests on Android') |
| 1900 #ifndef SK_BUILD_FOR_ANDROID | 1931 #ifndef SK_BUILD_FOR_ANDROID |
| 1901 if (expectedNumberOfTests != gmmain.fTestsRun) { | 1932 if (expectedNumberOfTests != gmmain.fTestsRun) { |
| 1902 gm_fprintf(stderr, "expected %d tests, but ran or skipped %d tests\n", | 1933 gm_fprintf(stderr, "expected %d tests, but ran or skipped %d tests\n", |
| 1903 expectedNumberOfTests, gmmain.fTestsRun); | 1934 expectedNumberOfTests, gmmain.fTestsRun); |
| 1904 reportError = true; | 1935 reportError = true; |
| 1905 } | 1936 } |
| 1906 #endif | 1937 #endif |
| 1907 | 1938 |
| 1939 #ifdef EPOGER_TEST | |
| 1940 Json::Value actualResults; | |
| 1941 actualResults[kJsonKey_ActualResults_Failed] = | |
| 1942 gmmain.fJsonActualResults_Failed; | |
| 1943 actualResults[kJsonKey_ActualResults_FailureIgnored] = | |
| 1944 gmmain.fJsonActualResults_FailureIgnored; | |
| 1945 actualResults[kJsonKey_ActualResults_NoComparison] = | |
| 1946 gmmain.fJsonActualResults_NoComparison; | |
| 1947 actualResults[kJsonKey_ActualResults_Succeeded] = | |
| 1948 gmmain.fJsonActualResults_Succeeded; | |
| 1949 Json::Value root; | |
| 1950 root[kJsonKey_ActualResults] = actualResults; | |
| 1951 root[kJsonKey_ExpectedResults] = gmmain.fJsonExpectedResults; | |
| 1952 std::string jsonStdString = root.toStyledString(); | |
| 1953 printf("%s\n", jsonStdString.c_str()); | |
| 1954 #endif | |
| 1955 | |
| 1908 if (FLAGS_writeJsonSummaryPath.count() == 1) { | 1956 if (FLAGS_writeJsonSummaryPath.count() == 1) { |
| 1909 Json::Value actualResults; | 1957 Json::Value actualResults; |
| 1910 actualResults[kJsonKey_ActualResults_Failed] = | 1958 actualResults[kJsonKey_ActualResults_Failed] = |
| 1911 gmmain.fJsonActualResults_Failed; | 1959 gmmain.fJsonActualResults_Failed; |
| 1912 actualResults[kJsonKey_ActualResults_FailureIgnored] = | 1960 actualResults[kJsonKey_ActualResults_FailureIgnored] = |
| 1913 gmmain.fJsonActualResults_FailureIgnored; | 1961 gmmain.fJsonActualResults_FailureIgnored; |
| 1914 actualResults[kJsonKey_ActualResults_NoComparison] = | 1962 actualResults[kJsonKey_ActualResults_NoComparison] = |
| 1915 gmmain.fJsonActualResults_NoComparison; | 1963 gmmain.fJsonActualResults_NoComparison; |
| 1916 actualResults[kJsonKey_ActualResults_Succeeded] = | 1964 actualResults[kJsonKey_ActualResults_Succeeded] = |
| 1917 gmmain.fJsonActualResults_Succeeded; | 1965 gmmain.fJsonActualResults_Succeeded; |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 1935 gm_fprintf(stdout, "config: %s %x\n", config.fName, gr); | 1983 gm_fprintf(stdout, "config: %s %x\n", config.fName, gr); |
| 1936 gr->printCacheStats(); | 1984 gr->printCacheStats(); |
| 1937 } | 1985 } |
| 1938 } | 1986 } |
| 1939 #endif | 1987 #endif |
| 1940 | 1988 |
| 1941 delete grFactory; | 1989 delete grFactory; |
| 1942 #endif | 1990 #endif |
| 1943 SkGraphics::Term(); | 1991 SkGraphics::Term(); |
| 1944 | 1992 |
| 1993 #ifdef EPOGER_TEST | |
| 1994 SkMSec timeEnd = SkTime::GetMSecs(); | |
| 1995 printf("EPOGER_TEST timings: %d msecs before summary output, %d msecs total\ n", | |
| 1996 (timeBeforeSummaryOutput - timeStart), (timeEnd - timeStart)); | |
| 1997 #endif | |
| 1998 | |
| 1945 return (reportError) ? -1 : 0; | 1999 return (reportError) ? -1 : 0; |
| 1946 } | 2000 } |
| 1947 | 2001 |
| 1948 void GMMain::installFilter(SkCanvas* canvas) { | 2002 void GMMain::installFilter(SkCanvas* canvas) { |
| 1949 if (FLAGS_forceBWtext) { | 2003 if (FLAGS_forceBWtext) { |
| 1950 canvas->setDrawFilter(SkNEW(BWTextDrawFilter))->unref(); | 2004 canvas->setDrawFilter(SkNEW(BWTextDrawFilter))->unref(); |
| 1951 } | 2005 } |
| 1952 } | 2006 } |
| 1953 | 2007 |
| 1954 #if !defined(SK_BUILD_FOR_IOS) && !defined(SK_BUILD_FOR_NACL) | 2008 #if !defined(SK_BUILD_FOR_IOS) && !defined(SK_BUILD_FOR_NACL) |
| 1955 int main(int argc, char * const argv[]) { | 2009 int main(int argc, char * const argv[]) { |
| 1956 return tool_main(argc, (char**) argv); | 2010 return tool_main(argc, (char**) argv); |
| 1957 } | 2011 } |
| 1958 #endif | 2012 #endif |
| OLD | NEW |