| 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/thread_proxy.h" | 5 #include "cc/trees/thread_proxy.h" |
| 6 | 6 |
| 7 #include "base/auto_reset.h" | 7 #include "base/auto_reset.h" |
| 8 #include "base/bind.h" | 8 #include "base/bind.h" |
| 9 #include "base/debug/trace_event.h" | 9 #include "base/debug/trace_event.h" |
| 10 #include "cc/base/thread.h" | 10 #include "cc/base/thread.h" |
| (...skipping 868 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 879 base::Time wall_clock_time = base::Time::Now(); | 879 base::Time wall_clock_time = base::Time::Now(); |
| 880 | 880 |
| 881 if (input_handler_on_impl_thread_) | 881 if (input_handler_on_impl_thread_) |
| 882 input_handler_on_impl_thread_->Animate(monotonic_time); | 882 input_handler_on_impl_thread_->Animate(monotonic_time); |
| 883 | 883 |
| 884 layer_tree_host_impl_->ActivatePendingTreeIfNeeded(); | 884 layer_tree_host_impl_->ActivatePendingTreeIfNeeded(); |
| 885 layer_tree_host_impl_->Animate(monotonic_time, wall_clock_time); | 885 layer_tree_host_impl_->Animate(monotonic_time, wall_clock_time); |
| 886 | 886 |
| 887 // This method is called on a forced draw, regardless of whether we are able | 887 // This method is called on a forced draw, regardless of whether we are able |
| 888 // to produce a frame, as the calling site on main thread is blocked until its | 888 // to produce a frame, as the calling site on main thread is blocked until its |
| 889 // request completes, and we signal completion here. If canDraw() is false, we | 889 // request completes, and we signal completion here. If CanDraw() is false, we |
| 890 // will indicate success=false to the caller, but we must still signal | 890 // will indicate success=false to the caller, but we must still signal |
| 891 // completion to avoid deadlock. | 891 // completion to avoid deadlock. |
| 892 | 892 |
| 893 // We guard prepareToDraw() with canDraw() because it always returns a valid | 893 // We guard PrepareToDraw() with CanDraw() because it always returns a valid |
| 894 // frame, so can only be used when such a frame is possible. Since | 894 // frame, so can only be used when such a frame is possible. Since |
| 895 // drawLayers() depends on the result of prepareToDraw(), it is guarded on | 895 // DrawLayers() depends on the result of PrepareToDraw(), it is guarded on |
| 896 // canDraw() as well. | 896 // CanDraw() as well. |
| 897 |
| 898 // If it is a forced draw, make sure we do a draw and swap. |
| 899 gfx::Rect readback_rect; |
| 900 if (readback_request_on_impl_thread_) |
| 901 readback_rect = readback_request_on_impl_thread_->rect; |
| 897 | 902 |
| 898 LayerTreeHostImpl::FrameData frame; | 903 LayerTreeHostImpl::FrameData frame; |
| 899 bool draw_frame = | 904 bool draw_frame = |
| 900 layer_tree_host_impl_->CanDraw() && | 905 layer_tree_host_impl_->CanDraw() && |
| 901 (layer_tree_host_impl_->PrepareToDraw(&frame) || forced_draw); | 906 (layer_tree_host_impl_->PrepareToDraw(&frame, readback_rect) || |
| 907 forced_draw); |
| 902 if (draw_frame) { | 908 if (draw_frame) { |
| 903 layer_tree_host_impl_->DrawLayers( | 909 layer_tree_host_impl_->DrawLayers( |
| 904 &frame, | 910 &frame, |
| 905 scheduler_on_impl_thread_->LastVSyncTime()); | 911 scheduler_on_impl_thread_->LastVSyncTime()); |
| 906 result.did_draw= true; | 912 result.did_draw = true; |
| 907 } | 913 } |
| 908 layer_tree_host_impl_->DidDrawAllLayers(frame); | 914 layer_tree_host_impl_->DidDrawAllLayers(frame); |
| 909 | 915 |
| 910 // Check for tree activation. | 916 // Check for tree activation. |
| 911 if (completion_event_for_commit_held_on_tree_activation_ && | 917 if (completion_event_for_commit_held_on_tree_activation_ && |
| 912 !layer_tree_host_impl_->pending_tree()) { | 918 !layer_tree_host_impl_->pending_tree()) { |
| 913 TRACE_EVENT_INSTANT0("cc", "ReleaseCommitbyActivation"); | 919 TRACE_EVENT_INSTANT0("cc", "ReleaseCommitbyActivation"); |
| 914 DCHECK(layer_tree_host_impl_->settings().impl_side_painting); | 920 DCHECK(layer_tree_host_impl_->settings().impl_side_painting); |
| 915 completion_event_for_commit_held_on_tree_activation_->Signal(); | 921 completion_event_for_commit_held_on_tree_activation_->Signal(); |
| 916 completion_event_for_commit_held_on_tree_activation_ = NULL; | 922 completion_event_for_commit_held_on_tree_activation_ = NULL; |
| 917 } | 923 } |
| 918 | 924 |
| 919 // Check for a pending CompositeAndReadback. | 925 // Check for a pending CompositeAndReadback. |
| 920 if (readback_request_on_impl_thread_) { | 926 if (readback_request_on_impl_thread_) { |
| 921 readback_request_on_impl_thread_->success = false; | 927 readback_request_on_impl_thread_->success = false; |
| 922 if (draw_frame) { | 928 if (draw_frame) { |
| 923 layer_tree_host_impl_->Readback(readback_request_on_impl_thread_->pixels, | 929 layer_tree_host_impl_->Readback(readback_request_on_impl_thread_->pixels, |
| 924 readback_request_on_impl_thread_->rect); | 930 readback_request_on_impl_thread_->rect); |
| 925 readback_request_on_impl_thread_->success = | 931 readback_request_on_impl_thread_->success = |
| 926 !layer_tree_host_impl_->IsContextLost(); | 932 !layer_tree_host_impl_->IsContextLost(); |
| 927 } | 933 } |
| 928 readback_request_on_impl_thread_->completion.Signal(); | 934 readback_request_on_impl_thread_->completion.Signal(); |
| 929 readback_request_on_impl_thread_ = NULL; | 935 readback_request_on_impl_thread_ = NULL; |
| 930 } else if (draw_frame) { | 936 } else if (draw_frame) { |
| 931 result.did_swap = layer_tree_host_impl_->SwapBuffers(); | 937 result.did_swap = layer_tree_host_impl_->SwapBuffers(frame); |
| 932 | 938 |
| 933 if (frame.contains_incomplete_tile) | 939 if (frame.contains_incomplete_tile) |
| 934 DidSwapUseIncompleteTileOnImplThread(); | 940 DidSwapUseIncompleteTileOnImplThread(); |
| 935 } | 941 } |
| 936 | 942 |
| 937 // Tell the main thread that the the newly-commited frame was drawn. | 943 // Tell the main thread that the the newly-commited frame was drawn. |
| 938 if (next_frame_is_newly_committed_frame_on_impl_thread_) { | 944 if (next_frame_is_newly_committed_frame_on_impl_thread_) { |
| 939 next_frame_is_newly_committed_frame_on_impl_thread_ = false; | 945 next_frame_is_newly_committed_frame_on_impl_thread_ = false; |
| 940 Proxy::MainThread()->PostTask( | 946 Proxy::MainThread()->PostTask( |
| 941 base::Bind(&ThreadProxy::DidCommitAndDrawFrame, main_thread_weak_ptr_)); | 947 base::Bind(&ThreadProxy::DidCommitAndDrawFrame, main_thread_weak_ptr_)); |
| (...skipping 369 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1311 base::Bind(&ThreadProxy::StartScrollbarAnimationOnImplThread, | 1317 base::Bind(&ThreadProxy::StartScrollbarAnimationOnImplThread, |
| 1312 impl_thread_weak_ptr_), | 1318 impl_thread_weak_ptr_), |
| 1313 delay); | 1319 delay); |
| 1314 } | 1320 } |
| 1315 | 1321 |
| 1316 void ThreadProxy::StartScrollbarAnimationOnImplThread() { | 1322 void ThreadProxy::StartScrollbarAnimationOnImplThread() { |
| 1317 layer_tree_host_impl_->StartScrollbarAnimation(base::TimeTicks::Now()); | 1323 layer_tree_host_impl_->StartScrollbarAnimation(base::TimeTicks::Now()); |
| 1318 } | 1324 } |
| 1319 | 1325 |
| 1320 } // namespace cc | 1326 } // namespace cc |
| OLD | NEW |