| OLD | NEW |
| 1 // Copyright 2011 The Chromium Authors. All rights reserved. | 1 // Copyright 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 "cc/trees/single_thread_proxy.h" | 5 #include "cc/trees/single_thread_proxy.h" |
| 6 | 6 |
| 7 #include "base/auto_reset.h" | 7 #include "base/auto_reset.h" |
| 8 #include "base/debug/trace_event.h" | 8 #include "base/debug/trace_event.h" |
| 9 #include "cc/debug/benchmark_instrumentation.h" | 9 #include "cc/debug/benchmark_instrumentation.h" |
| 10 #include "cc/output/context_provider.h" | 10 #include "cc/output/context_provider.h" |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 75 layer_tree_host_impl_->Readback(pixels, rect); | 75 layer_tree_host_impl_->Readback(pixels, rect); |
| 76 | 76 |
| 77 if (layer_tree_host_impl_->IsContextLost()) | 77 if (layer_tree_host_impl_->IsContextLost()) |
| 78 return false; | 78 return false; |
| 79 } | 79 } |
| 80 | 80 |
| 81 return true; | 81 return true; |
| 82 } | 82 } |
| 83 | 83 |
| 84 void SingleThreadProxy::FinishAllRendering() { | 84 void SingleThreadProxy::FinishAllRendering() { |
| 85 TRACE_EVENT0("cc", "SingleThreadProxy::FinishAllRendering"); |
| 85 DCHECK(Proxy::IsMainThread()); | 86 DCHECK(Proxy::IsMainThread()); |
| 86 { | 87 { |
| 87 DebugScopedSetImplThread impl(this); | 88 DebugScopedSetImplThread impl(this); |
| 88 layer_tree_host_impl_->FinishAllRendering(); | 89 layer_tree_host_impl_->FinishAllRendering(); |
| 89 } | 90 } |
| 90 } | 91 } |
| 91 | 92 |
| 92 bool SingleThreadProxy::IsStarted() const { | 93 bool SingleThreadProxy::IsStarted() const { |
| 93 DCHECK(Proxy::IsMainThread()); | 94 DCHECK(Proxy::IsMainThread()); |
| 94 return layer_tree_host_impl_; | 95 return layer_tree_host_impl_; |
| 95 } | 96 } |
| 96 | 97 |
| 97 void SingleThreadProxy::SetLayerTreeHostClientReady() { | 98 void SingleThreadProxy::SetLayerTreeHostClientReady() { |
| 99 TRACE_EVENT0("cc", "SingleThreadProxy::SetLayerTreeHostClientReady"); |
| 98 // Scheduling is controlled by the embedder in the single thread case, so | 100 // Scheduling is controlled by the embedder in the single thread case, so |
| 99 // nothing to do. | 101 // nothing to do. |
| 100 } | 102 } |
| 101 | 103 |
| 102 void SingleThreadProxy::SetVisible(bool visible) { | 104 void SingleThreadProxy::SetVisible(bool visible) { |
| 105 TRACE_EVENT0("cc", "SingleThreadProxy::SetVisible"); |
| 103 DebugScopedSetImplThread impl(this); | 106 DebugScopedSetImplThread impl(this); |
| 104 layer_tree_host_impl_->SetVisible(visible); | 107 layer_tree_host_impl_->SetVisible(visible); |
| 105 | 108 |
| 106 // Changing visibility could change ShouldComposite(). | 109 // Changing visibility could change ShouldComposite(). |
| 107 UpdateBackgroundAnimateTicking(); | 110 UpdateBackgroundAnimateTicking(); |
| 108 } | 111 } |
| 109 | 112 |
| 110 void SingleThreadProxy::CreateAndInitializeOutputSurface() { | 113 void SingleThreadProxy::CreateAndInitializeOutputSurface() { |
| 111 TRACE_EVENT0( | 114 TRACE_EVENT0( |
| 112 "cc", "SingleThreadProxy::CreateAndInitializeOutputSurface"); | 115 "cc", "SingleThreadProxy::CreateAndInitializeOutputSurface"); |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 169 } | 172 } |
| 170 } | 173 } |
| 171 | 174 |
| 172 const RendererCapabilities& SingleThreadProxy::GetRendererCapabilities() const { | 175 const RendererCapabilities& SingleThreadProxy::GetRendererCapabilities() const { |
| 173 DCHECK(Proxy::IsMainThread()); | 176 DCHECK(Proxy::IsMainThread()); |
| 174 DCHECK(!layer_tree_host_->output_surface_lost()); | 177 DCHECK(!layer_tree_host_->output_surface_lost()); |
| 175 return renderer_capabilities_for_main_thread_; | 178 return renderer_capabilities_for_main_thread_; |
| 176 } | 179 } |
| 177 | 180 |
| 178 void SingleThreadProxy::SetNeedsAnimate() { | 181 void SingleThreadProxy::SetNeedsAnimate() { |
| 182 TRACE_EVENT0("cc", "SingleThreadProxy::SetNeedsAnimate"); |
| 179 DCHECK(Proxy::IsMainThread()); | 183 DCHECK(Proxy::IsMainThread()); |
| 180 client_->ScheduleAnimation(); | 184 client_->ScheduleAnimation(); |
| 181 } | 185 } |
| 182 | 186 |
| 183 void SingleThreadProxy::SetNeedsUpdateLayers() { | 187 void SingleThreadProxy::SetNeedsUpdateLayers() { |
| 188 TRACE_EVENT0("cc", "SingleThreadProxy::SetNeedsUpdateLayers"); |
| 184 DCHECK(Proxy::IsMainThread()); | 189 DCHECK(Proxy::IsMainThread()); |
| 185 client_->ScheduleComposite(); | 190 client_->ScheduleComposite(); |
| 186 } | 191 } |
| 187 | 192 |
| 188 void SingleThreadProxy::DoCommit(scoped_ptr<ResourceUpdateQueue> queue) { | 193 void SingleThreadProxy::DoCommit(scoped_ptr<ResourceUpdateQueue> queue) { |
| 194 TRACE_EVENT0("cc", "SingleThreadProxy::DoCommit"); |
| 189 DCHECK(Proxy::IsMainThread()); | 195 DCHECK(Proxy::IsMainThread()); |
| 190 // Commit immediately. | 196 // Commit immediately. |
| 191 { | 197 { |
| 192 DebugScopedSetMainThreadBlocked main_thread_blocked(this); | 198 DebugScopedSetMainThreadBlocked main_thread_blocked(this); |
| 193 DebugScopedSetImplThread impl(this); | 199 DebugScopedSetImplThread impl(this); |
| 194 | 200 |
| 195 // This CapturePostTasks should be destroyed before CommitComplete() is | 201 // This CapturePostTasks should be destroyed before CommitComplete() is |
| 196 // called since that goes out to the embedder, and we want the embedder | 202 // called since that goes out to the embedder, and we want the embedder |
| 197 // to receive its callbacks before that. | 203 // to receive its callbacks before that. |
| 198 BlockingTaskRunner::CapturePostTasks blocked; | 204 BlockingTaskRunner::CapturePostTasks blocked; |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 238 layer_tree_host_->CommitComplete(); | 244 layer_tree_host_->CommitComplete(); |
| 239 next_frame_is_newly_committed_frame_ = true; | 245 next_frame_is_newly_committed_frame_ = true; |
| 240 } | 246 } |
| 241 | 247 |
| 242 void SingleThreadProxy::SetNeedsCommit() { | 248 void SingleThreadProxy::SetNeedsCommit() { |
| 243 DCHECK(Proxy::IsMainThread()); | 249 DCHECK(Proxy::IsMainThread()); |
| 244 client_->ScheduleComposite(); | 250 client_->ScheduleComposite(); |
| 245 } | 251 } |
| 246 | 252 |
| 247 void SingleThreadProxy::SetNeedsRedraw(const gfx::Rect& damage_rect) { | 253 void SingleThreadProxy::SetNeedsRedraw(const gfx::Rect& damage_rect) { |
| 254 TRACE_EVENT0("cc", "SingleThreadProxy::SetNeedsRedraw"); |
| 248 SetNeedsRedrawRectOnImplThread(damage_rect); | 255 SetNeedsRedrawRectOnImplThread(damage_rect); |
| 249 client_->ScheduleComposite(); | 256 client_->ScheduleComposite(); |
| 250 } | 257 } |
| 251 | 258 |
| 252 void SingleThreadProxy::SetNextCommitWaitsForActivation() { | 259 void SingleThreadProxy::SetNextCommitWaitsForActivation() { |
| 253 // There is no activation here other than commit. So do nothing. | 260 // There is no activation here other than commit. So do nothing. |
| 254 } | 261 } |
| 255 | 262 |
| 256 void SingleThreadProxy::SetDeferCommits(bool defer_commits) { | 263 void SingleThreadProxy::SetDeferCommits(bool defer_commits) { |
| 257 // Thread-only feature. | 264 // Thread-only feature. |
| (...skipping 16 matching lines...) Expand all Loading... |
| 274 DebugScopedSetImplThread impl(this); | 281 DebugScopedSetImplThread impl(this); |
| 275 | 282 |
| 276 layer_tree_host_->DeleteContentsTexturesOnImplThread( | 283 layer_tree_host_->DeleteContentsTexturesOnImplThread( |
| 277 layer_tree_host_impl_->resource_provider()); | 284 layer_tree_host_impl_->resource_provider()); |
| 278 layer_tree_host_impl_.reset(); | 285 layer_tree_host_impl_.reset(); |
| 279 } | 286 } |
| 280 layer_tree_host_ = NULL; | 287 layer_tree_host_ = NULL; |
| 281 } | 288 } |
| 282 | 289 |
| 283 void SingleThreadProxy::OnCanDrawStateChanged(bool can_draw) { | 290 void SingleThreadProxy::OnCanDrawStateChanged(bool can_draw) { |
| 291 TRACE_EVENT1( |
| 292 "cc", "SingleThreadProxy::OnCanDrawStateChanged", "can_draw", can_draw); |
| 284 DCHECK(Proxy::IsImplThread()); | 293 DCHECK(Proxy::IsImplThread()); |
| 285 UpdateBackgroundAnimateTicking(); | 294 UpdateBackgroundAnimateTicking(); |
| 286 } | 295 } |
| 287 | 296 |
| 288 void SingleThreadProxy::NotifyReadyToActivate() { | 297 void SingleThreadProxy::NotifyReadyToActivate() { |
| 289 // Thread-only feature. | 298 // Thread-only feature. |
| 290 NOTREACHED(); | 299 NOTREACHED(); |
| 291 } | 300 } |
| 292 | 301 |
| 293 void SingleThreadProxy::SetNeedsRedrawOnImplThread() { | 302 void SingleThreadProxy::SetNeedsRedrawOnImplThread() { |
| (...skipping 19 matching lines...) Expand all Loading... |
| 313 NOTREACHED(); | 322 NOTREACHED(); |
| 314 } | 323 } |
| 315 | 324 |
| 316 void SingleThreadProxy::SetNeedsCommitOnImplThread() { | 325 void SingleThreadProxy::SetNeedsCommitOnImplThread() { |
| 317 client_->ScheduleComposite(); | 326 client_->ScheduleComposite(); |
| 318 } | 327 } |
| 319 | 328 |
| 320 void SingleThreadProxy::PostAnimationEventsToMainThreadOnImplThread( | 329 void SingleThreadProxy::PostAnimationEventsToMainThreadOnImplThread( |
| 321 scoped_ptr<AnimationEventsVector> events, | 330 scoped_ptr<AnimationEventsVector> events, |
| 322 base::Time wall_clock_time) { | 331 base::Time wall_clock_time) { |
| 332 TRACE_EVENT0( |
| 333 "cc", "SingleThreadProxy::PostAnimationEventsToMainThreadOnImplThread"); |
| 323 DCHECK(Proxy::IsImplThread()); | 334 DCHECK(Proxy::IsImplThread()); |
| 324 DebugScopedSetMainThread main(this); | 335 DebugScopedSetMainThread main(this); |
| 325 layer_tree_host_->SetAnimationEvents(events.Pass(), wall_clock_time); | 336 layer_tree_host_->SetAnimationEvents(events.Pass(), wall_clock_time); |
| 326 } | 337 } |
| 327 | 338 |
| 328 bool SingleThreadProxy::ReduceContentsTextureMemoryOnImplThread( | 339 bool SingleThreadProxy::ReduceContentsTextureMemoryOnImplThread( |
| 329 size_t limit_bytes, | 340 size_t limit_bytes, |
| 330 int priority_cutoff) { | 341 int priority_cutoff) { |
| 331 DCHECK(IsImplThread()); | 342 DCHECK(IsImplThread()); |
| 332 PrioritizedResourceManager* contents_texture_manager = | 343 PrioritizedResourceManager* contents_texture_manager = |
| (...skipping 20 matching lines...) Expand all Loading... |
| 353 | 364 |
| 354 layer_tree_host_impl_->SendManagedMemoryStats( | 365 layer_tree_host_impl_->SendManagedMemoryStats( |
| 355 contents_texture_manager->MemoryVisibleBytes(), | 366 contents_texture_manager->MemoryVisibleBytes(), |
| 356 contents_texture_manager->MemoryVisibleAndNearbyBytes(), | 367 contents_texture_manager->MemoryVisibleAndNearbyBytes(), |
| 357 contents_texture_manager->MemoryUseBytes()); | 368 contents_texture_manager->MemoryUseBytes()); |
| 358 } | 369 } |
| 359 | 370 |
| 360 bool SingleThreadProxy::IsInsideDraw() { return inside_draw_; } | 371 bool SingleThreadProxy::IsInsideDraw() { return inside_draw_; } |
| 361 | 372 |
| 362 void SingleThreadProxy::DidLoseOutputSurfaceOnImplThread() { | 373 void SingleThreadProxy::DidLoseOutputSurfaceOnImplThread() { |
| 374 TRACE_EVENT0("cc", "SingleThreadProxy::DidLoseOutputSurfaceOnImplThread"); |
| 363 // Cause a commit so we can notice the lost context. | 375 // Cause a commit so we can notice the lost context. |
| 364 SetNeedsCommitOnImplThread(); | 376 SetNeedsCommitOnImplThread(); |
| 365 client_->DidAbortSwapBuffers(); | 377 client_->DidAbortSwapBuffers(); |
| 366 } | 378 } |
| 367 | 379 |
| 368 void SingleThreadProxy::DidSwapBuffersOnImplThread() { | 380 void SingleThreadProxy::DidSwapBuffersOnImplThread() { |
| 369 client_->DidPostSwapBuffers(); | 381 client_->DidPostSwapBuffers(); |
| 370 } | 382 } |
| 371 | 383 |
| 372 void SingleThreadProxy::OnSwapBuffersCompleteOnImplThread() { | 384 void SingleThreadProxy::OnSwapBuffersCompleteOnImplThread() { |
| 385 TRACE_EVENT0("cc", "SingleThreadProxy::OnSwapBuffersCompleteOnImplThread"); |
| 373 client_->DidCompleteSwapBuffers(); | 386 client_->DidCompleteSwapBuffers(); |
| 374 } | 387 } |
| 375 | 388 |
| 376 // Called by the legacy scheduling path (e.g. where render_widget does the | 389 // Called by the legacy scheduling path (e.g. where render_widget does the |
| 377 // scheduling) | 390 // scheduling) |
| 378 void SingleThreadProxy::CompositeImmediately(base::TimeTicks frame_begin_time) { | 391 void SingleThreadProxy::CompositeImmediately(base::TimeTicks frame_begin_time) { |
| 392 TRACE_EVENT0("cc", "SingleThreadProxy::CompositeImmediately"); |
| 379 gfx::Rect device_viewport_damage_rect; | 393 gfx::Rect device_viewport_damage_rect; |
| 380 | 394 |
| 381 LayerTreeHostImpl::FrameData frame; | 395 LayerTreeHostImpl::FrameData frame; |
| 382 if (CommitAndComposite(frame_begin_time, | 396 if (CommitAndComposite(frame_begin_time, |
| 383 device_viewport_damage_rect, | 397 device_viewport_damage_rect, |
| 384 false, // for_readback | 398 false, // for_readback |
| 385 &frame)) { | 399 &frame)) { |
| 386 { | 400 { |
| 387 DebugScopedSetMainThreadBlocked main_thread_blocked(this); | 401 DebugScopedSetMainThreadBlocked main_thread_blocked(this); |
| 388 DebugScopedSetImplThread impl(this); | 402 DebugScopedSetImplThread impl(this); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 424 layer_tree_host_impl_->renderer()->DoNoOp(); | 438 layer_tree_host_impl_->renderer()->DoNoOp(); |
| 425 } | 439 } |
| 426 } | 440 } |
| 427 } | 441 } |
| 428 | 442 |
| 429 bool SingleThreadProxy::CommitAndComposite( | 443 bool SingleThreadProxy::CommitAndComposite( |
| 430 base::TimeTicks frame_begin_time, | 444 base::TimeTicks frame_begin_time, |
| 431 const gfx::Rect& device_viewport_damage_rect, | 445 const gfx::Rect& device_viewport_damage_rect, |
| 432 bool for_readback, | 446 bool for_readback, |
| 433 LayerTreeHostImpl::FrameData* frame) { | 447 LayerTreeHostImpl::FrameData* frame) { |
| 448 TRACE_EVENT0("cc", "SingleThreadProxy::CommitAndComposite"); |
| 434 DCHECK(Proxy::IsMainThread()); | 449 DCHECK(Proxy::IsMainThread()); |
| 435 | 450 |
| 436 if (!layer_tree_host_->InitializeOutputSurfaceIfNeeded()) | 451 if (!layer_tree_host_->InitializeOutputSurfaceIfNeeded()) |
| 437 return false; | 452 return false; |
| 438 | 453 |
| 439 layer_tree_host_->AnimateLayers(frame_begin_time); | 454 layer_tree_host_->AnimateLayers(frame_begin_time); |
| 440 | 455 |
| 441 if (PrioritizedResourceManager* contents_texture_manager = | 456 if (PrioritizedResourceManager* contents_texture_manager = |
| 442 layer_tree_host_->contents_texture_manager()) { | 457 layer_tree_host_->contents_texture_manager()) { |
| 443 contents_texture_manager->UnlinkAndClearEvictedBackings(); | 458 contents_texture_manager->UnlinkAndClearEvictedBackings(); |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 487 layer_tree_host_impl_->UpdateBackgroundAnimateTicking( | 502 layer_tree_host_impl_->UpdateBackgroundAnimateTicking( |
| 488 !ShouldComposite() && layer_tree_host_impl_->active_tree()->root_layer()); | 503 !ShouldComposite() && layer_tree_host_impl_->active_tree()->root_layer()); |
| 489 } | 504 } |
| 490 | 505 |
| 491 bool SingleThreadProxy::DoComposite( | 506 bool SingleThreadProxy::DoComposite( |
| 492 scoped_refptr<ContextProvider> offscreen_context_provider, | 507 scoped_refptr<ContextProvider> offscreen_context_provider, |
| 493 base::TimeTicks frame_begin_time, | 508 base::TimeTicks frame_begin_time, |
| 494 const gfx::Rect& device_viewport_damage_rect, | 509 const gfx::Rect& device_viewport_damage_rect, |
| 495 bool for_readback, | 510 bool for_readback, |
| 496 LayerTreeHostImpl::FrameData* frame) { | 511 LayerTreeHostImpl::FrameData* frame) { |
| 512 TRACE_EVENT0("cc", "SingleThreadProxy::DoComposite"); |
| 497 DCHECK(!layer_tree_host_->output_surface_lost()); | 513 DCHECK(!layer_tree_host_->output_surface_lost()); |
| 498 | 514 |
| 499 bool lost_output_surface = false; | 515 bool lost_output_surface = false; |
| 500 { | 516 { |
| 501 DebugScopedSetImplThread impl(this); | 517 DebugScopedSetImplThread impl(this); |
| 502 base::AutoReset<bool> mark_inside(&inside_draw_, true); | 518 base::AutoReset<bool> mark_inside(&inside_draw_, true); |
| 503 | 519 |
| 504 layer_tree_host_impl_->SetOffscreenContextProvider( | 520 layer_tree_host_impl_->SetOffscreenContextProvider( |
| 505 offscreen_context_provider); | 521 offscreen_context_provider); |
| 506 | 522 |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 548 void SingleThreadProxy::DidSwapFrame() { | 564 void SingleThreadProxy::DidSwapFrame() { |
| 549 if (next_frame_is_newly_committed_frame_) { | 565 if (next_frame_is_newly_committed_frame_) { |
| 550 next_frame_is_newly_committed_frame_ = false; | 566 next_frame_is_newly_committed_frame_ = false; |
| 551 layer_tree_host_->DidCommitAndDrawFrame(); | 567 layer_tree_host_->DidCommitAndDrawFrame(); |
| 552 } | 568 } |
| 553 } | 569 } |
| 554 | 570 |
| 555 bool SingleThreadProxy::CommitPendingForTesting() { return false; } | 571 bool SingleThreadProxy::CommitPendingForTesting() { return false; } |
| 556 | 572 |
| 557 } // namespace cc | 573 } // namespace cc |
| OLD | NEW |