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 19 matching lines...) Expand all Loading... |
30 } | 30 } |
31 | 31 |
32 SingleThreadProxy::SingleThreadProxy( | 32 SingleThreadProxy::SingleThreadProxy( |
33 LayerTreeHost* layer_tree_host, | 33 LayerTreeHost* layer_tree_host, |
34 LayerTreeHostSingleThreadClient* client, | 34 LayerTreeHostSingleThreadClient* client, |
35 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner) | 35 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner) |
36 : Proxy(main_task_runner, NULL), | 36 : Proxy(main_task_runner, NULL), |
37 layer_tree_host_(layer_tree_host), | 37 layer_tree_host_(layer_tree_host), |
38 client_(client), | 38 client_(client), |
39 next_frame_is_newly_committed_frame_(false), | 39 next_frame_is_newly_committed_frame_(false), |
40 inside_draw_(false) { | 40 inside_draw_(false), |
| 41 weak_factory_(this) { |
41 TRACE_EVENT0("cc", "SingleThreadProxy::SingleThreadProxy"); | 42 TRACE_EVENT0("cc", "SingleThreadProxy::SingleThreadProxy"); |
42 DCHECK(Proxy::IsMainThread()); | 43 DCHECK(Proxy::IsMainThread()); |
43 DCHECK(layer_tree_host); | 44 DCHECK(layer_tree_host); |
44 | 45 |
45 // Impl-side painting not supported without threaded compositing. | 46 // Impl-side painting not supported without threaded compositing. |
46 CHECK(!layer_tree_host->settings().impl_side_painting) | 47 CHECK(!layer_tree_host->settings().impl_side_painting) |
47 << "Threaded compositing must be enabled to use impl-side painting."; | 48 << "Threaded compositing must be enabled to use impl-side painting."; |
48 } | 49 } |
49 | 50 |
50 void SingleThreadProxy::Start() { | 51 void SingleThreadProxy::Start() { |
(...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
309 DCHECK(IsImplThread()); | 310 DCHECK(IsImplThread()); |
310 renderer_capabilities_for_main_thread_ = | 311 renderer_capabilities_for_main_thread_ = |
311 layer_tree_host_impl_->GetRendererCapabilities().MainThreadCapabilities(); | 312 layer_tree_host_impl_->GetRendererCapabilities().MainThreadCapabilities(); |
312 } | 313 } |
313 | 314 |
314 void SingleThreadProxy::DidLoseOutputSurfaceOnImplThread() { | 315 void SingleThreadProxy::DidLoseOutputSurfaceOnImplThread() { |
315 TRACE_EVENT0("cc", "SingleThreadProxy::DidLoseOutputSurfaceOnImplThread"); | 316 TRACE_EVENT0("cc", "SingleThreadProxy::DidLoseOutputSurfaceOnImplThread"); |
316 // Cause a commit so we can notice the lost context. | 317 // Cause a commit so we can notice the lost context. |
317 SetNeedsCommitOnImplThread(); | 318 SetNeedsCommitOnImplThread(); |
318 client_->DidAbortSwapBuffers(); | 319 client_->DidAbortSwapBuffers(); |
| 320 Proxy::MainThreadTaskRunner()->PostTask( |
| 321 FROM_HERE, |
| 322 base::Bind(&SingleThreadProxy::DidLoseOutputSurface, |
| 323 weak_factory_.GetWeakPtr())); |
| 324 } |
| 325 |
| 326 void SingleThreadProxy::DidLoseOutputSurface() { |
| 327 DCHECK(Proxy::IsMainThread()); |
| 328 TRACE_EVENT0("cc", "SingleThreadProxy::DidLoseOutputSurface"); |
| 329 |
| 330 // The layer tree host will in turn schedule another commit. |
| 331 layer_tree_host_->DidLoseOutputSurface(); |
319 } | 332 } |
320 | 333 |
321 void SingleThreadProxy::DidSwapBuffersOnImplThread() { | 334 void SingleThreadProxy::DidSwapBuffersOnImplThread() { |
322 client_->DidPostSwapBuffers(); | 335 client_->DidPostSwapBuffers(); |
323 } | 336 } |
324 | 337 |
325 void SingleThreadProxy::DidSwapBuffersCompleteOnImplThread() { | 338 void SingleThreadProxy::DidSwapBuffersCompleteOnImplThread() { |
326 TRACE_EVENT0("cc", "SingleThreadProxy::DidSwapBuffersCompleteOnImplThread"); | 339 TRACE_EVENT0("cc", "SingleThreadProxy::DidSwapBuffersCompleteOnImplThread"); |
327 client_->DidCompleteSwapBuffers(); | 340 client_->DidCompleteSwapBuffers(); |
328 } | 341 } |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
408 DCHECK(Proxy::IsImplThread()); | 421 DCHECK(Proxy::IsImplThread()); |
409 layer_tree_host_impl_->UpdateBackgroundAnimateTicking( | 422 layer_tree_host_impl_->UpdateBackgroundAnimateTicking( |
410 !ShouldComposite() && layer_tree_host_impl_->active_tree()->root_layer()); | 423 !ShouldComposite() && layer_tree_host_impl_->active_tree()->root_layer()); |
411 } | 424 } |
412 | 425 |
413 bool SingleThreadProxy::DoComposite(base::TimeTicks frame_begin_time, | 426 bool SingleThreadProxy::DoComposite(base::TimeTicks frame_begin_time, |
414 LayerTreeHostImpl::FrameData* frame) { | 427 LayerTreeHostImpl::FrameData* frame) { |
415 TRACE_EVENT0("cc", "SingleThreadProxy::DoComposite"); | 428 TRACE_EVENT0("cc", "SingleThreadProxy::DoComposite"); |
416 DCHECK(!layer_tree_host_->output_surface_lost()); | 429 DCHECK(!layer_tree_host_->output_surface_lost()); |
417 | 430 |
418 bool lost_output_surface = false; | |
419 { | 431 { |
420 DebugScopedSetImplThread impl(this); | 432 DebugScopedSetImplThread impl(this); |
421 base::AutoReset<bool> mark_inside(&inside_draw_, true); | 433 base::AutoReset<bool> mark_inside(&inside_draw_, true); |
422 | 434 |
423 // We guard PrepareToDraw() with CanDraw() because it always returns a valid | 435 // We guard PrepareToDraw() with CanDraw() because it always returns a valid |
424 // frame, so can only be used when such a frame is possible. Since | 436 // frame, so can only be used when such a frame is possible. Since |
425 // DrawLayers() depends on the result of PrepareToDraw(), it is guarded on | 437 // DrawLayers() depends on the result of PrepareToDraw(), it is guarded on |
426 // CanDraw() as well. | 438 // CanDraw() as well. |
427 if (!ShouldComposite()) { | 439 if (!ShouldComposite()) { |
428 UpdateBackgroundAnimateTicking(); | 440 UpdateBackgroundAnimateTicking(); |
429 return false; | 441 return false; |
430 } | 442 } |
431 | 443 |
432 layer_tree_host_impl_->Animate( | 444 layer_tree_host_impl_->Animate( |
433 layer_tree_host_impl_->CurrentBeginFrameArgs().frame_time); | 445 layer_tree_host_impl_->CurrentBeginFrameArgs().frame_time); |
434 UpdateBackgroundAnimateTicking(); | 446 UpdateBackgroundAnimateTicking(); |
435 | 447 |
436 if (!layer_tree_host_impl_->IsContextLost()) { | 448 layer_tree_host_impl_->PrepareToDraw(frame); |
437 layer_tree_host_impl_->PrepareToDraw(frame); | 449 layer_tree_host_impl_->DrawLayers(frame, frame_begin_time); |
438 layer_tree_host_impl_->DrawLayers(frame, frame_begin_time); | 450 layer_tree_host_impl_->DidDrawAllLayers(*frame); |
439 layer_tree_host_impl_->DidDrawAllLayers(*frame); | |
440 } | |
441 lost_output_surface = layer_tree_host_impl_->IsContextLost(); | |
442 | 451 |
443 bool start_ready_animations = true; | 452 bool start_ready_animations = true; |
444 layer_tree_host_impl_->UpdateAnimationState(start_ready_animations); | 453 layer_tree_host_impl_->UpdateAnimationState(start_ready_animations); |
445 | 454 |
446 layer_tree_host_impl_->ResetCurrentBeginFrameArgsForNextFrame(); | 455 layer_tree_host_impl_->ResetCurrentBeginFrameArgsForNextFrame(); |
447 } | 456 } |
448 | 457 |
449 if (lost_output_surface) { | |
450 layer_tree_host_->DidLoseOutputSurface(); | |
451 return false; | |
452 } | |
453 | |
454 return true; | 458 return true; |
455 } | 459 } |
456 | 460 |
457 void SingleThreadProxy::DidSwapFrame() { | 461 void SingleThreadProxy::DidSwapFrame() { |
458 if (next_frame_is_newly_committed_frame_) { | 462 if (next_frame_is_newly_committed_frame_) { |
459 next_frame_is_newly_committed_frame_ = false; | 463 next_frame_is_newly_committed_frame_ = false; |
460 layer_tree_host_->DidCommitAndDrawFrame(); | 464 layer_tree_host_->DidCommitAndDrawFrame(); |
461 } | 465 } |
462 } | 466 } |
463 | 467 |
464 bool SingleThreadProxy::MainFrameWillHappenForTesting() { | 468 bool SingleThreadProxy::MainFrameWillHappenForTesting() { |
465 return false; | 469 return false; |
466 } | 470 } |
467 | 471 |
468 } // namespace cc | 472 } // namespace cc |
OLD | NEW |