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

Side by Side Diff: cc/trees/layer_tree_host_impl.cc

Issue 267783004: Refactoring the way begin frame sources inside scheduler work. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Scheduler tests now pass and the code is cleaner. Created 6 years, 6 months 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
« no previous file with comments | « cc/trees/layer_tree_host_impl.h ('k') | cc/trees/layer_tree_host_impl_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/layer_tree_host_impl.h" 5 #include "cc/trees/layer_tree_host_impl.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <limits> 8 #include <limits>
9 9
10 #include "base/basictypes.h" 10 #include "base/basictypes.h"
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
112 if (context_provider->ContextCapabilities().gpu.texture_rectangle) 112 if (context_provider->ContextCapabilities().gpu.texture_rectangle)
113 return GL_TEXTURE_RECTANGLE_ARB; 113 return GL_TEXTURE_RECTANGLE_ARB;
114 114
115 return GL_TEXTURE_2D; 115 return GL_TEXTURE_2D;
116 } 116 }
117 117
118 } // namespace 118 } // namespace
119 119
120 namespace cc { 120 namespace cc {
121 121
122 class LayerTreeHostImplTimeSourceAdapter : public TimeSourceClient {
123 public:
124 static scoped_ptr<LayerTreeHostImplTimeSourceAdapter> Create(
125 LayerTreeHostImpl* layer_tree_host_impl,
126 scoped_refptr<DelayBasedTimeSource> time_source) {
127 return make_scoped_ptr(
128 new LayerTreeHostImplTimeSourceAdapter(layer_tree_host_impl,
129 time_source));
130 }
131 virtual ~LayerTreeHostImplTimeSourceAdapter() {
132 time_source_->SetClient(NULL);
133 time_source_->SetActive(false);
134 }
135
136 virtual void OnTimerTick() OVERRIDE {
137 // In single threaded mode we attempt to simulate changing the current
138 // thread by maintaining a fake thread id. When we switch from one
139 // thread to another, we construct DebugScopedSetXXXThread objects that
140 // update the thread id. This lets DCHECKS that ensure we're on the
141 // right thread to work correctly in single threaded mode. The problem
142 // here is that the timer tasks are run via the message loop, and when
143 // they run, we've had no chance to construct a DebugScopedSetXXXThread
144 // object. The result is that we report that we're running on the main
145 // thread. In multi-threaded mode, this timer is run on the compositor
146 // thread, so to keep this consistent in single-threaded mode, we'll
147 // construct a DebugScopedSetImplThread object. There is no need to do
148 // this in multi-threaded mode since the real thread id's will be
149 // correct. In fact, setting fake thread id's interferes with the real
150 // thread id's and causes breakage.
151 scoped_ptr<DebugScopedSetImplThread> set_impl_thread;
152 if (!layer_tree_host_impl_->proxy()->HasImplThread()) {
153 set_impl_thread.reset(
154 new DebugScopedSetImplThread(layer_tree_host_impl_->proxy()));
155 }
156
157 // TODO(enne): This should probably happen post-animate.
158 if (layer_tree_host_impl_->pending_tree()) {
159 layer_tree_host_impl_->pending_tree()->UpdateDrawProperties();
160 layer_tree_host_impl_->ManageTiles();
161 }
162
163 layer_tree_host_impl_->Animate(
164 layer_tree_host_impl_->CurrentFrameTimeTicks());
165 layer_tree_host_impl_->UpdateBackgroundAnimateTicking(true);
166 bool start_ready_animations = true;
167 layer_tree_host_impl_->UpdateAnimationState(start_ready_animations);
168 layer_tree_host_impl_->ResetCurrentFrameTimeForNextFrame();
169 }
170
171 void SetActive(bool active) {
172 if (active != time_source_->Active())
173 time_source_->SetActive(active);
174 }
175
176 bool Active() const { return time_source_->Active(); }
177
178 private:
179 LayerTreeHostImplTimeSourceAdapter(
180 LayerTreeHostImpl* layer_tree_host_impl,
181 scoped_refptr<DelayBasedTimeSource> time_source)
182 : layer_tree_host_impl_(layer_tree_host_impl),
183 time_source_(time_source) {
184 time_source_->SetClient(this);
185 }
186
187 LayerTreeHostImpl* layer_tree_host_impl_;
188 scoped_refptr<DelayBasedTimeSource> time_source_;
189
190 DISALLOW_COPY_AND_ASSIGN(LayerTreeHostImplTimeSourceAdapter);
191 };
192
193 LayerTreeHostImpl::FrameData::FrameData() 122 LayerTreeHostImpl::FrameData::FrameData()
194 : contains_incomplete_tile(false), has_no_damage(false) {} 123 : contains_incomplete_tile(false), has_no_damage(false) {}
195 124
196 LayerTreeHostImpl::FrameData::~FrameData() {} 125 LayerTreeHostImpl::FrameData::~FrameData() {}
197 126
198 scoped_ptr<LayerTreeHostImpl> LayerTreeHostImpl::Create( 127 scoped_ptr<LayerTreeHostImpl> LayerTreeHostImpl::Create(
199 const LayerTreeSettings& settings, 128 const LayerTreeSettings& settings,
200 LayerTreeHostImplClient* client, 129 LayerTreeHostImplClient* client,
201 Proxy* proxy, 130 Proxy* proxy,
202 RenderingStatsInstrumentation* rendering_stats_instrumentation, 131 RenderingStatsInstrumentation* rendering_stats_instrumentation,
203 SharedBitmapManager* manager, 132 SharedBitmapManager* manager,
204 int id) { 133 int id) {
205 return make_scoped_ptr(new LayerTreeHostImpl( 134 return make_scoped_ptr(new LayerTreeHostImpl(
206 settings, client, proxy, rendering_stats_instrumentation, manager, id)); 135 settings, client, proxy, rendering_stats_instrumentation, manager, id));
207 } 136 }
208 137
209 LayerTreeHostImpl::LayerTreeHostImpl( 138 LayerTreeHostImpl::LayerTreeHostImpl(
210 const LayerTreeSettings& settings, 139 const LayerTreeSettings& settings,
211 LayerTreeHostImplClient* client, 140 LayerTreeHostImplClient* client,
212 Proxy* proxy, 141 Proxy* proxy,
213 RenderingStatsInstrumentation* rendering_stats_instrumentation, 142 RenderingStatsInstrumentation* rendering_stats_instrumentation,
214 SharedBitmapManager* manager, 143 SharedBitmapManager* manager,
215 int id) 144 int id)
216 : client_(client), 145 : BaseBeginFrameSource(0),
146 client_(client),
217 proxy_(proxy), 147 proxy_(proxy),
218 use_gpu_rasterization_(false), 148 use_gpu_rasterization_(false),
219 input_handler_client_(NULL), 149 input_handler_client_(NULL),
220 did_lock_scrolling_layer_(false), 150 did_lock_scrolling_layer_(false),
221 should_bubble_scrolls_(false), 151 should_bubble_scrolls_(false),
222 wheel_scrolling_(false), 152 wheel_scrolling_(false),
223 scroll_affects_scroll_handler_(false), 153 scroll_affects_scroll_handler_(false),
224 scroll_layer_id_when_mouse_over_scrollbar_(0), 154 scroll_layer_id_when_mouse_over_scrollbar_(0),
225 tile_priorities_dirty_(false), 155 tile_priorities_dirty_(false),
226 root_layer_scroll_offset_delegate_(NULL), 156 root_layer_scroll_offset_delegate_(NULL),
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
327 pending_tree()->ApplyScrollDeltasSinceBeginMainFrame(); 257 pending_tree()->ApplyScrollDeltasSinceBeginMainFrame();
328 pending_tree_->set_needs_update_draw_properties(); 258 pending_tree_->set_needs_update_draw_properties();
329 pending_tree_->UpdateDrawProperties(); 259 pending_tree_->UpdateDrawProperties();
330 // Start working on newly created tiles immediately if needed. 260 // Start working on newly created tiles immediately if needed.
331 if (!tile_manager_ || !tile_priorities_dirty_) 261 if (!tile_manager_ || !tile_priorities_dirty_)
332 NotifyReadyToActivate(); 262 NotifyReadyToActivate();
333 else 263 else
334 ManageTiles(); 264 ManageTiles();
335 } else { 265 } else {
336 active_tree_->set_needs_update_draw_properties(); 266 active_tree_->set_needs_update_draw_properties();
337 if (time_source_client_adapter_ && time_source_client_adapter_->Active())
338 DCHECK(active_tree_->root_layer());
339 } 267 }
340 268
341 client_->SendManagedMemoryStats(); 269 client_->SendManagedMemoryStats();
342 270
343 micro_benchmark_controller_.DidCompleteCommit(); 271 micro_benchmark_controller_.DidCompleteCommit();
344 } 272 }
345 273
346 bool LayerTreeHostImpl::CanDraw() const { 274 bool LayerTreeHostImpl::CanDraw() const {
347 // Note: If you are changing this function or any other function that might 275 // Note: If you are changing this function or any other function that might
348 // affect the result of CanDraw, make sure to call 276 // affect the result of CanDraw, make sure to call
(...skipping 583 matching lines...) Expand 10 before | Expand all | Expand 10 after
932 DCHECK_EQ(1u, frame->render_passes.size()); 860 DCHECK_EQ(1u, frame->render_passes.size());
933 861
934 return draw_result; 862 return draw_result;
935 } 863 }
936 864
937 void LayerTreeHostImpl::MainThreadHasStoppedFlinging() { 865 void LayerTreeHostImpl::MainThreadHasStoppedFlinging() {
938 if (input_handler_client_) 866 if (input_handler_client_)
939 input_handler_client_->MainThreadHasStoppedFlinging(); 867 input_handler_client_->MainThreadHasStoppedFlinging();
940 } 868 }
941 869
942 void LayerTreeHostImpl::UpdateBackgroundAnimateTicking(
943 bool should_background_tick) {
944 DCHECK(proxy_->IsImplThread());
945 if (should_background_tick)
946 DCHECK(active_tree_->root_layer());
947
948 bool enabled = should_background_tick && needs_animate_layers();
949
950 // Lazily create the time_source adapter so that we can vary the interval for
951 // testing.
952 if (!time_source_client_adapter_) {
953 time_source_client_adapter_ = LayerTreeHostImplTimeSourceAdapter::Create(
954 this,
955 DelayBasedTimeSource::Create(
956 LowFrequencyAnimationInterval(),
957 proxy_->HasImplThread() ? proxy_->ImplThreadTaskRunner()
958 : proxy_->MainThreadTaskRunner()));
959 }
960
961 time_source_client_adapter_->SetActive(enabled);
962 }
963
964 void LayerTreeHostImpl::DidAnimateScrollOffset() { 870 void LayerTreeHostImpl::DidAnimateScrollOffset() {
965 client_->SetNeedsCommitOnImplThread(); 871 client_->SetNeedsCommitOnImplThread();
966 client_->RenewTreePriority(); 872 client_->RenewTreePriority();
967 } 873 }
968 874
969 void LayerTreeHostImpl::SetViewportDamage(const gfx::Rect& damage_rect) { 875 void LayerTreeHostImpl::SetViewportDamage(const gfx::Rect& damage_rect) {
970 viewport_damage_rect_.Union(damage_rect); 876 viewport_damage_rect_.Union(damage_rect);
971 } 877 }
972 878
973 static inline RenderPass* FindRenderPassById( 879 static inline RenderPass* FindRenderPassById(
(...skipping 348 matching lines...) Expand 10 before | Expand all | Expand 10 after
1322 } 1228 }
1323 1229
1324 void LayerTreeHostImpl::SetNeedsRedrawRect(const gfx::Rect& damage_rect) { 1230 void LayerTreeHostImpl::SetNeedsRedrawRect(const gfx::Rect& damage_rect) {
1325 if (damage_rect.IsEmpty()) 1231 if (damage_rect.IsEmpty())
1326 return; 1232 return;
1327 NotifySwapPromiseMonitorsOfSetNeedsRedraw(); 1233 NotifySwapPromiseMonitorsOfSetNeedsRedraw();
1328 client_->SetNeedsRedrawRectOnImplThread(damage_rect); 1234 client_->SetNeedsRedrawRectOnImplThread(damage_rect);
1329 } 1235 }
1330 1236
1331 void LayerTreeHostImpl::BeginFrame(const BeginFrameArgs& args) { 1237 void LayerTreeHostImpl::BeginFrame(const BeginFrameArgs& args) {
1332 client_->BeginFrame(args); 1238 frame_sink_->BeginFrame(args);
1333 } 1239 }
1334 1240
1335 void LayerTreeHostImpl::DidSwapBuffers() { 1241 void LayerTreeHostImpl::DidSwapBuffers() {
1336 client_->DidSwapBuffersOnImplThread(); 1242 client_->DidSwapBuffersOnImplThread();
1337 } 1243 }
1338 1244
1339 void LayerTreeHostImpl::DidSwapBuffersComplete() { 1245 void LayerTreeHostImpl::DidSwapBuffersComplete() {
1340 client_->DidSwapBuffersCompleteOnImplThread(); 1246 client_->DidSwapBuffersCompleteOnImplThread();
1341 } 1247 }
1342 1248
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after
1557 TRACE_EVENT_FLOW_STEP0( 1463 TRACE_EVENT_FLOW_STEP0(
1558 "input", 1464 "input",
1559 "LatencyInfo.Flow", 1465 "LatencyInfo.Flow",
1560 TRACE_ID_DONT_MANGLE(metadata.latency_info[i].trace_id), 1466 TRACE_ID_DONT_MANGLE(metadata.latency_info[i].trace_id),
1561 "SwapBuffers"); 1467 "SwapBuffers");
1562 } 1468 }
1563 renderer_->SwapBuffers(metadata); 1469 renderer_->SwapBuffers(metadata);
1564 return true; 1470 return true;
1565 } 1471 }
1566 1472
1567 void LayerTreeHostImpl::SetNeedsBeginFrame(bool enable) { 1473 void LayerTreeHostImpl::OnGenerateChange(bool generate_frames) {
1568 if (output_surface_) 1474 if (output_surface_)
1569 output_surface_->SetNeedsBeginFrame(enable); 1475 output_surface_->SetNeedsBeginFrame(generate_frames);
1570 else 1476 else
1571 DCHECK(!enable); 1477 DCHECK(!generate_frames);
1478 }
1479
1480 std::string LayerTreeHostImpl::TypeString() const {
1481 return "LayerTreeHostImpl";
1572 } 1482 }
1573 1483
1574 void LayerTreeHostImpl::WillBeginImplFrame(const BeginFrameArgs& args) { 1484 void LayerTreeHostImpl::WillBeginImplFrame(const BeginFrameArgs& args) {
1575 // Sample the frame time now. This time will be used for updating animations 1485 // Sample the frame time now. This time will be used for updating animations
1576 // when we draw. 1486 // when we draw.
1577 UpdateCurrentFrameTime(); 1487 UpdateCurrentFrameTime();
1578 // Cache the begin impl frame interval 1488 // Cache the begin impl frame interval
1579 begin_impl_frame_interval_ = args.interval; 1489 begin_impl_frame_interval_ = args.interval;
1580 } 1490 }
1581 1491
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after
1741 paint_time_counter_->SavePaintTime(stats.main_stats.paint_time + 1651 paint_time_counter_->SavePaintTime(stats.main_stats.paint_time +
1742 stats.main_stats.record_time + 1652 stats.main_stats.record_time +
1743 stats.impl_stats.rasterize_time); 1653 stats.impl_stats.rasterize_time);
1744 } 1654 }
1745 1655
1746 UpdateInnerViewportContainerSize(); 1656 UpdateInnerViewportContainerSize();
1747 client_->DidActivatePendingTree(); 1657 client_->DidActivatePendingTree();
1748 if (!tree_activation_callback_.is_null()) 1658 if (!tree_activation_callback_.is_null())
1749 tree_activation_callback_.Run(); 1659 tree_activation_callback_.Run();
1750 1660
1751 if (time_source_client_adapter_ && time_source_client_adapter_->Active())
1752 DCHECK(active_tree_->root_layer());
1753 devtools_instrumentation::DidActivateLayerTree( 1661 devtools_instrumentation::DidActivateLayerTree(
1754 id_, active_tree_->source_frame_number()); 1662 id_, active_tree_->source_frame_number());
1755 } 1663 }
1756 1664
1757 void LayerTreeHostImpl::SetVisible(bool visible) { 1665 void LayerTreeHostImpl::SetVisible(bool visible) {
1758 DCHECK(proxy_->IsImplThread()); 1666 DCHECK(proxy_->IsImplThread());
1759 1667
1760 if (visible_ == visible) 1668 if (visible_ == visible)
1761 return; 1669 return;
1762 visible_ = visible; 1670 visible_ = visible;
(...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after
2013 if (max_frames_pending <= 0) 1921 if (max_frames_pending <= 0)
2014 max_frames_pending = OutputSurface::DEFAULT_MAX_FRAMES_PENDING; 1922 max_frames_pending = OutputSurface::DEFAULT_MAX_FRAMES_PENDING;
2015 client_->SetMaxSwapsPendingOnImplThread(max_frames_pending); 1923 client_->SetMaxSwapsPendingOnImplThread(max_frames_pending);
2016 client_->OnCanDrawStateChanged(CanDraw()); 1924 client_->OnCanDrawStateChanged(CanDraw());
2017 1925
2018 return true; 1926 return true;
2019 } 1927 }
2020 1928
2021 void LayerTreeHostImpl::CommitVSyncParameters(base::TimeTicks timebase, 1929 void LayerTreeHostImpl::CommitVSyncParameters(base::TimeTicks timebase,
2022 base::TimeDelta interval) { 1930 base::TimeDelta interval) {
2023 client_->CommitVSyncParameters(timebase, interval); 1931 // fsink_->UpdateTimebaseAndInterval(timebase, interval);
2024 } 1932 }
2025 1933
2026 void LayerTreeHostImpl::DeferredInitialize() { 1934 void LayerTreeHostImpl::DeferredInitialize() {
2027 DCHECK(output_surface_->capabilities().deferred_gl_initialization); 1935 DCHECK(output_surface_->capabilities().deferred_gl_initialization);
2028 DCHECK(settings_.impl_side_painting); 1936 DCHECK(settings_.impl_side_painting);
2029 DCHECK(output_surface_->context_provider()); 1937 DCHECK(output_surface_->context_provider());
2030 1938
2031 ReleaseTreeResources(); 1939 ReleaseTreeResources();
2032 renderer_.reset(); 1940 renderer_.reset();
2033 1941
(...skipping 1094 matching lines...) Expand 10 before | Expand all | Expand 10 after
3128 swap_promise_monitor_.erase(monitor); 3036 swap_promise_monitor_.erase(monitor);
3129 } 3037 }
3130 3038
3131 void LayerTreeHostImpl::NotifySwapPromiseMonitorsOfSetNeedsRedraw() { 3039 void LayerTreeHostImpl::NotifySwapPromiseMonitorsOfSetNeedsRedraw() {
3132 std::set<SwapPromiseMonitor*>::iterator it = swap_promise_monitor_.begin(); 3040 std::set<SwapPromiseMonitor*>::iterator it = swap_promise_monitor_.begin();
3133 for (; it != swap_promise_monitor_.end(); it++) 3041 for (; it != swap_promise_monitor_.end(); it++)
3134 (*it)->OnSetNeedsRedrawOnImpl(); 3042 (*it)->OnSetNeedsRedrawOnImpl();
3135 } 3043 }
3136 3044
3137 } // namespace cc 3045 } // namespace cc
OLDNEW
« no previous file with comments | « cc/trees/layer_tree_host_impl.h ('k') | cc/trees/layer_tree_host_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698