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

Side by Side Diff: chrome/test/perf/frame_rate/frame_rate_tests.cc

Issue 7982007: add "did it run on GPU" check to frame_rate_tests.cc using AutomationProxy tracing feature (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: added templated TraceEvent::GetArgAsIntType Created 9 years, 1 month 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
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <map> 5 #include <map>
6 6
7 #include "base/file_util.h" 7 #include "base/file_util.h"
8 #include "base/path_service.h" 8 #include "base/path_service.h"
9 #include "base/string_number_conversions.h" 9 #include "base/string_number_conversions.h"
10 #include "base/test/test_timeouts.h" 10 #include "base/test/test_timeouts.h"
11 #include "base/test/trace_event_analyzer.h"
11 #include "base/utf_string_conversions.h" 12 #include "base/utf_string_conversions.h"
12 #include "chrome/common/chrome_paths.h" 13 #include "chrome/common/chrome_paths.h"
13 #include "chrome/common/chrome_switches.h" 14 #include "chrome/common/chrome_switches.h"
15 #include "chrome/test/automation/automation_proxy.h"
14 #include "chrome/test/automation/tab_proxy.h" 16 #include "chrome/test/automation/tab_proxy.h"
15 #include "chrome/test/ui/javascript_test_util.h" 17 #include "chrome/test/ui/javascript_test_util.h"
16 #include "chrome/test/ui/ui_perf_test.h" 18 #include "chrome/test/ui/ui_perf_test.h"
17 #include "net/base/net_util.h" 19 #include "net/base/net_util.h"
20 #include "ui/gfx/gl/gl_implementation.h"
18 #include "ui/gfx/gl/gl_switches.h" 21 #include "ui/gfx/gl/gl_switches.h"
19 22
20 namespace { 23 namespace {
21 24
22 enum FrameRateTestFlags { 25 enum FrameRateTestFlags {
23 kMakeBodyComposited = 1 << 0, 26 kMakeBodyComposited = 1 << 0,
24 kDisableVsync = 1 << 1, 27 kDisableVsync = 1 << 1,
25 kDisableGpu = 1 << 2, 28 kDisableGpu = 1 << 2,
26 kUseReferenceBuild = 1 << 3, 29 kUseReferenceBuild = 1 << 3,
27 kInternal = 1 << 4, 30 kInternal = 1 << 4,
(...skipping 18 matching lines...) Expand all
46 public: 49 public:
47 FrameRateTest() { 50 FrameRateTest() {
48 show_window_ = true; 51 show_window_ = true;
49 dom_automation_enabled_ = true; 52 dom_automation_enabled_ = true;
50 // Since this is a performance test, try to use the host machine's GPU 53 // Since this is a performance test, try to use the host machine's GPU
51 // instead of falling back to software-rendering. 54 // instead of falling back to software-rendering.
52 force_use_osmesa_ = false; 55 force_use_osmesa_ = false;
53 disable_accelerated_compositing_ = false; 56 disable_accelerated_compositing_ = false;
54 } 57 }
55 58
59 virtual bool IsReferenceBuild() const {
60 return (GetParam() & kUseReferenceBuild);
61 }
62
56 virtual FilePath GetDataPath(const std::string& name) { 63 virtual FilePath GetDataPath(const std::string& name) {
57 // Make sure the test data is checked out. 64 // Make sure the test data is checked out.
58 FilePath test_path; 65 FilePath test_path;
59 PathService::Get(chrome::DIR_TEST_DATA, &test_path); 66 PathService::Get(chrome::DIR_TEST_DATA, &test_path);
60 test_path = test_path.Append(FILE_PATH_LITERAL("perf")); 67 test_path = test_path.Append(FILE_PATH_LITERAL("perf"));
61 test_path = test_path.Append(FILE_PATH_LITERAL("frame_rate")); 68 test_path = test_path.Append(FILE_PATH_LITERAL("frame_rate"));
62 if (GetParam() & kInternal) { 69 if (GetParam() & kInternal) {
63 test_path = test_path.Append(FILE_PATH_LITERAL("private")); 70 test_path = test_path.Append(FILE_PATH_LITERAL("private"));
64 } else { 71 } else {
65 test_path = test_path.Append(FILE_PATH_LITERAL("content")); 72 test_path = test_path.Append(FILE_PATH_LITERAL("content"));
66 } 73 }
67 test_path = test_path.AppendASCII(name); 74 test_path = test_path.AppendASCII(name);
68 return test_path; 75 return test_path;
69 } 76 }
70 77
71 virtual void SetUp() { 78 virtual void SetUp() {
72 if (GetParam() & kUseReferenceBuild) { 79 if (IsReferenceBuild()) {
73 UseReferenceBuild(); 80 UseReferenceBuild();
74 } 81 }
75 82
76 // UI tests boot up render views starting from about:blank. This causes 83 // UI tests boot up render views starting from about:blank. This causes
77 // the renderer to start up thinking it cannot use the GPU. To work 84 // the renderer to start up thinking it cannot use the GPU. To work
78 // around that, and allow the frame rate test to use the GPU, we must 85 // around that, and allow the frame rate test to use the GPU, we must
79 // pass kAllowWebUICompositing. 86 // pass kAllowWebUICompositing.
80 launch_arguments_.AppendSwitch(switches::kAllowWebUICompositing); 87 launch_arguments_.AppendSwitch(switches::kAllowWebUICompositing);
81 88
82 if (GetParam() & kDisableGpu) { 89 if (GetParam() & kDisableGpu) {
83 launch_arguments_.AppendSwitch(switches::kDisableAcceleratedCompositing); 90 launch_arguments_.AppendSwitch(switches::kDisableAcceleratedCompositing);
84 launch_arguments_.AppendSwitch(switches::kDisableExperimentalWebGL); 91 launch_arguments_.AppendSwitch(switches::kDisableExperimentalWebGL);
85 } 92 }
86 93
87 if (GetParam() & kDisableVsync) { 94 if (GetParam() & kDisableVsync) {
88 launch_arguments_.AppendSwitch(switches::kDisableGpuVsync); 95 launch_arguments_.AppendSwitch(switches::kDisableGpuVsync);
89 } 96 }
90 97
91 UIPerfTest::SetUp(); 98 UIPerfTest::SetUp();
92 } 99 }
93 100
94 void RunTest(const std::string& name) { 101 void RunTest(const std::string& name) {
102 using namespace trace_analyzer;
nduca 2011/11/01 19:17:49 why using here only? That feels anomalous.
jbates 2011/11/03 00:51:07 This is actually done in lots of other chromium co
95 FilePath test_path = GetDataPath(name); 103 FilePath test_path = GetDataPath(name);
96 ASSERT_TRUE(file_util::DirectoryExists(test_path)) 104 ASSERT_TRUE(file_util::DirectoryExists(test_path))
97 << "Missing test directory: " << test_path.value(); 105 << "Missing test directory: " << test_path.value();
98 106
99 test_path = test_path.Append(FILE_PATH_LITERAL("test.html")); 107 test_path = test_path.Append(FILE_PATH_LITERAL("test.html"));
100 108
101 scoped_refptr<TabProxy> tab(GetActiveTab()); 109 scoped_refptr<TabProxy> tab(GetActiveTab());
102 ASSERT_TRUE(tab.get()); 110 ASSERT_TRUE(tab.get());
103 111
104 ASSERT_EQ(AUTOMATION_MSG_NAVIGATION_SUCCESS, 112 ASSERT_EQ(AUTOMATION_MSG_NAVIGATION_SUCCESS,
105 tab->NavigateToURL(net::FilePathToFileURL(test_path))); 113 tab->NavigateToURL(net::FilePathToFileURL(test_path)));
106 114
107 if (GetParam() & kMakeBodyComposited) { 115 if (GetParam() & kMakeBodyComposited) {
108 ASSERT_TRUE(tab->NavigateToURLAsync( 116 ASSERT_TRUE(tab->NavigateToURLAsync(
109 GURL("javascript:__make_body_composited();"))); 117 GURL("javascript:__make_body_composited();")));
110 } 118 }
111 119
120 // TODO(jbates): remove this check when ref builds are updated.
121 if (!IsReferenceBuild()) {
nduca 2011/11/01 19:17:49 Why not just update the ref builds now?
jbates 2011/11/03 00:51:07 Either this needs to be split up into the test cha
jbates 2011/11/04 22:30:39 Actually, thinking this over more... we probably w
122 // Start tracing category "test_frame_rate_tests".
123 ASSERT_TRUE(automation()->BeginTracing("test_frame_rate_tests"));
124 }
125
112 // Block until initialization completes. 126 // Block until initialization completes.
113 ASSERT_TRUE(WaitUntilJavaScriptCondition( 127 ASSERT_TRUE(WaitUntilJavaScriptCondition(
114 tab, L"", L"window.domAutomationController.send(__initialized);", 128 tab, L"", L"window.domAutomationController.send(__initialized);",
115 TestTimeouts::large_test_timeout_ms())); 129 TestTimeouts::large_test_timeout_ms()));
116 130
117 // Start the tests. 131 // Start the tests.
118 ASSERT_TRUE(tab->NavigateToURLAsync(GURL("javascript:__start_all();"))); 132 ASSERT_TRUE(tab->NavigateToURLAsync(GURL("javascript:__start_all();")));
119 133
120 // Block until the tests completes. 134 // Block until the tests completes.
121 ASSERT_TRUE(WaitUntilJavaScriptCondition( 135 ASSERT_TRUE(WaitUntilJavaScriptCondition(
122 tab, L"", L"window.domAutomationController.send(!__running_all);", 136 tab, L"", L"window.domAutomationController.send(!__running_all);",
123 TestTimeouts::large_test_timeout_ms())); 137 TestTimeouts::large_test_timeout_ms()));
124 138
139 std::string json_events;
140 // TODO(jbates): remove this check when ref builds are updated.
141 if (!IsReferenceBuild()) {
142 // Stop tracing.
143 ASSERT_TRUE(automation()->EndTracing(&json_events));
144 }
145
125 // Read out the results. 146 // Read out the results.
126 std::wstring json; 147 std::wstring json;
127 ASSERT_TRUE(tab->ExecuteAndExtractString( 148 ASSERT_TRUE(tab->ExecuteAndExtractString(
128 L"", 149 L"",
129 L"window.domAutomationController.send(" 150 L"window.domAutomationController.send("
130 L"JSON.stringify(__calc_results_total()));", 151 L"JSON.stringify(__calc_results_total()));",
131 &json)); 152 &json));
132 153
133 std::map<std::string, std::string> results; 154 std::map<std::string, std::string> results;
134 ASSERT_TRUE(JsonDictionaryToMap(WideToUTF8(json), &results)); 155 ASSERT_TRUE(JsonDictionaryToMap(WideToUTF8(json), &results));
135 156
136 ASSERT_TRUE(results.find("mean") != results.end()); 157 ASSERT_TRUE(results.find("mean") != results.end());
137 ASSERT_TRUE(results.find("sigma") != results.end()); 158 ASSERT_TRUE(results.find("sigma") != results.end());
138 ASSERT_TRUE(results.find("gestures") != results.end()); 159 ASSERT_TRUE(results.find("gestures") != results.end());
139 ASSERT_TRUE(results.find("means") != results.end()); 160 ASSERT_TRUE(results.find("means") != results.end());
140 ASSERT_TRUE(results.find("sigmas") != results.end()); 161 ASSERT_TRUE(results.find("sigmas") != results.end());
141 162
163 std::string gpu_suffix;
164 // TODO(jbates): remove this check when ref builds are updated.
165 if (!IsReferenceBuild()) {
166 // Check trace for GPU accleration.
nduca 2011/11/01 19:17:49 I can haz new function?
jbates 2011/11/03 00:51:07 Done.
167 scoped_ptr<TraceAnalyzer> analyzer(TraceAnalyzer::Create(json_events));
168 const TraceEvent* gpu_event = analyzer->FindOneEvent(
169 Query(EVENT_NAME) == Query::String("SwapBuffers") &&
170 Query(EVENT_HAS_ARG, "GLImpl"));
171 gfx::GLImplementation gl_impl = gfx::kGLImplementationNone;
172 if (gpu_event)
173 gpu_event->GetArgAsIntType("GLImpl", &gl_impl);
174 bool is_GPU = (gl_impl == gfx::kGLImplementationDesktopGL ||
175 gl_impl == gfx::kGLImplementationEGLGLES2);
176
177 // Verify that sanity-check DoDeferredUpdate event exists.
178 ASSERT_TRUE(analyzer->FindOneEvent(Query(EVENT_NAME) ==
179 Query::String("DoDeferredUpdate")));
180
181 // If GPU acceleration is requested, set the appropriate suffix.
182 // _swfb means software fallback (GPU acceleration requested but not
183 // available).
184 if (is_GPU)
185 gpu_suffix = "_gpu";
186 else if (GetParam() & kMakeBodyComposited)
187 gpu_suffix = "_swfb";
nduca 2011/11/01 19:17:49 Will we still have the _comp suffix? WE have an ex
jbates 2011/11/03 00:51:07 I got rid of swfb, because we can infer that from
188 }
189
142 std::string trace_name = "fps"; 190 std::string trace_name = "fps";
143 trace_name += GetSuffixForTestFlags(GetParam()); 191 trace_name += GetSuffixForTestFlags(GetParam()) + gpu_suffix;
nduca 2011/11/01 19:17:49 Merge this with the GetSuffixForTest bit? E.g. Get
jbates 2011/11/03 00:51:07 Done.
144 printf("GESTURES %s: %s= [%s] [%s] [%s]\n", name.c_str(), 192 printf("GESTURES %s: %s= [%s] [%s] [%s]\n", name.c_str(),
145 trace_name.c_str(), 193 trace_name.c_str(),
146 results["gestures"].c_str(), 194 results["gestures"].c_str(),
147 results["means"].c_str(), 195 results["means"].c_str(),
148 results["sigmas"].c_str()); 196 results["sigmas"].c_str());
149 197
150 std::string mean_and_error = results["mean"] + "," + results["sigma"]; 198 std::string mean_and_error = results["mean"] + "," + results["sigma"];
151 PrintResultMeanAndError(name, "", trace_name, mean_and_error, 199 PrintResultMeanAndError(name, "", trace_name, mean_and_error,
152 "frames-per-second", true); 200 "frames-per-second", true);
153 } 201 }
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
201 kInternal, 249 kInternal,
202 kInternal | kDisableVsync, 250 kInternal | kDisableVsync,
203 kInternal | kDisableGpu, 251 kInternal | kDisableGpu,
204 kInternal | kUseReferenceBuild, 252 kInternal | kUseReferenceBuild,
205 kInternal | kDisableVsync | kUseReferenceBuild)); 253 kInternal | kDisableVsync | kUseReferenceBuild));
206 254
207 INTERNAL_FRAME_RATE_TEST_CANVAS_WITH_AND_WITHOUT_NOVSYNC(fishbowl) 255 INTERNAL_FRAME_RATE_TEST_CANVAS_WITH_AND_WITHOUT_NOVSYNC(fishbowl)
208 INTERNAL_FRAME_RATE_TEST_CANVAS_WITH_AND_WITHOUT_NOVSYNC(speedreading) 256 INTERNAL_FRAME_RATE_TEST_CANVAS_WITH_AND_WITHOUT_NOVSYNC(speedreading)
209 257
210 } // namespace 258 } // namespace
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698