Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1024)

Side by Side Diff: gm/gmmain.cpp

Issue 12536007: gm refactor: extract run_multiple_configs() and run_multiple_modes() (Closed) Base URL: http://skia.googlecode.com/svn/trunk/
Patch Set: Created 7 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | gm/tests/run.sh » ('j') | gm/tests/run.sh » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
epoger 2013/03/20 17:26:42 Refactor only... no functional change. Originally
scroggo 2013/03/20 17:41:30 Sorry about that!
epoger 2013/03/20 17:54:49 Hey, it's progress... a good thing.
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 *
11 * If you make changes to this, re-run the self-tests at gm/tests/run.sh 11 * If you make changes to this, re-run the self-tests at gm/tests/run.sh
(...skipping 1121 matching lines...) Expand 10 before | Expand all | Expand 10 after
1133 #endif 1133 #endif
1134 } 1134 }
1135 1135
1136 template <typename T> void appendUnique(SkTDArray<T>* array, const T& value) { 1136 template <typename T> void appendUnique(SkTDArray<T>* array, const T& value) {
1137 int index = array->find(value); 1137 int index = array->find(value);
1138 if (index < 0) { 1138 if (index < 0) {
1139 *array->append() = value; 1139 *array->append() = value;
1140 } 1140 }
1141 } 1141 }
1142 1142
1143 /**
1144 * Run this test in a number of different configs (8888, 565, PDF,
1145 * etc.), confirming that the resulting bitmaps match expectations
1146 * (which may be different for each config).
1147 *
1148 * Returns all errors encountered while doing so.
1149 */
1150 ErrorBitfield run_multiple_configs(GMMain &gmmain, GM *gm, const SkTDArray<size_ t> &configs,
epoger 2013/03/20 17:26:42 All of this code just extracted from tools_main().
1151 GrContextFactory *grFactory) {
1152 ErrorBitfield errorsForAllConfigs = kEmptyErrorBitfield;
1153 uint32_t gmFlags = gm->getFlags();
1154
1155 #if SK_SUPPORT_GPU
1156 struct {
1157 int fBytes;
1158 int fCount;
1159 } gpuCacheSize = { -1, -1 }; // -1s mean use the default
1160
1161 if (FLAGS_gpuCacheSize.count() > 0) {
1162 if (FLAGS_gpuCacheSize.count() != 2) {
1163 gm_fprintf(stderr, "--gpuCacheSize requires two arguments\n");
1164 return -1;
1165 }
1166 gpuCacheSize.fBytes = atoi(FLAGS_gpuCacheSize[0]);
1167 gpuCacheSize.fCount = atoi(FLAGS_gpuCacheSize[1]);
1168 }
1169 #endif
1170
1171 for (int i = 0; i < configs.count(); i++) {
1172 ConfigData config = gRec[configs[i]];
1173
1174 // Skip any tests that we don't even need to try.
1175 if ((kPDF_Backend == config.fBackend) &&
1176 (!FLAGS_pdf|| (gmFlags & GM::kSkipPDF_Flag)))
1177 {
1178 continue;
1179 }
1180 if ((gmFlags & GM::kSkip565_Flag) &&
1181 (kRaster_Backend == config.fBackend) &&
1182 (SkBitmap::kRGB_565_Config == config.fConfig)) {
1183 continue;
1184 }
1185 if ((gmFlags & GM::kSkipGPU_Flag) &&
1186 kGPU_Backend == config.fBackend) {
1187 continue;
1188 }
1189
1190 // Now we know that we want to run this test and record its
1191 // success or failure.
1192 ErrorBitfield errorsForThisConfig = kEmptyErrorBitfield;
1193 GrRenderTarget* renderTarget = NULL;
1194 #if SK_SUPPORT_GPU
1195 SkAutoTUnref<GrRenderTarget> rt;
1196 AutoResetGr autogr;
1197 if ((kEmptyErrorBitfield == errorsForThisConfig) &&
1198 kGPU_Backend == config.fBackend) {
1199 GrContext* gr = grFactory->get(config.fGLContextType);
1200 bool grSuccess = false;
1201 if (gr) {
1202 // create a render target to back the device
1203 GrTextureDesc desc;
1204 desc.fConfig = kSkia8888_GrPixelConfig;
1205 desc.fFlags = kRenderTarget_GrTextureFlagBit;
1206 desc.fWidth = gm->getISize().width();
1207 desc.fHeight = gm->getISize().height();
1208 desc.fSampleCnt = config.fSampleCnt;
1209 GrTexture* tex = gr->createUncachedTexture(desc, NULL, 0);
1210 if (tex) {
1211 rt.reset(tex->asRenderTarget());
1212 rt.get()->ref();
1213 tex->unref();
1214 autogr.set(gr);
1215 renderTarget = rt.get();
1216 grSuccess = NULL != renderTarget;
1217 }
1218 // Set the user specified cache limits if non-default.
1219 size_t bytes;
1220 int count;
1221 gr->getTextureCacheLimits(&count, &bytes);
1222 if (-1 != gpuCacheSize.fBytes) {
1223 bytes = static_cast<size_t>(gpuCacheSize.fBytes);
1224 }
1225 if (-1 != gpuCacheSize.fCount) {
1226 count = gpuCacheSize.fCount;
1227 }
1228 gr->setTextureCacheLimits(count, bytes);
1229 }
1230 if (!grSuccess) {
1231 errorsForThisConfig |= kNoGpuContext_ErrorBitmask;
1232 }
1233 }
1234 #endif
1235
1236 SkBitmap comparisonBitmap;
1237
1238 const char* writePath;
1239 if (FLAGS_writePath.count() == 1) {
1240 writePath = FLAGS_writePath[0];
1241 } else {
1242 writePath = NULL;
1243 }
1244 if (kEmptyErrorBitfield == errorsForThisConfig) {
1245 errorsForThisConfig |= gmmain.test_drawing(gm, config, writePath,
1246 GetGr(),
1247 renderTarget,
1248 &comparisonBitmap);
1249 }
1250
1251 if (FLAGS_deferred && !errorsForThisConfig &&
1252 (kGPU_Backend == config.fBackend ||
1253 kRaster_Backend == config.fBackend)) {
1254 errorsForThisConfig |= gmmain.test_deferred_drawing(gm, config,
1255 comparisonBitmap,
1256 GetGr(),
1257 renderTarget);
1258 }
1259
1260 errorsForAllConfigs |= errorsForThisConfig;
1261 }
1262 return errorsForAllConfigs;
1263 }
1264
1265 /**
1266 * Run this test in a number of different drawing modes (pipe,
1267 * deferred, tiled, etc.), confirming that the resulting bitmaps all
1268 * *exactly* match comparisonBitmap.
1269 *
1270 * Returns all errors encountered while doing so.
1271 */
1272 ErrorBitfield run_multiple_modes(GMMain &gmmain, GM *gm, const ConfigData &compa reConfig,
epoger 2013/03/20 17:26:42 All of this code just extracted from tools_main().
1273 const SkBitmap &comparisonBitmap) {
1274 SkTDArray<SkScalar> tileGridReplayScales;
1275 *tileGridReplayScales.append() = SK_Scalar1; // By default only test at scal e 1.0
1276 if (FLAGS_tileGridReplayScales.count() > 0) {
1277 tileGridReplayScales.reset();
1278 for (int i = 0; i < FLAGS_tileGridReplayScales.count(); i++) {
1279 double val = atof(FLAGS_tileGridReplayScales[i]);
1280 if (0 < val) {
1281 *tileGridReplayScales.append() = SkDoubleToScalar(val);
1282 }
1283 }
1284 if (0 == tileGridReplayScales.count()) {
1285 // Should have at least one scale
1286 gm_fprintf(stderr, "--tileGridReplayScales requires at least one sca le.\n");
1287 return -1;
1288 }
1289 }
1290
1291 ErrorBitfield errorsForAllModes = kEmptyErrorBitfield;
1292 uint32_t gmFlags = gm->getFlags();
1293
1294 // run the picture centric GM steps
1295 if (!(gmFlags & GM::kSkipPicture_Flag)) {
1296
1297 ErrorBitfield pictErrors = kEmptyErrorBitfield;
1298
1299 //SkAutoTUnref<SkPicture> pict(generate_new_picture(gm));
1300 SkPicture* pict = gmmain.generate_new_picture(gm, kNone_BbhType, 0);
1301 SkAutoUnref aur(pict);
1302
1303 if (FLAGS_replay) {
1304 SkBitmap bitmap;
1305 gmmain.generate_image_from_picture(gm, compareConfig, pict, &bitmap) ;
1306 pictErrors |= gmmain.compare_test_results_to_reference_bitmap(
1307 gm, compareConfig, "-replay", bitmap, &comparisonBitmap);
1308 }
1309
1310 if ((kEmptyErrorBitfield == pictErrors) && FLAGS_serialize) {
1311 SkPicture* repict = gmmain.stream_to_new_picture(*pict);
1312 SkAutoUnref aurr(repict);
1313
1314 SkBitmap bitmap;
1315 gmmain.generate_image_from_picture(gm, compareConfig, repict,
1316 &bitmap);
1317 pictErrors |= gmmain.compare_test_results_to_reference_bitmap(
1318 gm, co mpareConfig, "-serialize", bitmap, &comparisonBitmap);
scroggo 2013/03/20 17:41:30 Over 100 lines.
epoger 2013/03/20 17:54:49 Fixed this and other line length / style stuff in
1319 }
1320
1321 if (FLAGS_writePicturePath.count() == 1) {
1322 const char* pictureSuffix = "skp";
1323 SkString path = make_filename(FLAGS_writePicturePath[0], "",
1324 gm->shortName(),
1325 pictureSuffix);
1326 SkFILEWStream stream(path.c_str());
1327 pict->serialize(&stream);
1328 }
1329
1330 errorsForAllModes |= pictErrors;
1331 }
1332
1333 // TODO: add a test in which the RTree rendering results in a
1334 // different bitmap than the standard rendering. It should
1335 // show up as failed in the JSON summary, and should be listed
1336 // in the stdout also.
1337 if (!(gmFlags & GM::kSkipPicture_Flag) && FLAGS_rtree) {
1338 SkPicture* pict = gmmain.generate_new_picture(
1339 gm, kRTree_BbhType, SkPict ure::kUsePathBoundsForClip_RecordingFlag);
scroggo 2013/03/20 17:41:30 100 lines.
1340 SkAutoUnref aur(pict);
1341 SkBitmap bitmap;
1342 gmmain.generate_image_from_picture(gm, compareConfig, pict,
1343 &bitmap);
1344 errorsForAllModes |= gmmain.compare_test_results_to_reference_bitmap(
1345 gm, compareConfig, "-rtree", bitmap, &comparisonBitmap);
1346 }
1347
1348 if (!(gmFlags & GM::kSkipPicture_Flag) && FLAGS_tileGrid) {
1349 for(int scaleIndex = 0; scaleIndex < tileGridReplayScales.count(); ++sca leIndex) {
1350 SkScalar replayScale = tileGridReplayScales[scaleIndex];
1351 if ((gmFlags & GM::kSkipScaledReplay_Flag) && replayScale != 1)
1352 continue;
1353 // We record with the reciprocal scale to obtain a replay
1354 // result that can be validated against comparisonBitmap.
1355 SkScalar recordScale = SkScalarInvert(replayScale);
1356 SkPicture* pict = gmmain.generate_new_picture(
1357 gm, kTileGrid_BbhType, SkPicture::kUsePathBoundsForClip_RecordingFlag,
scroggo 2013/03/20 17:41:30 100 lines.
1358 recordScale);
1359 SkAutoUnref aur(pict);
1360 SkBitmap bitmap;
1361 gmmain.generate_image_from_picture(gm, compareConfig, pict,
1362 &bitmap, replayScale);
1363 SkString suffix("-tilegrid");
1364 if (SK_Scalar1 != replayScale) {
1365 suffix += "-scale-";
1366 suffix.appendScalar(replayScale);
1367 }
1368 errorsForAllModes |= gmmain.compare_test_results_to_reference_bitmap (
1369 gm, compareConfig, suffix.c_str(), bitmap, &comparisonBitmap);
1370 }
1371 }
1372
1373 // run the pipe centric GM steps
1374 if (!(gmFlags & GM::kSkipPipe_Flag)) {
1375
1376 ErrorBitfield pipeErrors = kEmptyErrorBitfield;
1377
1378 if (FLAGS_pipe) {
1379 pipeErrors |= gmmain.test_pipe_playback(gm, compareConfig,
1380 comparisonBitmap);
1381 }
1382
1383 if ((kEmptyErrorBitfield == pipeErrors) &&
1384 FLAGS_tiledPipe && !(gmFlags & GM::kSkipTiled_Flag)) {
1385 pipeErrors |= gmmain.test_tiled_pipe_playback(gm, compareConfig,
1386 comparisonBitmap);
1387 }
1388
1389 errorsForAllModes |= pipeErrors;
1390 }
1391 return errorsForAllModes;
1392 }
1393
1143 int tool_main(int argc, char** argv); 1394 int tool_main(int argc, char** argv);
1144 int tool_main(int argc, char** argv) { 1395 int tool_main(int argc, char** argv) {
1145 1396
1146 #if SK_ENABLE_INST_COUNT 1397 #if SK_ENABLE_INST_COUNT
1147 gPrintInstCount = true; 1398 gPrintInstCount = true;
1148 #endif 1399 #endif
1149 1400
1150 SkGraphics::Init(); 1401 SkGraphics::Init();
1151 // we don't need to see this during a run 1402 // we don't need to see this during a run
1152 gSkSuppressFontCachePurgeSpew = true; 1403 gSkSuppressFontCachePurgeSpew = true;
1153 1404
1154 setSystemPreferences(); 1405 setSystemPreferences();
1155 GMMain gmmain; 1406 GMMain gmmain;
1156 1407
1157 SkTDArray<size_t> configs; 1408 SkTDArray<size_t> configs;
1158 SkTDArray<size_t> excludeConfigs; 1409 SkTDArray<size_t> excludeConfigs;
1159 SkTDArray<SkScalar> tileGridReplayScales;
1160 *tileGridReplayScales.append() = SK_Scalar1; // By default only test at scal e 1.0
1161 bool userConfig = false; 1410 bool userConfig = false;
1162 1411
1163 SkString usage; 1412 SkString usage;
1164 usage.printf("Run the golden master tests.\n"); 1413 usage.printf("Run the golden master tests.\n");
1165 SkFlags::SetUsage(usage.c_str()); 1414 SkFlags::SetUsage(usage.c_str());
1166 SkFlags::ParseCommandLine(argc, argv); 1415 SkFlags::ParseCommandLine(argc, argv);
1167 1416
1168 #if SK_SUPPORT_GPU
1169 struct {
1170 int fBytes;
1171 int fCount;
1172 } gpuCacheSize = { -1, -1 }; // -1s mean use the default
1173
1174 if (FLAGS_gpuCacheSize.count() > 0) {
1175 if (FLAGS_gpuCacheSize.count() != 2) {
1176 gm_fprintf(stderr, "--gpuCacheSize requires two arguments\n");
1177 return -1;
1178 }
1179 gpuCacheSize.fBytes = atoi(FLAGS_gpuCacheSize[0]);
1180 gpuCacheSize.fCount = atoi(FLAGS_gpuCacheSize[1]);
1181 }
1182 #endif
1183
1184 gmmain.fUseFileHierarchy = FLAGS_hierarchy; 1417 gmmain.fUseFileHierarchy = FLAGS_hierarchy;
1185 if (FLAGS_mismatchPath.count() == 1) { 1418 if (FLAGS_mismatchPath.count() == 1) {
1186 gmmain.fMismatchPath = FLAGS_mismatchPath[0]; 1419 gmmain.fMismatchPath = FLAGS_mismatchPath[0];
1187 } 1420 }
1188 1421
1189 for (int i = 0; i < FLAGS_config.count(); i++) { 1422 for (int i = 0; i < FLAGS_config.count(); i++) {
1190 int index = findConfig(FLAGS_config[i]); 1423 int index = findConfig(FLAGS_config[i]);
1191 if (index >= 0) { 1424 if (index >= 0) {
1192 appendUnique<size_t>(&configs, index); 1425 appendUnique<size_t>(&configs, index);
1193 userConfig = true; 1426 userConfig = true;
1194 } else { 1427 } else {
1195 gm_fprintf(stderr, "unrecognized config %s\n", FLAGS_config[i]); 1428 gm_fprintf(stderr, "unrecognized config %s\n", FLAGS_config[i]);
1196 return -1; 1429 return -1;
1197 } 1430 }
1198 } 1431 }
1199 1432
1200 for (int i = 0; i < FLAGS_excludeConfig.count(); i++) { 1433 for (int i = 0; i < FLAGS_excludeConfig.count(); i++) {
1201 int index = findConfig(FLAGS_excludeConfig[i]); 1434 int index = findConfig(FLAGS_excludeConfig[i]);
1202 if (index >= 0) { 1435 if (index >= 0) {
1203 *excludeConfigs.append() = index; 1436 *excludeConfigs.append() = index;
1204 } else { 1437 } else {
1205 gm_fprintf(stderr, "unrecognized excludeConfig %s\n", FLAGS_excludeC onfig[i]); 1438 gm_fprintf(stderr, "unrecognized excludeConfig %s\n", FLAGS_excludeC onfig[i]);
1206 return -1; 1439 return -1;
1207 } 1440 }
1208 } 1441 }
1209 1442
1210 if (FLAGS_tileGridReplayScales.count() > 0) {
1211 tileGridReplayScales.reset();
1212 for (int i = 0; i < FLAGS_tileGridReplayScales.count(); i++) {
1213 double val = atof(FLAGS_tileGridReplayScales[i]);
1214 if (0 < val) {
1215 *tileGridReplayScales.append() = SkDoubleToScalar(val);
1216 }
1217 }
1218 if (0 == tileGridReplayScales.count()) {
1219 // Should have at least one scale
1220 gm_fprintf(stderr, "--tileGridReplayScales requires at least one sca le.\n");
1221 return -1;
1222 }
1223 }
1224
1225 int moduloRemainder = -1; 1443 int moduloRemainder = -1;
1226 int moduloDivisor = -1; 1444 int moduloDivisor = -1;
1227 1445
1228 if (FLAGS_modulo.count() == 2) { 1446 if (FLAGS_modulo.count() == 2) {
1229 moduloRemainder = atoi(FLAGS_modulo[0]); 1447 moduloRemainder = atoi(FLAGS_modulo[0]);
1230 moduloDivisor = atoi(FLAGS_modulo[1]); 1448 moduloDivisor = atoi(FLAGS_modulo[1]);
1231 if (moduloRemainder < 0 || moduloDivisor <= 0 || moduloRemainder >= modu loDivisor) { 1449 if (moduloRemainder < 0 || moduloDivisor <= 0 || moduloRemainder >= modu loDivisor) {
1232 gm_fprintf(stderr, "invalid modulo values."); 1450 gm_fprintf(stderr, "invalid modulo values.");
1233 return -1; 1451 return -1;
1234 } 1452 }
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
1364 if (skip_name(FLAGS_match, shortName)) { 1582 if (skip_name(FLAGS_match, shortName)) {
1365 SkDELETE(gm); 1583 SkDELETE(gm);
1366 continue; 1584 continue;
1367 } 1585 }
1368 1586
1369 SkISize size = gm->getISize(); 1587 SkISize size = gm->getISize();
1370 gm_fprintf(stdout, "%sdrawing... %s [%d %d]\n", moduloStr.c_str(), short Name, 1588 gm_fprintf(stdout, "%sdrawing... %s [%d %d]\n", moduloStr.c_str(), short Name,
1371 size.width(), size.height()); 1589 size.width(), size.height());
1372 1590
1373 ErrorBitfield testErrors = kEmptyErrorBitfield; 1591 ErrorBitfield testErrors = kEmptyErrorBitfield;
1374 uint32_t gmFlags = gm->getFlags(); 1592 testErrors |= run_multiple_configs(gmmain, gm, configs, grFactory);
1375
1376 for (int i = 0; i < configs.count(); i++) {
1377 ConfigData config = gRec[configs[i]];
1378
1379 // Skip any tests that we don't even need to try.
1380 if ((kPDF_Backend == config.fBackend) &&
1381 (!FLAGS_pdf|| (gmFlags & GM::kSkipPDF_Flag)))
1382 {
1383 continue;
1384 }
1385 if ((gmFlags & GM::kSkip565_Flag) &&
1386 (kRaster_Backend == config.fBackend) &&
1387 (SkBitmap::kRGB_565_Config == config.fConfig)) {
1388 continue;
1389 }
1390 if ((gmFlags & GM::kSkipGPU_Flag) &&
1391 kGPU_Backend == config.fBackend) {
1392 continue;
1393 }
1394
1395 // Now we know that we want to run this test and record its
1396 // success or failure.
1397 ErrorBitfield renderErrors = kEmptyErrorBitfield;
1398 GrRenderTarget* renderTarget = NULL;
1399 #if SK_SUPPORT_GPU
1400 SkAutoTUnref<GrRenderTarget> rt;
1401 AutoResetGr autogr;
1402 if ((kEmptyErrorBitfield == renderErrors) &&
1403 kGPU_Backend == config.fBackend) {
1404 GrContext* gr = grFactory->get(config.fGLContextType);
1405 bool grSuccess = false;
1406 if (gr) {
1407 // create a render target to back the device
1408 GrTextureDesc desc;
1409 desc.fConfig = kSkia8888_GrPixelConfig;
1410 desc.fFlags = kRenderTarget_GrTextureFlagBit;
1411 desc.fWidth = gm->getISize().width();
1412 desc.fHeight = gm->getISize().height();
1413 desc.fSampleCnt = config.fSampleCnt;
1414 GrTexture* tex = gr->createUncachedTexture(desc, NULL, 0);
1415 if (tex) {
1416 rt.reset(tex->asRenderTarget());
1417 rt.get()->ref();
1418 tex->unref();
1419 autogr.set(gr);
1420 renderTarget = rt.get();
1421 grSuccess = NULL != renderTarget;
1422 }
1423 // Set the user specified cache limits if non-default.
1424 size_t bytes;
1425 int count;
1426 gr->getTextureCacheLimits(&count, &bytes);
1427 if (-1 != gpuCacheSize.fBytes) {
1428 bytes = static_cast<size_t>(gpuCacheSize.fBytes);
1429 }
1430 if (-1 != gpuCacheSize.fCount) {
1431 count = gpuCacheSize.fCount;
1432 }
1433 gr->setTextureCacheLimits(count, bytes);
1434 }
1435 if (!grSuccess) {
1436 renderErrors |= kNoGpuContext_ErrorBitmask;
1437 }
1438 }
1439 #endif
1440
1441 SkBitmap comparisonBitmap;
1442
1443 const char* writePath;
1444 if (FLAGS_writePath.count() == 1) {
1445 writePath = FLAGS_writePath[0];
1446 } else {
1447 writePath = NULL;
1448 }
1449 if (kEmptyErrorBitfield == renderErrors) {
1450 renderErrors |= gmmain.test_drawing(gm, config, writePath,
1451 GetGr(),
1452 renderTarget,
1453 &comparisonBitmap);
1454 }
1455
1456 if (FLAGS_deferred && !renderErrors &&
1457 (kGPU_Backend == config.fBackend ||
1458 kRaster_Backend == config.fBackend)) {
1459 renderErrors |= gmmain.test_deferred_drawing(gm, config,
1460 comparisonBitmap,
1461 GetGr(),
1462 renderTarget);
1463 }
1464
1465 testErrors |= renderErrors;
1466 }
1467 1593
1468 SkBitmap comparisonBitmap; 1594 SkBitmap comparisonBitmap;
1469 const ConfigData compareConfig = 1595 const ConfigData compareConfig =
1470 { SkBitmap::kARGB_8888_Config, kRaster_Backend, kDontCare_GLContextT ype, 0, kRW_ConfigFlag, "comparison", false }; 1596 { SkBitmap::kARGB_8888_Config, kRaster_Backend, kDontCare_GLContextT ype, 0, kRW_ConfigFlag, "comparison", false };
1471 testErrors |= gmmain.generate_image(gm, compareConfig, NULL, NULL, &comp arisonBitmap, false); 1597 testErrors |= gmmain.generate_image(gm, compareConfig, NULL, NULL, &comp arisonBitmap, false);
1472 1598
1473 // run the picture centric GM steps 1599 // TODO(epoger): only run this if gmmain.generate_image() succeeded?
1474 if (!(gmFlags & GM::kSkipPicture_Flag)) { 1600 // Otherwise, what are we comparing against?
1475 1601 testErrors |= run_multiple_modes(gmmain, gm, compareConfig, comparisonBi tmap);
1476 ErrorBitfield pictErrors = kEmptyErrorBitfield;
1477
1478 //SkAutoTUnref<SkPicture> pict(generate_new_picture(gm));
1479 SkPicture* pict = gmmain.generate_new_picture(gm, kNone_BbhType, 0);
1480 SkAutoUnref aur(pict);
1481
1482 if ((kEmptyErrorBitfield == testErrors) && FLAGS_replay) {
1483 SkBitmap bitmap;
1484 gmmain.generate_image_from_picture(gm, compareConfig, pict,
1485 &bitmap);
1486 pictErrors |= gmmain.compare_test_results_to_reference_bitmap(
1487 gm, compareConfig, "-replay", bitmap, &comparisonBitmap);
1488 }
1489
1490 if ((kEmptyErrorBitfield == testErrors) &&
1491 (kEmptyErrorBitfield == pictErrors) &&
1492 FLAGS_serialize) {
1493 SkPicture* repict = gmmain.stream_to_new_picture(*pict);
1494 SkAutoUnref aurr(repict);
1495
1496 SkBitmap bitmap;
1497 gmmain.generate_image_from_picture(gm, compareConfig, repict,
1498 &bitmap);
1499 pictErrors |= gmmain.compare_test_results_to_reference_bitmap(
1500 gm, compareConfig, "-serialize", bitmap, &comparisonBitmap);
1501 }
1502
1503 if (FLAGS_writePicturePath.count() == 1) {
1504 const char* pictureSuffix = "skp";
1505 SkString path = make_filename(FLAGS_writePicturePath[0], "",
1506 gm->shortName(),
1507 pictureSuffix);
1508 SkFILEWStream stream(path.c_str());
1509 pict->serialize(&stream);
1510 }
1511
1512 testErrors |= pictErrors;
1513 }
1514
1515 // TODO: add a test in which the RTree rendering results in a
1516 // different bitmap than the standard rendering. It should
1517 // show up as failed in the JSON summary, and should be listed
1518 // in the stdout also.
1519 if (!(gmFlags & GM::kSkipPicture_Flag) && FLAGS_rtree) {
1520 SkPicture* pict = gmmain.generate_new_picture(
1521 gm, kRTree_BbhType, SkPicture::kUsePathBoundsForClip_RecordingFl ag);
1522 SkAutoUnref aur(pict);
1523 SkBitmap bitmap;
1524 gmmain.generate_image_from_picture(gm, compareConfig, pict,
1525 &bitmap);
1526 testErrors |= gmmain.compare_test_results_to_reference_bitmap(
1527 gm, compareConfig, "-rtree", bitmap, &comparisonBitmap);
1528 }
1529
1530 if (!(gmFlags & GM::kSkipPicture_Flag) && FLAGS_tileGrid) {
1531 for(int scaleIndex = 0; scaleIndex < tileGridReplayScales.count(); + +scaleIndex) {
1532 SkScalar replayScale = tileGridReplayScales[scaleIndex];
1533 if ((gmFlags & GM::kSkipScaledReplay_Flag) && replayScale != 1)
1534 continue;
1535 // We record with the reciprocal scale to obtain a replay
1536 // result that can be validated against comparisonBitmap.
1537 SkScalar recordScale = SkScalarInvert(replayScale);
1538 SkPicture* pict = gmmain.generate_new_picture(
1539 gm, kTileGrid_BbhType, SkPicture::kUsePathBoundsForClip_Reco rdingFlag,
1540 recordScale);
1541 SkAutoUnref aur(pict);
1542 SkBitmap bitmap;
1543 gmmain.generate_image_from_picture(gm, compareConfig, pict,
1544 &bitmap, replayScale);
1545 SkString suffix("-tilegrid");
1546 if (SK_Scalar1 != replayScale) {
1547 suffix += "-scale-";
1548 suffix.appendScalar(replayScale);
1549 }
1550 testErrors |= gmmain.compare_test_results_to_reference_bitmap(
1551 gm, compareConfig, suffix.c_str(), bitmap,
1552 &comparisonBitmap);
1553 }
1554 }
1555
1556 // run the pipe centric GM steps
1557 if (!(gmFlags & GM::kSkipPipe_Flag)) {
1558
1559 ErrorBitfield pipeErrors = kEmptyErrorBitfield;
1560
1561 if ((kEmptyErrorBitfield == testErrors) && FLAGS_pipe) {
1562 pipeErrors |= gmmain.test_pipe_playback(gm, compareConfig,
1563 comparisonBitmap);
1564 }
1565
1566 if ((kEmptyErrorBitfield == testErrors) &&
1567 (kEmptyErrorBitfield == pipeErrors) &&
1568 FLAGS_tiledPipe && !(gmFlags & GM::kSkipTiled_Flag)) {
1569 pipeErrors |= gmmain.test_tiled_pipe_playback(gm, compareConfig,
1570 comparisonBitmap);
1571 }
1572
1573 testErrors |= pipeErrors;
1574 }
1575 1602
1576 // Update overall results. 1603 // Update overall results.
1577 // We only tabulate the particular error types that we currently 1604 // We only tabulate the particular error types that we currently
1578 // care about (e.g., missing reference images). Later on, if we 1605 // care about (e.g., missing reference images). Later on, if we
1579 // want to also tabulate other error types, we can do so. 1606 // want to also tabulate other error types, we can do so.
1580 testsRun++; 1607 testsRun++;
1581 if (!gmmain.fExpectationsSource.get() || 1608 if (!gmmain.fExpectationsSource.get() ||
1582 (kEmptyErrorBitfield != (kMissingExpectations_ErrorBitmask & testErr ors))) { 1609 (kEmptyErrorBitfield != (kMissingExpectations_ErrorBitmask & testErr ors))) {
1583 testsMissingReferenceImages++; 1610 testsMissingReferenceImages++;
1584 } 1611 }
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
1638 if (FLAGS_forceBWtext) { 1665 if (FLAGS_forceBWtext) {
1639 canvas->setDrawFilter(SkNEW(BWTextDrawFilter))->unref(); 1666 canvas->setDrawFilter(SkNEW(BWTextDrawFilter))->unref();
1640 } 1667 }
1641 } 1668 }
1642 1669
1643 #if !defined(SK_BUILD_FOR_IOS) && !defined(SK_BUILD_FOR_NACL) 1670 #if !defined(SK_BUILD_FOR_IOS) && !defined(SK_BUILD_FOR_NACL)
1644 int main(int argc, char * const argv[]) { 1671 int main(int argc, char * const argv[]) {
1645 return tool_main(argc, (char**) argv); 1672 return tool_main(argc, (char**) argv);
1646 } 1673 }
1647 #endif 1674 #endif
OLDNEW
« no previous file with comments | « no previous file | gm/tests/run.sh » ('j') | gm/tests/run.sh » ('J')

Powered by Google App Engine
This is Rietveld 408576698