| OLD | NEW |
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 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 "cc/trees/layer_tree_host.h" | 5 #include "cc/trees/layer_tree_host.h" |
| 6 | 6 |
| 7 #include <sstream> | 7 #include <sstream> |
| 8 | 8 |
| 9 #include "base/files/file_path.h" | 9 #include "base/files/file_path.h" |
| 10 #include "base/files/file_util.h" | 10 #include "base/files/file_util.h" |
| (...skipping 26 matching lines...) Expand all Loading... |
| 37 LayerTreeHostPerfTest() | 37 LayerTreeHostPerfTest() |
| 38 : draw_timer_(kWarmupRuns, | 38 : draw_timer_(kWarmupRuns, |
| 39 base::TimeDelta::FromMilliseconds(kTimeLimitMillis), | 39 base::TimeDelta::FromMilliseconds(kTimeLimitMillis), |
| 40 kTimeCheckInterval), | 40 kTimeCheckInterval), |
| 41 commit_timer_(0, base::TimeDelta(), 1), | 41 commit_timer_(0, base::TimeDelta(), 1), |
| 42 full_damage_each_frame_(false), | 42 full_damage_each_frame_(false), |
| 43 begin_frame_driven_drawing_(false), | 43 begin_frame_driven_drawing_(false), |
| 44 measure_commit_cost_(false) { | 44 measure_commit_cost_(false) { |
| 45 } | 45 } |
| 46 | 46 |
| 47 virtual void InitializeSettings(LayerTreeSettings* settings) OVERRIDE { | 47 virtual void InitializeSettings(LayerTreeSettings* settings) override { |
| 48 settings->throttle_frame_production = false; | 48 settings->throttle_frame_production = false; |
| 49 } | 49 } |
| 50 | 50 |
| 51 virtual void BeginTest() OVERRIDE { | 51 virtual void BeginTest() override { |
| 52 BuildTree(); | 52 BuildTree(); |
| 53 PostSetNeedsCommitToMainThread(); | 53 PostSetNeedsCommitToMainThread(); |
| 54 } | 54 } |
| 55 | 55 |
| 56 virtual void BeginMainFrame(const BeginFrameArgs& args) OVERRIDE { | 56 virtual void BeginMainFrame(const BeginFrameArgs& args) override { |
| 57 if (begin_frame_driven_drawing_ && !TestEnded()) { | 57 if (begin_frame_driven_drawing_ && !TestEnded()) { |
| 58 layer_tree_host()->SetNeedsAnimate(); | 58 layer_tree_host()->SetNeedsAnimate(); |
| 59 layer_tree_host()->SetNextCommitForcesRedraw(); | 59 layer_tree_host()->SetNextCommitForcesRedraw(); |
| 60 } | 60 } |
| 61 } | 61 } |
| 62 | 62 |
| 63 virtual void BeginCommitOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { | 63 virtual void BeginCommitOnThread(LayerTreeHostImpl* host_impl) override { |
| 64 if (measure_commit_cost_) | 64 if (measure_commit_cost_) |
| 65 commit_timer_.Start(); | 65 commit_timer_.Start(); |
| 66 } | 66 } |
| 67 | 67 |
| 68 virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) OVERRIDE { | 68 virtual void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) override { |
| 69 if (measure_commit_cost_ && draw_timer_.IsWarmedUp()) { | 69 if (measure_commit_cost_ && draw_timer_.IsWarmedUp()) { |
| 70 commit_timer_.NextLap(); | 70 commit_timer_.NextLap(); |
| 71 } | 71 } |
| 72 } | 72 } |
| 73 | 73 |
| 74 virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) OVERRIDE { | 74 virtual void DrawLayersOnThread(LayerTreeHostImpl* impl) override { |
| 75 if (TestEnded() || CleanUpStarted()) | 75 if (TestEnded() || CleanUpStarted()) |
| 76 return; | 76 return; |
| 77 draw_timer_.NextLap(); | 77 draw_timer_.NextLap(); |
| 78 if (draw_timer_.HasTimeLimitExpired()) { | 78 if (draw_timer_.HasTimeLimitExpired()) { |
| 79 CleanUpAndEndTest(impl); | 79 CleanUpAndEndTest(impl); |
| 80 return; | 80 return; |
| 81 } | 81 } |
| 82 if (!begin_frame_driven_drawing_) | 82 if (!begin_frame_driven_drawing_) |
| 83 impl->SetNeedsRedraw(); | 83 impl->SetNeedsRedraw(); |
| 84 if (full_damage_each_frame_) | 84 if (full_damage_each_frame_) |
| 85 impl->SetFullRootLayerDamage(); | 85 impl->SetFullRootLayerDamage(); |
| 86 } | 86 } |
| 87 | 87 |
| 88 virtual void CleanUpAndEndTest(LayerTreeHostImpl* host_impl) { EndTest(); } | 88 virtual void CleanUpAndEndTest(LayerTreeHostImpl* host_impl) { EndTest(); } |
| 89 | 89 |
| 90 virtual bool CleanUpStarted() { return false; } | 90 virtual bool CleanUpStarted() { return false; } |
| 91 | 91 |
| 92 virtual void BuildTree() {} | 92 virtual void BuildTree() {} |
| 93 | 93 |
| 94 virtual void AfterTest() OVERRIDE { | 94 virtual void AfterTest() override { |
| 95 CHECK(!test_name_.empty()) << "Must SetTestName() before AfterTest()."; | 95 CHECK(!test_name_.empty()) << "Must SetTestName() before AfterTest()."; |
| 96 perf_test::PrintResult("layer_tree_host_frame_time", "", test_name_, | 96 perf_test::PrintResult("layer_tree_host_frame_time", "", test_name_, |
| 97 1000 * draw_timer_.MsPerLap(), "us", true); | 97 1000 * draw_timer_.MsPerLap(), "us", true); |
| 98 if (measure_commit_cost_) { | 98 if (measure_commit_cost_) { |
| 99 perf_test::PrintResult("layer_tree_host_commit_time", "", test_name_, | 99 perf_test::PrintResult("layer_tree_host_commit_time", "", test_name_, |
| 100 1000 * commit_timer_.MsPerLap(), "us", true); | 100 1000 * commit_timer_.MsPerLap(), "us", true); |
| 101 } | 101 } |
| 102 } | 102 } |
| 103 | 103 |
| 104 protected: | 104 protected: |
| (...skipping 19 matching lines...) Expand all Loading... |
| 124 test_name_ = name; | 124 test_name_ = name; |
| 125 } | 125 } |
| 126 | 126 |
| 127 void ReadTestFile(const std::string& name) { | 127 void ReadTestFile(const std::string& name) { |
| 128 base::FilePath test_data_dir; | 128 base::FilePath test_data_dir; |
| 129 ASSERT_TRUE(PathService::Get(CCPaths::DIR_TEST_DATA, &test_data_dir)); | 129 ASSERT_TRUE(PathService::Get(CCPaths::DIR_TEST_DATA, &test_data_dir)); |
| 130 base::FilePath json_file = test_data_dir.AppendASCII(name + ".json"); | 130 base::FilePath json_file = test_data_dir.AppendASCII(name + ".json"); |
| 131 ASSERT_TRUE(base::ReadFileToString(json_file, &json_)); | 131 ASSERT_TRUE(base::ReadFileToString(json_file, &json_)); |
| 132 } | 132 } |
| 133 | 133 |
| 134 virtual void BuildTree() OVERRIDE { | 134 virtual void BuildTree() override { |
| 135 gfx::Size viewport = gfx::Size(720, 1038); | 135 gfx::Size viewport = gfx::Size(720, 1038); |
| 136 layer_tree_host()->SetViewportSize(viewport); | 136 layer_tree_host()->SetViewportSize(viewport); |
| 137 scoped_refptr<Layer> root = ParseTreeFromJson(json_, | 137 scoped_refptr<Layer> root = ParseTreeFromJson(json_, |
| 138 &fake_content_layer_client_); | 138 &fake_content_layer_client_); |
| 139 ASSERT_TRUE(root.get()); | 139 ASSERT_TRUE(root.get()); |
| 140 layer_tree_host()->SetRootLayer(root); | 140 layer_tree_host()->SetRootLayer(root); |
| 141 } | 141 } |
| 142 | 142 |
| 143 private: | 143 private: |
| 144 std::string json_; | 144 std::string json_; |
| (...skipping 26 matching lines...) Expand all Loading... |
| 171 full_damage_each_frame_ = true; | 171 full_damage_each_frame_ = true; |
| 172 SetTestName("10_10_threaded_impl_side_full_damage_each_frame"); | 172 SetTestName("10_10_threaded_impl_side_full_damage_each_frame"); |
| 173 ReadTestFile("10_10_layer_tree"); | 173 ReadTestFile("10_10_layer_tree"); |
| 174 RunTestWithImplSidePainting(); | 174 RunTestWithImplSidePainting(); |
| 175 } | 175 } |
| 176 | 176 |
| 177 // Invalidates a leaf layer in the tree on the main thread after every commit. | 177 // Invalidates a leaf layer in the tree on the main thread after every commit. |
| 178 class LayerTreeHostPerfTestLeafInvalidates | 178 class LayerTreeHostPerfTestLeafInvalidates |
| 179 : public LayerTreeHostPerfTestJsonReader { | 179 : public LayerTreeHostPerfTestJsonReader { |
| 180 public: | 180 public: |
| 181 virtual void BuildTree() OVERRIDE { | 181 virtual void BuildTree() override { |
| 182 LayerTreeHostPerfTestJsonReader::BuildTree(); | 182 LayerTreeHostPerfTestJsonReader::BuildTree(); |
| 183 | 183 |
| 184 // Find a leaf layer. | 184 // Find a leaf layer. |
| 185 for (layer_to_invalidate_ = layer_tree_host()->root_layer(); | 185 for (layer_to_invalidate_ = layer_tree_host()->root_layer(); |
| 186 layer_to_invalidate_->children().size(); | 186 layer_to_invalidate_->children().size(); |
| 187 layer_to_invalidate_ = layer_to_invalidate_->children()[0].get()) { | 187 layer_to_invalidate_ = layer_to_invalidate_->children()[0].get()) { |
| 188 } | 188 } |
| 189 } | 189 } |
| 190 | 190 |
| 191 virtual void DidCommitAndDrawFrame() OVERRIDE { | 191 virtual void DidCommitAndDrawFrame() override { |
| 192 if (TestEnded()) | 192 if (TestEnded()) |
| 193 return; | 193 return; |
| 194 | 194 |
| 195 layer_to_invalidate_->SetOpacity( | 195 layer_to_invalidate_->SetOpacity( |
| 196 layer_to_invalidate_->opacity() != 1.f ? 1.f : 0.5f); | 196 layer_to_invalidate_->opacity() != 1.f ? 1.f : 0.5f); |
| 197 } | 197 } |
| 198 | 198 |
| 199 protected: | 199 protected: |
| 200 Layer* layer_to_invalidate_; | 200 Layer* layer_to_invalidate_; |
| 201 }; | 201 }; |
| (...skipping 12 matching lines...) Expand all Loading... |
| 214 RunTestWithImplSidePainting(); | 214 RunTestWithImplSidePainting(); |
| 215 } | 215 } |
| 216 | 216 |
| 217 // Simulates main-thread scrolling on each frame. | 217 // Simulates main-thread scrolling on each frame. |
| 218 class ScrollingLayerTreePerfTest : public LayerTreeHostPerfTestJsonReader { | 218 class ScrollingLayerTreePerfTest : public LayerTreeHostPerfTestJsonReader { |
| 219 public: | 219 public: |
| 220 ScrollingLayerTreePerfTest() | 220 ScrollingLayerTreePerfTest() |
| 221 : LayerTreeHostPerfTestJsonReader() { | 221 : LayerTreeHostPerfTestJsonReader() { |
| 222 } | 222 } |
| 223 | 223 |
| 224 virtual void BuildTree() OVERRIDE { | 224 virtual void BuildTree() override { |
| 225 LayerTreeHostPerfTestJsonReader::BuildTree(); | 225 LayerTreeHostPerfTestJsonReader::BuildTree(); |
| 226 scrollable_ = layer_tree_host()->root_layer()->children()[1]; | 226 scrollable_ = layer_tree_host()->root_layer()->children()[1]; |
| 227 ASSERT_TRUE(scrollable_.get()); | 227 ASSERT_TRUE(scrollable_.get()); |
| 228 } | 228 } |
| 229 | 229 |
| 230 virtual void Layout() OVERRIDE { | 230 virtual void Layout() override { |
| 231 if (TestEnded()) | 231 if (TestEnded()) |
| 232 return; | 232 return; |
| 233 static const gfx::Vector2d delta = gfx::Vector2d(0, 10); | 233 static const gfx::Vector2d delta = gfx::Vector2d(0, 10); |
| 234 scrollable_->SetScrollOffset( | 234 scrollable_->SetScrollOffset( |
| 235 gfx::ScrollOffsetWithDelta(scrollable_->scroll_offset(), delta)); | 235 gfx::ScrollOffsetWithDelta(scrollable_->scroll_offset(), delta)); |
| 236 } | 236 } |
| 237 | 237 |
| 238 private: | 238 private: |
| 239 scoped_refptr<Layer> scrollable_; | 239 scoped_refptr<Layer> scrollable_; |
| 240 }; | 240 }; |
| (...skipping 14 matching lines...) Expand all Loading... |
| 255 | 255 |
| 256 // Simulates main-thread scrolling on each frame. | 256 // Simulates main-thread scrolling on each frame. |
| 257 class BrowserCompositorInvalidateLayerTreePerfTest | 257 class BrowserCompositorInvalidateLayerTreePerfTest |
| 258 : public LayerTreeHostPerfTestJsonReader { | 258 : public LayerTreeHostPerfTestJsonReader { |
| 259 public: | 259 public: |
| 260 BrowserCompositorInvalidateLayerTreePerfTest() | 260 BrowserCompositorInvalidateLayerTreePerfTest() |
| 261 : LayerTreeHostPerfTestJsonReader(), | 261 : LayerTreeHostPerfTestJsonReader(), |
| 262 next_sync_point_(1), | 262 next_sync_point_(1), |
| 263 clean_up_started_(false) {} | 263 clean_up_started_(false) {} |
| 264 | 264 |
| 265 virtual void BuildTree() OVERRIDE { | 265 virtual void BuildTree() override { |
| 266 LayerTreeHostPerfTestJsonReader::BuildTree(); | 266 LayerTreeHostPerfTestJsonReader::BuildTree(); |
| 267 tab_contents_ = | 267 tab_contents_ = |
| 268 static_cast<TextureLayer*>( | 268 static_cast<TextureLayer*>( |
| 269 layer_tree_host()->root_layer()->children()[0]-> | 269 layer_tree_host()->root_layer()->children()[0]-> |
| 270 children()[0]-> | 270 children()[0]-> |
| 271 children()[0]-> | 271 children()[0]-> |
| 272 children()[0].get()); | 272 children()[0].get()); |
| 273 ASSERT_TRUE(tab_contents_.get()); | 273 ASSERT_TRUE(tab_contents_.get()); |
| 274 } | 274 } |
| 275 | 275 |
| 276 virtual void WillCommit() OVERRIDE { | 276 virtual void WillCommit() override { |
| 277 if (CleanUpStarted()) | 277 if (CleanUpStarted()) |
| 278 return; | 278 return; |
| 279 gpu::Mailbox gpu_mailbox; | 279 gpu::Mailbox gpu_mailbox; |
| 280 std::ostringstream name_stream; | 280 std::ostringstream name_stream; |
| 281 name_stream << "name" << next_sync_point_; | 281 name_stream << "name" << next_sync_point_; |
| 282 gpu_mailbox.SetName( | 282 gpu_mailbox.SetName( |
| 283 reinterpret_cast<const int8*>(name_stream.str().c_str())); | 283 reinterpret_cast<const int8*>(name_stream.str().c_str())); |
| 284 scoped_ptr<SingleReleaseCallback> callback = SingleReleaseCallback::Create( | 284 scoped_ptr<SingleReleaseCallback> callback = SingleReleaseCallback::Create( |
| 285 base::Bind(&EmptyReleaseCallback)); | 285 base::Bind(&EmptyReleaseCallback)); |
| 286 TextureMailbox mailbox(gpu_mailbox, GL_TEXTURE_2D, next_sync_point_); | 286 TextureMailbox mailbox(gpu_mailbox, GL_TEXTURE_2D, next_sync_point_); |
| 287 next_sync_point_++; | 287 next_sync_point_++; |
| 288 | 288 |
| 289 tab_contents_->SetTextureMailbox(mailbox, callback.Pass()); | 289 tab_contents_->SetTextureMailbox(mailbox, callback.Pass()); |
| 290 } | 290 } |
| 291 | 291 |
| 292 virtual void DidCommit() OVERRIDE { | 292 virtual void DidCommit() override { |
| 293 if (CleanUpStarted()) | 293 if (CleanUpStarted()) |
| 294 return; | 294 return; |
| 295 layer_tree_host()->SetNeedsCommit(); | 295 layer_tree_host()->SetNeedsCommit(); |
| 296 } | 296 } |
| 297 | 297 |
| 298 virtual void CleanUpAndEndTest(LayerTreeHostImpl* host_impl) OVERRIDE { | 298 virtual void CleanUpAndEndTest(LayerTreeHostImpl* host_impl) override { |
| 299 clean_up_started_ = true; | 299 clean_up_started_ = true; |
| 300 MainThreadTaskRunner()->PostTask( | 300 MainThreadTaskRunner()->PostTask( |
| 301 FROM_HERE, | 301 FROM_HERE, |
| 302 base::Bind(&BrowserCompositorInvalidateLayerTreePerfTest:: | 302 base::Bind(&BrowserCompositorInvalidateLayerTreePerfTest:: |
| 303 CleanUpAndEndTestOnMainThread, | 303 CleanUpAndEndTestOnMainThread, |
| 304 base::Unretained(this))); | 304 base::Unretained(this))); |
| 305 } | 305 } |
| 306 | 306 |
| 307 void CleanUpAndEndTestOnMainThread() { | 307 void CleanUpAndEndTestOnMainThread() { |
| 308 tab_contents_->SetTextureMailbox(TextureMailbox(), | 308 tab_contents_->SetTextureMailbox(TextureMailbox(), |
| 309 scoped_ptr<SingleReleaseCallback>()); | 309 scoped_ptr<SingleReleaseCallback>()); |
| 310 EndTest(); | 310 EndTest(); |
| 311 } | 311 } |
| 312 | 312 |
| 313 virtual bool CleanUpStarted() OVERRIDE { return clean_up_started_; } | 313 virtual bool CleanUpStarted() override { return clean_up_started_; } |
| 314 | 314 |
| 315 private: | 315 private: |
| 316 scoped_refptr<TextureLayer> tab_contents_; | 316 scoped_refptr<TextureLayer> tab_contents_; |
| 317 unsigned next_sync_point_; | 317 unsigned next_sync_point_; |
| 318 bool clean_up_started_; | 318 bool clean_up_started_; |
| 319 }; | 319 }; |
| 320 | 320 |
| 321 TEST_F(BrowserCompositorInvalidateLayerTreePerfTest, DenseBrowserUI) { | 321 TEST_F(BrowserCompositorInvalidateLayerTreePerfTest, DenseBrowserUI) { |
| 322 measure_commit_cost_ = true; | 322 measure_commit_cost_ = true; |
| 323 SetTestName("dense_layer_tree"); | 323 SetTestName("dense_layer_tree"); |
| 324 ReadTestFile("dense_layer_tree"); | 324 ReadTestFile("dense_layer_tree"); |
| 325 RunTestWithImplSidePainting(); | 325 RunTestWithImplSidePainting(); |
| 326 } | 326 } |
| 327 | 327 |
| 328 // Simulates a page with several large, transformed and animated layers. | 328 // Simulates a page with several large, transformed and animated layers. |
| 329 TEST_F(LayerTreeHostPerfTestJsonReader, HeavyPageThreadedImplSide) { | 329 TEST_F(LayerTreeHostPerfTestJsonReader, HeavyPageThreadedImplSide) { |
| 330 begin_frame_driven_drawing_ = true; | 330 begin_frame_driven_drawing_ = true; |
| 331 measure_commit_cost_ = true; | 331 measure_commit_cost_ = true; |
| 332 SetTestName("heavy_page"); | 332 SetTestName("heavy_page"); |
| 333 ReadTestFile("heavy_layer_tree"); | 333 ReadTestFile("heavy_layer_tree"); |
| 334 RunTestWithImplSidePainting(); | 334 RunTestWithImplSidePainting(); |
| 335 } | 335 } |
| 336 | 336 |
| 337 } // namespace | 337 } // namespace |
| 338 } // namespace cc | 338 } // namespace cc |
| OLD | NEW |