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

Side by Side Diff: chrome/test/perf/rendering/throughput_tests.cc

Issue 124393006: Remove throughput_tests (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Remove change to window_snapshot.h Created 6 years, 11 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
OLDNEW
(Empty)
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "base/command_line.h"
6 #include "base/file_util.h"
7 #include "base/files/file_path.h"
8 #include "base/json/json_reader.h"
9 #include "base/memory/scoped_ptr.h"
10 #include "base/path_service.h"
11 #include "base/run_loop.h"
12 #include "base/strings/string_number_conversions.h"
13 #include "base/strings/stringprintf.h"
14 #include "base/test/trace_event_analyzer.h"
15 #include "base/values.h"
16 #include "chrome/browser/ui/browser.h"
17 #include "chrome/browser/ui/browser_window.h"
18 #include "chrome/browser/ui/tabs/tab_strip_model.h"
19 #include "chrome/browser/ui/window_snapshot/window_snapshot.h"
20 #include "chrome/common/chrome_paths.h"
21 #include "chrome/common/chrome_switches.h"
22 #include "chrome/common/net/url_fixer_upper.h"
23 #include "chrome/test/base/test_switches.h"
24 #include "chrome/test/base/tracing.h"
25 #include "chrome/test/base/ui_test_utils.h"
26 #include "chrome/test/perf/browser_perf_test.h"
27 #include "chrome/test/perf/perf_test.h"
28 #include "content/public/browser/web_contents.h"
29 #include "content/public/browser/web_contents_view.h"
30 #include "content/public/common/content_switches.h"
31 #include "content/public/test/browser_test_utils.h"
32 #include "content/public/test/test_utils.h"
33 #include "gpu/config/gpu_test_config.h"
34 #include "net/base/net_util.h"
35 #include "net/dns/mock_host_resolver.h"
36 #include "testing/gtest/include/gtest/gtest.h"
37 #include "testing/perf/perf_test.h"
38 #include "third_party/skia/include/core/SkBitmap.h"
39 #include "third_party/skia/include/core/SkColor.h"
40 #include "ui/gfx/codec/png_codec.h"
41 #include "ui/gl/gl_switches.h"
42 #include "url/gurl.h"
43
44 #if defined(OS_WIN)
45 #include "base/win/windows_version.h"
46 #endif
47
48 namespace {
49
50 enum RunTestFlags {
51 kNone = 0,
52 kInternal = 1 << 0, // Test uses internal test data.
53 kAllowExternalDNS = 1 << 1, // Test needs external DNS lookup.
54 kIsGpuCanvasTest = 1 << 2, // Test uses GPU accelerated canvas features.
55 kIsFlaky = 1 << 3
56 };
57
58 enum ThroughputTestFlags {
59 kSW = 0,
60 kGPU = 1 << 0,
61 kCompositorThread = 1 << 1
62 };
63
64 const int kSpinUpTimeMs = 4 * 1000;
65 const int kRunTimeMs = 10 * 1000;
66 const int kIgnoreSomeFrames = 3;
67
68 class ThroughputTest : public BrowserPerfTest {
69 public:
70 explicit ThroughputTest(int flags) :
71 use_gpu_(flags & kGPU),
72 use_compositor_thread_(flags & kCompositorThread),
73 spinup_time_ms_(kSpinUpTimeMs),
74 run_time_ms_(kRunTimeMs) {}
75
76 // This indicates running on GPU bots, not necessarily using the GPU.
77 bool IsGpuAvailable() const {
78 return CommandLine::ForCurrentProcess()->HasSwitch("enable-gpu");
79 }
80
81 // Parse flags from JSON to control the test behavior.
82 bool ParseFlagsFromJSON(const base::FilePath& json_dir,
83 const std::string& json,
84 int index) {
85 scoped_ptr<base::Value> root;
86 root.reset(base::JSONReader::Read(json));
87
88 base::ListValue* root_list = NULL;
89 if (!root.get() || !root->GetAsList(&root_list)) {
90 LOG(ERROR) << "JSON missing root list element";
91 return false;
92 }
93
94 base::DictionaryValue* item = NULL;
95 if (!root_list->GetDictionary(index, &item)) {
96 LOG(ERROR) << "index " << index << " not found in JSON";
97 return false;
98 }
99
100 std::string str;
101 if (item->GetStringASCII("url", &str)) {
102 gurl_ = GURL(str);
103 } else if (item->GetStringASCII("file", &str)) {
104 base::FilePath empty;
105 gurl_ = URLFixerUpper::FixupRelativeFile(empty, empty.AppendASCII(str));
106 } else {
107 LOG(ERROR) << "missing url or file";
108 return false;
109 }
110
111 if (!gurl_.is_valid()) {
112 LOG(ERROR) << "invalid url: " << gurl_.possibly_invalid_spec();
113 return false;
114 }
115
116 base::FilePath::StringType cache_dir;
117 if (item->GetString("local_path", &cache_dir))
118 local_cache_path_ = json_dir.Append(cache_dir);
119
120 int num;
121 if (item->GetInteger("spinup_time", &num))
122 spinup_time_ms_ = num * 1000;
123 if (item->GetInteger("run_time", &num))
124 run_time_ms_ = num * 1000;
125
126 base::DictionaryValue* pixel = NULL;
127 if (item->GetDictionary("wait_pixel", &pixel)) {
128 int x, y, r, g, b;
129 base::ListValue* color;
130 if (pixel->GetInteger("x", &x) &&
131 pixel->GetInteger("y", &y) &&
132 pixel->GetString("op", &str) &&
133 pixel->GetList("color", &color) &&
134 color->GetInteger(0, &r) &&
135 color->GetInteger(1, &g) &&
136 color->GetInteger(2, &b)) {
137 wait_for_pixel_.reset(new WaitPixel(x, y, r, g, b, str));
138 } else {
139 LOG(ERROR) << "invalid wait_pixel args";
140 return false;
141 }
142 }
143 return true;
144 }
145
146 // Parse extra-chrome-flags for extra command line flags.
147 void ParseFlagsFromCommandLine() {
148 if (!CommandLine::ForCurrentProcess()->HasSwitch(
149 switches::kExtraChromeFlags))
150 return;
151 CommandLine::StringType flags =
152 CommandLine::ForCurrentProcess()->GetSwitchValueNative(
153 switches::kExtraChromeFlags);
154 if (MatchPattern(flags, FILE_PATH_LITERAL("*.json:*"))) {
155 CommandLine::StringType::size_type colon_pos = flags.find_last_of(':');
156 CommandLine::StringType::size_type num_pos = colon_pos + 1;
157 int index;
158 ASSERT_TRUE(base::StringToInt(
159 flags.substr(num_pos, flags.size() - num_pos), &index));
160 base::FilePath filepath(flags.substr(0, colon_pos));
161 std::string json;
162 ASSERT_TRUE(base::ReadFileToString(filepath, &json));
163 ASSERT_TRUE(ParseFlagsFromJSON(filepath.DirName(), json, index));
164 } else {
165 gurl_ = GURL(flags);
166 }
167 }
168
169 void AllowExternalDNS() {
170 net::RuleBasedHostResolverProc* resolver =
171 new net::RuleBasedHostResolverProc(host_resolver());
172 resolver->AllowDirectLookup("*");
173 host_resolver_override_.reset(
174 new net::ScopedDefaultHostResolverProc(resolver));
175 }
176
177 void ResetAllowExternalDNS() {
178 host_resolver_override_.reset();
179 }
180
181 virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
182 BrowserPerfTest::SetUpCommandLine(command_line);
183 ParseFlagsFromCommandLine();
184 if (!local_cache_path_.value().empty()) {
185 // If --record-mode is already specified, don't set playback-mode.
186 if (!command_line->HasSwitch(switches::kRecordMode))
187 command_line->AppendSwitch(switches::kPlaybackMode);
188 command_line->AppendSwitchNative(switches::kDiskCacheDir,
189 local_cache_path_.value());
190 LOG(INFO) << local_cache_path_.value();
191 }
192 // We are measuring throughput, so we don't want any FPS throttling.
193 command_line->AppendSwitch(switches::kDisableGpuVsync);
194 command_line->AppendSwitch(switches::kAllowFileAccessFromFiles);
195 // Enable or disable GPU acceleration.
196 if (!use_gpu_) {
197 command_line->AppendSwitch(switches::kDisableAcceleratedCompositing);
198 command_line->AppendSwitch(switches::kDisableExperimentalWebGL);
199 command_line->AppendSwitch(switches::kDisableAccelerated2dCanvas);
200 }
201 if (use_compositor_thread_) {
202 ASSERT_TRUE(use_gpu_);
203 command_line->AppendSwitch(switches::kEnableThreadedCompositing);
204 } else {
205 command_line->AppendSwitch(switches::kDisableThreadedCompositing);
206 }
207 }
208
209 void Wait(int ms) {
210 base::RunLoop run_loop;
211 base::MessageLoop::current()->PostDelayedTask(
212 FROM_HERE,
213 run_loop.QuitClosure(),
214 base::TimeDelta::FromMilliseconds(ms));
215 content::RunThisRunLoop(&run_loop);
216 }
217
218 // Take snapshot of the current tab, encode it as PNG, and save to a SkBitmap.
219 bool TabSnapShotToImage(SkBitmap* bitmap) {
220 CHECK(bitmap);
221 std::vector<unsigned char> png;
222
223 gfx::Rect root_bounds = browser()->window()->GetBounds();
224 gfx::Rect tab_contents_bounds;
225 browser()->tab_strip_model()->GetActiveWebContents()->GetView()->
226 GetContainerBounds(&tab_contents_bounds);
227
228 gfx::Rect snapshot_bounds(tab_contents_bounds.x() - root_bounds.x(),
229 tab_contents_bounds.y() - root_bounds.y(),
230 tab_contents_bounds.width(),
231 tab_contents_bounds.height());
232
233 gfx::NativeWindow native_window = browser()->window()->GetNativeWindow();
234 if (!chrome::GrabWindowSnapshotForUser(native_window, &png,
235 snapshot_bounds)) {
236 LOG(ERROR) << "browser::GrabWindowSnapShot() failed";
237 return false;
238 }
239
240 if (!gfx::PNGCodec::Decode(reinterpret_cast<unsigned char*>(&*png.begin()),
241 png.size(), bitmap)) {
242 LOG(ERROR) << "Decode PNG to a SkBitmap failed";
243 return false;
244 }
245 return true;
246 }
247
248 // Check a pixel color every second until it passes test.
249 void WaitForPixelColor() {
250 if (wait_for_pixel_.get()) {
251 bool success = false;
252 do {
253 SkBitmap bitmap;
254 ASSERT_TRUE(TabSnapShotToImage(&bitmap));
255 success = wait_for_pixel_->IsDone(bitmap);
256 if (!success)
257 Wait(1000);
258 } while (!success);
259 }
260 }
261
262 // flags is one or more of RunTestFlags OR'd together.
263 void RunTest(const std::string& test_name, int flags) {
264 // Set path to test html.
265 base::FilePath test_path;
266 ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &test_path));
267 test_path = test_path.Append(FILE_PATH_LITERAL("perf"));
268 if (flags & kInternal)
269 test_path = test_path.Append(FILE_PATH_LITERAL("private"));
270 test_path = test_path.Append(FILE_PATH_LITERAL("rendering"));
271 test_path = test_path.Append(FILE_PATH_LITERAL("throughput"));
272 test_path = test_path.AppendASCII(test_name);
273 test_path = test_path.Append(FILE_PATH_LITERAL("index.html"));
274 ASSERT_TRUE(base::PathExists(test_path))
275 << "Missing test file: " << test_path.value();
276
277 gurl_ = net::FilePathToFileURL(test_path);
278 RunTestWithURL(test_name, flags);
279 }
280
281 // flags is one or more of RunTestFlags OR'd together.
282 void RunCanvasBenchTest(const std::string& test_name, int flags) {
283 // Set path to test html.
284 base::FilePath test_path;
285 ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &test_path));
286 test_path = test_path.Append(FILE_PATH_LITERAL("perf"));
287 test_path = test_path.Append(FILE_PATH_LITERAL("canvas_bench"));
288 test_path = test_path.AppendASCII(test_name + ".html");
289 ASSERT_TRUE(base::PathExists(test_path))
290 << "Missing test file: " << test_path.value();
291
292 gurl_ = net::FilePathToFileURL(test_path);
293 RunTestWithURL(test_name, flags);
294 }
295
296 // flags is one or more of RunTestFlags OR'd together.
297 void RunTestWithURL(int flags) {
298 RunTestWithURL(gurl_.possibly_invalid_spec(), flags);
299 }
300
301 // flags is one or more of RunTestFlags OR'd together.
302 void RunTestWithURL(const std::string& test_name, int flags) {
303 using trace_analyzer::Query;
304 using trace_analyzer::TraceAnalyzer;
305 using trace_analyzer::TraceEventVector;
306
307 #if defined(OS_WIN)
308 if (use_gpu_ && (flags & kIsGpuCanvasTest) &&
309 base::win::OSInfo::GetInstance()->version() == base::win::VERSION_XP) {
310 // crbug.com/128208
311 LOG(WARNING) << "Test skipped: GPU canvas tests do not run on XP.";
312 return;
313 }
314 #endif
315
316 if (use_gpu_ && !IsGpuAvailable()) {
317 LOG(WARNING) << "Test skipped: requires gpu. Pass --enable-gpu on the "
318 "command line if use of GPU is desired.";
319 return;
320 }
321
322 if (flags & kAllowExternalDNS)
323 AllowExternalDNS();
324
325 std::string json_events;
326 TraceEventVector events_sw, events_gpu;
327 scoped_ptr<TraceAnalyzer> analyzer;
328
329 LOG(INFO) << gurl_.possibly_invalid_spec();
330 ui_test_utils::NavigateToURLWithDisposition(
331 browser(), gurl_, CURRENT_TAB, ui_test_utils::BROWSER_TEST_NONE);
332 content::WaitForLoadStop(
333 browser()->tab_strip_model()->GetActiveWebContents());
334
335 // Let the test spin up.
336 LOG(INFO) << "Spinning up test...";
337 ASSERT_TRUE(tracing::BeginTracing("test_gpu"));
338 Wait(spinup_time_ms_);
339 ASSERT_TRUE(tracing::EndTracing(&json_events));
340
341 // Wait for a pixel color to change (if requested).
342 WaitForPixelColor();
343
344 // Check if GPU is rendering:
345 analyzer.reset(TraceAnalyzer::Create(json_events));
346 bool ran_on_gpu = (analyzer->FindEvents(
347 Query::EventNameIs("SwapBuffers"), &events_gpu) > 0u);
348 LOG(INFO) << "Mode: " << (ran_on_gpu ? "GPU" : "Software");
349 EXPECT_EQ(use_gpu_, ran_on_gpu);
350
351 // Let the test run for a while.
352 LOG(INFO) << "Running test...";
353 ASSERT_TRUE(tracing::BeginTracing("test_fps"));
354 Wait(run_time_ms_);
355 ASSERT_TRUE(tracing::EndTracing(&json_events));
356
357 // Search for frame ticks. We look for both SW and GPU frame ticks so that
358 // the test can verify that only one or the other are found.
359 analyzer.reset(TraceAnalyzer::Create(json_events));
360 Query query_sw = Query::EventNameIs("TestFrameTickSW");
361 Query query_gpu = Query::EventNameIs("TestFrameTickGPU");
362 analyzer->FindEvents(query_sw, &events_sw);
363 analyzer->FindEvents(query_gpu, &events_gpu);
364 TraceEventVector* frames = NULL;
365 if (use_gpu_) {
366 frames = &events_gpu;
367 EXPECT_EQ(0u, events_sw.size());
368 } else {
369 frames = &events_sw;
370 EXPECT_EQ(0u, events_gpu.size());
371 }
372 if (!(flags & kIsFlaky)) {
373 ASSERT_GT(frames->size(), 20u);
374 }
375 // Cull a few leading and trailing events as they might be unreliable.
376 TraceEventVector rate_events(frames->begin() + kIgnoreSomeFrames,
377 frames->end() - kIgnoreSomeFrames);
378 trace_analyzer::RateStats stats;
379 ASSERT_TRUE(GetRateStats(rate_events, &stats, NULL));
380 LOG(INFO) << "FPS = " << 1000000.0 / stats.mean_us;
381
382 // Print perf results.
383 double mean_ms = stats.mean_us / 1000.0;
384 double std_dev_ms = stats.standard_deviation_us / 1000.0;
385 std::string trace_name = use_compositor_thread_? "gpu_thread" :
386 ran_on_gpu ? "gpu" : "software";
387 std::string mean_and_error = base::StringPrintf("%f,%f", mean_ms,
388 std_dev_ms);
389 perf_test::PrintResultMeanAndError(test_name,
390 std::string(),
391 trace_name,
392 mean_and_error,
393 "frame_time",
394 true);
395
396 if (flags & kAllowExternalDNS)
397 ResetAllowExternalDNS();
398
399 // Close the tab so that we can quit without timing out during the
400 // wait-for-idle stage in browser_test framework.
401 browser()->tab_strip_model()->GetActiveWebContents()->Close();
402 }
403
404 private:
405 // WaitPixel checks a color against the color at the given pixel coordinates
406 // of an SkBitmap.
407 class WaitPixel {
408 enum Operator {
409 EQUAL,
410 NOT_EQUAL
411 };
412 public:
413 WaitPixel(int x, int y, int r, int g, int b, const std::string& op) :
414 x_(x), y_(y), r_(r), g_(g), b_(b) {
415 if (op == "!=")
416 op_ = EQUAL;
417 else if (op == "==")
418 op_ = NOT_EQUAL;
419 else
420 CHECK(false) << "op value \"" << op << "\" is not supported";
421 }
422 bool IsDone(const SkBitmap& bitmap) {
423 SkColor color = bitmap.getColor(x_, y_);
424 int r = SkColorGetR(color);
425 int g = SkColorGetG(color);
426 int b = SkColorGetB(color);
427 LOG(INFO) << "color(" << x_ << "," << y_ << "): " <<
428 r << "," << g << "," << b;
429 switch (op_) {
430 case EQUAL:
431 return r != r_ || g != g_ || b != b_;
432 case NOT_EQUAL:
433 return r == r_ && g == g_ && b == b_;
434 default:
435 return false;
436 }
437 }
438 private:
439 int x_;
440 int y_;
441 int r_;
442 int g_;
443 int b_;
444 Operator op_;
445 };
446
447 bool use_gpu_;
448 bool use_compositor_thread_;
449 int spinup_time_ms_;
450 int run_time_ms_;
451 base::FilePath local_cache_path_;
452 GURL gurl_;
453 scoped_ptr<net::ScopedDefaultHostResolverProc> host_resolver_override_;
454 scoped_ptr<WaitPixel> wait_for_pixel_;
455 };
456
457 // For running tests on GPU:
458 class ThroughputTestGPU : public ThroughputTest {
459 public:
460 ThroughputTestGPU() : ThroughputTest(kGPU) {}
461 };
462
463 // For running tests on GPU with the compositor thread:
464 class ThroughputTestThread : public ThroughputTest {
465 public:
466 ThroughputTestThread() : ThroughputTest(kGPU | kCompositorThread) {}
467 };
468
469 // For running tests on Software:
470 class ThroughputTestSW : public ThroughputTest {
471 public:
472 ThroughputTestSW() : ThroughputTest(kSW) {}
473 };
474
475 ////////////////////////////////////////////////////////////////////////////////
476 /// Tests
477
478 #if defined(OS_WIN) && defined(USE_AURA)
479 // crbug.com/292897
480 #define MAYBE(x) DISABLED_ ## x
481 #else
482 #define MAYBE(x) x
483 #endif
484
485 // Run this test with a URL on the command line:
486 // performance_browser_tests --gtest_also_run_disabled_tests --enable-gpu
487 // --gtest_filter=ThroughputTest*URL --extra-chrome-flags=http://...
488 // or, specify a json file with a list of tests, and the index of the test:
489 // --extra-chrome-flags=path/to/tests.json:0
490 // The json format is an array of tests, for example:
491 // [
492 // {"url":"http://...",
493 // "spinup_time":5,
494 // "run_time":10,
495 // "local_path":"path/to/disk-cache-dir",
496 // "wait_pixel":{"x":10,"y":10,"op":"!=","color":[24,24,24]}},
497 // {"url":"http://..."}
498 // ]
499 // The only required argument is url. If local_path is set, the test goes into
500 // playback-mode and only loads files from the specified cache. If wait_pixel is
501 // specified, then after spinup_time the test waits for the color at the
502 // specified pixel coordinate to match the given color with the given operator.
503 IN_PROC_BROWSER_TEST_F(ThroughputTestSW, DISABLED_TestURL) {
504 RunTestWithURL(kAllowExternalDNS);
505 }
506
507 IN_PROC_BROWSER_TEST_F(ThroughputTestGPU, DISABLED_TestURL) {
508 RunTestWithURL(kAllowExternalDNS);
509 }
510
511 IN_PROC_BROWSER_TEST_F(ThroughputTestGPU, MAYBE(Particles)) {
512 RunTest("particles", kInternal);
513 }
514
515 IN_PROC_BROWSER_TEST_F(ThroughputTestThread, MAYBE(Particles)) {
516 RunTest("particles", kInternal);
517 }
518
519 IN_PROC_BROWSER_TEST_F(ThroughputTestSW, MAYBE(CanvasDemoSW)) {
520 RunTest("canvas-demo", kInternal);
521 }
522
523 IN_PROC_BROWSER_TEST_F(ThroughputTestGPU, MAYBE(CanvasDemoGPU)) {
524 RunTest("canvas-demo", kInternal | kIsGpuCanvasTest);
525 }
526
527 IN_PROC_BROWSER_TEST_F(ThroughputTestThread, MAYBE(CanvasDemoGPU)) {
528 RunTest("canvas-demo", kInternal | kIsGpuCanvasTest);
529 }
530
531 // CompositingHugeDivSW timed out on Mac Intel Release GPU bot
532 // See crbug.com/114781
533 // Stopped producing results in SW: crbug.com/127621
534 IN_PROC_BROWSER_TEST_F(ThroughputTestSW, DISABLED_CompositingHugeDivSW) {
535 RunTest("compositing_huge_div", kNone);
536 }
537
538 // Failing with insufficient frames: crbug.com/127595
539 IN_PROC_BROWSER_TEST_F(ThroughputTestGPU, DISABLED_CompositingHugeDivGPU) {
540 RunTest("compositing_huge_div", kNone);
541 }
542
543 IN_PROC_BROWSER_TEST_F(ThroughputTestSW, MAYBE(DrawImageShadowSW)) {
544 RunTest("canvas2d_balls_with_shadow", kNone);
545 }
546
547 IN_PROC_BROWSER_TEST_F(ThroughputTestGPU, MAYBE(DrawImageShadowGPU)) {
548 // TODO(junov): Fix test flakiness crbug.com/272383
549 RunTest("canvas2d_balls_with_shadow", kNone | kIsGpuCanvasTest | kIsFlaky);
550 }
551
552 // Intermittent failure, should be fixed by converting to telemetry.
553 // See crbug.com/276500 for more details.
554 IN_PROC_BROWSER_TEST_F(ThroughputTestThread, DISABLED_DrawImageShadowGPU) {
555 // TODO(junov): Fix test flakiness crbug.com/272383
556 RunTest("canvas2d_balls_with_shadow", kNone | kIsGpuCanvasTest | kIsFlaky);
557 }
558
559 IN_PROC_BROWSER_TEST_F(ThroughputTestSW, MAYBE(CanvasToCanvasDrawSW)) {
560 if (IsGpuAvailable() &&
561 gpu::GPUTestBotConfig::CurrentConfigMatches("MAC AMD"))
562 return;
563 RunTest("canvas2d_balls_draw_from_canvas", kNone);
564 }
565
566 IN_PROC_BROWSER_TEST_F(ThroughputTestGPU, MAYBE(CanvasToCanvasDrawGPU)) {
567 if (IsGpuAvailable() &&
568 gpu::GPUTestBotConfig::CurrentConfigMatches("MAC AMD"))
569 return;
570 RunTest("canvas2d_balls_draw_from_canvas", kNone | kIsGpuCanvasTest);
571 }
572
573 // Failing on windows GPU bots: crbug.com/255192
574 IN_PROC_BROWSER_TEST_F(ThroughputTestSW, DISABLED_CanvasTextSW) {
575 if (IsGpuAvailable() &&
576 gpu::GPUTestBotConfig::CurrentConfigMatches("MAC AMD"))
577 return;
578 RunTest("canvas2d_balls_text", kNone);
579 }
580
581 IN_PROC_BROWSER_TEST_F(ThroughputTestGPU, MAYBE(CanvasTextGPU)) {
582 RunTest("canvas2d_balls_text", kNone | kIsGpuCanvasTest);
583 }
584
585 IN_PROC_BROWSER_TEST_F(ThroughputTestSW, MAYBE(CanvasFillPathSW)) {
586 RunTest("canvas2d_balls_fill_path", kNone);
587 }
588
589 IN_PROC_BROWSER_TEST_F(ThroughputTestGPU, MAYBE(CanvasFillPathGPU)) {
590 RunTest("canvas2d_balls_fill_path", kNone | kIsGpuCanvasTest);
591 }
592
593 IN_PROC_BROWSER_TEST_F(ThroughputTestSW, MAYBE(CanvasSingleImageSW)) {
594 RunCanvasBenchTest("single_image", kNone);
595 }
596
597 IN_PROC_BROWSER_TEST_F(ThroughputTestGPU, MAYBE(CanvasSingleImageGPU)) {
598 if (IsGpuAvailable() &&
599 gpu::GPUTestBotConfig::CurrentConfigMatches("MAC AMD"))
600 return;
601 RunCanvasBenchTest("single_image", kNone | kIsGpuCanvasTest);
602 }
603
604 IN_PROC_BROWSER_TEST_F(ThroughputTestSW, MAYBE(CanvasManyImagesSW)) {
605 RunCanvasBenchTest("many_images", kNone);
606 }
607
608 IN_PROC_BROWSER_TEST_F(ThroughputTestGPU, MAYBE(CanvasManyImagesGPU)) {
609 RunCanvasBenchTest("many_images", kNone | kIsGpuCanvasTest);
610 }
611
612 IN_PROC_BROWSER_TEST_F(ThroughputTestThread, MAYBE(CanvasManyImagesGPU)) {
613 RunCanvasBenchTest("many_images", kNone | kIsGpuCanvasTest);
614 }
615
616 } // namespace
OLDNEW
« no previous file with comments | « chrome/test/data/perf/rendering/throughput/compositing_huge_div/index.html ('k') | content/renderer/render_widget.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698