Chromium Code Reviews| 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/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 #include <map> | 9 #include <map> |
| 10 #include <set> | 10 #include <set> |
| (...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 192 LayerTreeHostImplClient* client, | 192 LayerTreeHostImplClient* client, |
| 193 Proxy* proxy, | 193 Proxy* proxy, |
| 194 RenderingStatsInstrumentation* rendering_stats_instrumentation, | 194 RenderingStatsInstrumentation* rendering_stats_instrumentation, |
| 195 SharedBitmapManager* shared_bitmap_manager, | 195 SharedBitmapManager* shared_bitmap_manager, |
| 196 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager, | 196 gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager, |
| 197 TaskGraphRunner* task_graph_runner, | 197 TaskGraphRunner* task_graph_runner, |
| 198 int id) | 198 int id) |
| 199 : client_(client), | 199 : client_(client), |
| 200 proxy_(proxy), | 200 proxy_(proxy), |
| 201 current_begin_frame_tracker_(BEGINFRAMETRACKER_FROM_HERE), | 201 current_begin_frame_tracker_(BEGINFRAMETRACKER_FROM_HERE), |
| 202 tile_manager_( | |
| 203 TileManager::Create(this, | |
| 204 GetTaskRunner(), | |
| 205 IsSynchronousSingleThreaded() | |
| 206 ? std::numeric_limits<size_t>::max() | |
| 207 : settings.scheduled_raster_task_limit)), | |
| 202 content_is_suitable_for_gpu_rasterization_(true), | 208 content_is_suitable_for_gpu_rasterization_(true), |
| 203 has_gpu_rasterization_trigger_(false), | 209 has_gpu_rasterization_trigger_(false), |
| 204 use_gpu_rasterization_(false), | 210 use_gpu_rasterization_(false), |
| 205 use_msaa_(false), | 211 use_msaa_(false), |
| 206 gpu_rasterization_status_(GpuRasterizationStatus::OFF_DEVICE), | 212 gpu_rasterization_status_(GpuRasterizationStatus::OFF_DEVICE), |
| 207 tree_resources_for_gpu_rasterization_dirty_(false), | 213 tree_resources_for_gpu_rasterization_dirty_(false), |
| 208 input_handler_client_(NULL), | 214 input_handler_client_(NULL), |
| 209 did_lock_scrolling_layer_(false), | 215 did_lock_scrolling_layer_(false), |
| 210 should_bubble_scrolls_(false), | 216 should_bubble_scrolls_(false), |
| 211 wheel_scrolling_(false), | 217 wheel_scrolling_(false), |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 281 // made a contract with our animation controllers that the registrar | 287 // made a contract with our animation controllers that the registrar |
| 282 // will outlive them, and we must make good. | 288 // will outlive them, and we must make good. |
| 283 if (recycle_tree_) | 289 if (recycle_tree_) |
| 284 recycle_tree_->Shutdown(); | 290 recycle_tree_->Shutdown(); |
| 285 if (pending_tree_) | 291 if (pending_tree_) |
| 286 pending_tree_->Shutdown(); | 292 pending_tree_->Shutdown(); |
| 287 active_tree_->Shutdown(); | 293 active_tree_->Shutdown(); |
| 288 recycle_tree_ = nullptr; | 294 recycle_tree_ = nullptr; |
| 289 pending_tree_ = nullptr; | 295 pending_tree_ = nullptr; |
| 290 active_tree_ = nullptr; | 296 active_tree_ = nullptr; |
| 291 DestroyTileManager(); | 297 CleanUpTileManager(); |
| 292 } | 298 } |
| 293 | 299 |
| 294 void LayerTreeHostImpl::BeginMainFrameAborted(CommitEarlyOutReason reason) { | 300 void LayerTreeHostImpl::BeginMainFrameAborted(CommitEarlyOutReason reason) { |
| 295 // If the begin frame data was handled, then scroll and scale set was applied | 301 // If the begin frame data was handled, then scroll and scale set was applied |
| 296 // by the main thread, so the active tree needs to be updated as if these sent | 302 // by the main thread, so the active tree needs to be updated as if these sent |
| 297 // values were applied and committed. | 303 // values were applied and committed. |
| 298 if (CommitEarlyOutHandledCommit(reason)) | 304 if (CommitEarlyOutHandledCommit(reason)) |
| 299 active_tree_->ApplySentScrollAndScaleDeltasFromAbortedCommit(); | 305 active_tree_->ApplySentScrollAndScaleDeltasFromAbortedCommit(); |
| 300 } | 306 } |
| 301 | 307 |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 323 UpdateTreeResourcesForGpuRasterizationIfNeeded(); | 329 UpdateTreeResourcesForGpuRasterizationIfNeeded(); |
| 324 sync_tree()->set_needs_update_draw_properties(); | 330 sync_tree()->set_needs_update_draw_properties(); |
| 325 | 331 |
| 326 // We need an update immediately post-commit to have the opportunity to create | 332 // We need an update immediately post-commit to have the opportunity to create |
| 327 // tilings. Because invalidations may be coming from the main thread, it's | 333 // tilings. Because invalidations may be coming from the main thread, it's |
| 328 // safe to do an update for lcd text at this point and see if lcd text needs | 334 // safe to do an update for lcd text at this point and see if lcd text needs |
| 329 // to be disabled on any layers. | 335 // to be disabled on any layers. |
| 330 bool update_lcd_text = true; | 336 bool update_lcd_text = true; |
| 331 sync_tree()->UpdateDrawProperties(update_lcd_text); | 337 sync_tree()->UpdateDrawProperties(update_lcd_text); |
| 332 // Start working on newly created tiles immediately if needed. | 338 // Start working on newly created tiles immediately if needed. |
| 333 if (tile_manager_ && tile_priorities_dirty_) { | 339 bool did_prepare_tiles = PrepareTiles(); |
| 334 PrepareTiles(); | 340 if (!did_prepare_tiles) { |
|
enne (OOO)
2015/07/06 18:07:26
Would it be cleaner to just have PrepareTiles alwa
vmpstr
2015/07/06 18:41:35
Maybe. I've left a TODO here, because I think it's
| |
| 335 } else { | |
| 336 NotifyReadyToActivate(); | 341 NotifyReadyToActivate(); |
| 337 | 342 |
| 338 // Ensure we get ReadyToDraw signal even when PrepareTiles not run. This | 343 // Ensure we get ReadyToDraw signal even when PrepareTiles not run. This |
| 339 // is important for SingleThreadProxy and impl-side painting case. For | 344 // is important for SingleThreadProxy and impl-side painting case. For |
| 340 // STP, we commit to active tree and RequiresHighResToDraw, and set | 345 // STP, we commit to active tree and RequiresHighResToDraw, and set |
| 341 // Scheduler to wait for ReadyToDraw signal to avoid Checkerboard. | 346 // Scheduler to wait for ReadyToDraw signal to avoid Checkerboard. |
| 342 if (proxy_->CommitToActiveTree()) | 347 if (proxy_->CommitToActiveTree()) |
| 343 NotifyReadyToDraw(); | 348 NotifyReadyToDraw(); |
| 344 } | 349 } |
| 345 | 350 |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 401 (CurrentlyScrollingLayer() != InnerViewportScrollLayer() && | 406 (CurrentlyScrollingLayer() != InnerViewportScrollLayer() && |
| 402 CurrentlyScrollingLayer() != OuterViewportScrollLayer())) { | 407 CurrentlyScrollingLayer() != OuterViewportScrollLayer())) { |
| 403 AnimateInput(monotonic_time); | 408 AnimateInput(monotonic_time); |
| 404 } | 409 } |
| 405 AnimatePageScale(monotonic_time); | 410 AnimatePageScale(monotonic_time); |
| 406 AnimateLayers(monotonic_time); | 411 AnimateLayers(monotonic_time); |
| 407 AnimateScrollbars(monotonic_time); | 412 AnimateScrollbars(monotonic_time); |
| 408 AnimateTopControls(monotonic_time); | 413 AnimateTopControls(monotonic_time); |
| 409 } | 414 } |
| 410 | 415 |
| 411 void LayerTreeHostImpl::PrepareTiles() { | 416 bool LayerTreeHostImpl::PrepareTiles() { |
| 412 if (!tile_manager_) | |
| 413 return; | |
| 414 if (!tile_priorities_dirty_) | 417 if (!tile_priorities_dirty_) |
| 415 return; | 418 return false; |
| 416 | 419 |
| 417 tile_priorities_dirty_ = false; | 420 bool did_prepare_tiles = tile_manager_->PrepareTiles(global_tile_state_); |
| 418 tile_manager_->PrepareTiles(global_tile_state_); | 421 if (did_prepare_tiles) { |
| 419 | 422 tile_priorities_dirty_ = false; |
| 420 client_->DidPrepareTiles(); | 423 client_->DidPrepareTiles(); |
| 424 } | |
| 425 return did_prepare_tiles; | |
| 421 } | 426 } |
| 422 | 427 |
| 423 void LayerTreeHostImpl::StartPageScaleAnimation( | 428 void LayerTreeHostImpl::StartPageScaleAnimation( |
| 424 const gfx::Vector2d& target_offset, | 429 const gfx::Vector2d& target_offset, |
| 425 bool anchor_point, | 430 bool anchor_point, |
| 426 float page_scale, | 431 float page_scale, |
| 427 base::TimeDelta duration) { | 432 base::TimeDelta duration) { |
| 428 if (!InnerViewportScrollLayer()) | 433 if (!InnerViewportScrollLayer()) |
| 429 return; | 434 return; |
| 430 | 435 |
| (...skipping 729 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1160 recycle_tree_->DetachLayerTree(); | 1165 recycle_tree_->DetachLayerTree(); |
| 1161 recycle_tree_ = nullptr; | 1166 recycle_tree_ = nullptr; |
| 1162 } | 1167 } |
| 1163 | 1168 |
| 1164 size_t LayerTreeHostImpl::SourceAnimationFrameNumberForTesting() const { | 1169 size_t LayerTreeHostImpl::SourceAnimationFrameNumberForTesting() const { |
| 1165 return fps_counter_->current_frame_number(); | 1170 return fps_counter_->current_frame_number(); |
| 1166 } | 1171 } |
| 1167 | 1172 |
| 1168 void LayerTreeHostImpl::UpdateTileManagerMemoryPolicy( | 1173 void LayerTreeHostImpl::UpdateTileManagerMemoryPolicy( |
| 1169 const ManagedMemoryPolicy& policy) { | 1174 const ManagedMemoryPolicy& policy) { |
| 1170 if (!tile_manager_) | 1175 if (!resource_pool_) |
| 1171 return; | 1176 return; |
| 1172 | 1177 |
| 1173 global_tile_state_.hard_memory_limit_in_bytes = 0; | 1178 global_tile_state_.hard_memory_limit_in_bytes = 0; |
| 1174 global_tile_state_.soft_memory_limit_in_bytes = 0; | 1179 global_tile_state_.soft_memory_limit_in_bytes = 0; |
| 1175 if (visible_ && policy.bytes_limit_when_visible > 0) { | 1180 if (visible_ && policy.bytes_limit_when_visible > 0) { |
| 1176 global_tile_state_.hard_memory_limit_in_bytes = | 1181 global_tile_state_.hard_memory_limit_in_bytes = |
| 1177 policy.bytes_limit_when_visible; | 1182 policy.bytes_limit_when_visible; |
| 1178 global_tile_state_.soft_memory_limit_in_bytes = | 1183 global_tile_state_.soft_memory_limit_in_bytes = |
| 1179 (static_cast<int64>(global_tile_state_.hard_memory_limit_in_bytes) * | 1184 (static_cast<int64>(global_tile_state_.hard_memory_limit_in_bytes) * |
| 1180 settings_.max_memory_for_prepaint_percentage) / | 1185 settings_.max_memory_for_prepaint_percentage) / |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1312 SetNeedsRedraw(); | 1317 SetNeedsRedraw(); |
| 1313 } | 1318 } |
| 1314 } | 1319 } |
| 1315 | 1320 |
| 1316 void LayerTreeHostImpl::SetMemoryPolicy(const ManagedMemoryPolicy& policy) { | 1321 void LayerTreeHostImpl::SetMemoryPolicy(const ManagedMemoryPolicy& policy) { |
| 1317 SetManagedMemoryPolicy(policy); | 1322 SetManagedMemoryPolicy(policy); |
| 1318 | 1323 |
| 1319 // This is short term solution to synchronously drop tile resources when | 1324 // This is short term solution to synchronously drop tile resources when |
| 1320 // using synchronous compositing to avoid memory usage regression. | 1325 // using synchronous compositing to avoid memory usage regression. |
| 1321 // TODO(boliu): crbug.com/499004 to track removing this. | 1326 // TODO(boliu): crbug.com/499004 to track removing this. |
| 1322 if (!policy.bytes_limit_when_visible && tile_manager_ && | 1327 if (!policy.bytes_limit_when_visible && resource_pool_ && |
| 1323 settings_.using_synchronous_renderer_compositor) { | 1328 settings_.using_synchronous_renderer_compositor) { |
| 1324 ReleaseTreeResources(); | 1329 ReleaseTreeResources(); |
| 1325 // TileManager destruction will synchronoulsy wait for all tile workers to | 1330 // TileManager's reset will synchronoulsy wait for all tile workers to |
| 1326 // be cancelled or completed. This allows all resources to be freed | 1331 // be cancelled or completed. This allows all resources to be freed |
| 1327 // synchronously. | 1332 // synchronously. Note that we don't need to use LayerTreeHostImpl |
| 1328 DestroyTileManager(); | 1333 // since resource_pool and tile_task_worker_pool will be the same. |
| 1329 CreateAndSetTileManager(); | 1334 tile_manager_->FinishTasksAndCleanUp(); |
| 1335 tile_manager_->SetResources(resource_pool_.get(), | |
| 1336 tile_task_worker_pool_->AsTileTaskRunner()); | |
| 1337 UpdateTileManagerMemoryPolicy(ActualManagedMemoryPolicy()); | |
| 1330 RecreateTreeResources(); | 1338 RecreateTreeResources(); |
| 1331 } | 1339 } |
| 1332 } | 1340 } |
| 1333 | 1341 |
| 1334 void LayerTreeHostImpl::SetTreeActivationCallback( | 1342 void LayerTreeHostImpl::SetTreeActivationCallback( |
| 1335 const base::Closure& callback) { | 1343 const base::Closure& callback) { |
| 1336 DCHECK(proxy_->IsImplThread()); | 1344 DCHECK(proxy_->IsImplThread()); |
| 1337 tree_activation_callback_ = callback; | 1345 tree_activation_callback_ = callback; |
| 1338 } | 1346 } |
| 1339 | 1347 |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1426 } | 1434 } |
| 1427 | 1435 |
| 1428 void LayerTreeHostImpl::ReclaimResources(const CompositorFrameAck* ack) { | 1436 void LayerTreeHostImpl::ReclaimResources(const CompositorFrameAck* ack) { |
| 1429 // TODO(piman): We may need to do some validation on this ack before | 1437 // TODO(piman): We may need to do some validation on this ack before |
| 1430 // processing it. | 1438 // processing it. |
| 1431 if (renderer_) | 1439 if (renderer_) |
| 1432 renderer_->ReceiveSwapBuffersAck(*ack); | 1440 renderer_->ReceiveSwapBuffersAck(*ack); |
| 1433 | 1441 |
| 1434 // In OOM, we now might be able to release more resources that were held | 1442 // In OOM, we now might be able to release more resources that were held |
| 1435 // because they were exported. | 1443 // because they were exported. |
| 1436 if (tile_manager_) { | 1444 if (resource_pool_) { |
| 1437 DCHECK(resource_pool_); | |
| 1438 | |
| 1439 resource_pool_->CheckBusyResources(false); | 1445 resource_pool_->CheckBusyResources(false); |
| 1440 resource_pool_->ReduceResourceUsage(); | 1446 resource_pool_->ReduceResourceUsage(); |
| 1441 } | 1447 } |
| 1442 // If we're not visible, we likely released resources, so we want to | 1448 // If we're not visible, we likely released resources, so we want to |
| 1443 // aggressively flush here to make sure those DeleteTextures make it to the | 1449 // aggressively flush here to make sure those DeleteTextures make it to the |
| 1444 // GPU process to free up the memory. | 1450 // GPU process to free up the memory. |
| 1445 if (output_surface_->context_provider() && !visible_) { | 1451 if (output_surface_->context_provider() && !visible_) { |
| 1446 output_surface_->context_provider()->ContextGL()->ShallowFlushCHROMIUM(); | 1452 output_surface_->context_provider()->ContextGL()->ShallowFlushCHROMIUM(); |
| 1447 } | 1453 } |
| 1448 } | 1454 } |
| (...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1671 use_msaa_ = use_msaa; | 1677 use_msaa_ = use_msaa; |
| 1672 | 1678 |
| 1673 tree_resources_for_gpu_rasterization_dirty_ = true; | 1679 tree_resources_for_gpu_rasterization_dirty_ = true; |
| 1674 } | 1680 } |
| 1675 | 1681 |
| 1676 void LayerTreeHostImpl::UpdateTreeResourcesForGpuRasterizationIfNeeded() { | 1682 void LayerTreeHostImpl::UpdateTreeResourcesForGpuRasterizationIfNeeded() { |
| 1677 if (!tree_resources_for_gpu_rasterization_dirty_) | 1683 if (!tree_resources_for_gpu_rasterization_dirty_) |
| 1678 return; | 1684 return; |
| 1679 | 1685 |
| 1680 // Clean up and replace existing tile manager with another one that uses | 1686 // Clean up and replace existing tile manager with another one that uses |
| 1681 // appropriate rasterizer. | 1687 // appropriate rasterizer. Only do this however if we already have a |
| 1688 // resource pool, since otherwise we might not be able to create a new | |
| 1689 // one. | |
| 1682 ReleaseTreeResources(); | 1690 ReleaseTreeResources(); |
| 1683 if (tile_manager_) { | 1691 if (resource_pool_) { |
| 1684 DestroyTileManager(); | 1692 CleanUpTileManager(); |
| 1685 CreateAndSetTileManager(); | 1693 RecreateTileManagerResources(); |
| 1686 } | 1694 } |
| 1687 RecreateTreeResources(); | 1695 RecreateTreeResources(); |
| 1688 | 1696 |
| 1689 // We have released tilings for both active and pending tree. | 1697 // We have released tilings for both active and pending tree. |
| 1690 // We would not have any content to draw until the pending tree is activated. | 1698 // We would not have any content to draw until the pending tree is activated. |
| 1691 // Prevent the active tree from drawing until activation. | 1699 // Prevent the active tree from drawing until activation. |
| 1692 SetRequiresHighResToDraw(); | 1700 SetRequiresHighResToDraw(); |
| 1693 | 1701 |
| 1694 tree_resources_for_gpu_rasterization_dirty_ = false; | 1702 tree_resources_for_gpu_rasterization_dirty_ = false; |
| 1695 } | 1703 } |
| (...skipping 343 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2039 | 2047 |
| 2040 // See note in LayerTreeImpl::UpdateDrawProperties. Renderer needs to be | 2048 // See note in LayerTreeImpl::UpdateDrawProperties. Renderer needs to be |
| 2041 // initialized to get max texture size. Also, after releasing resources, | 2049 // initialized to get max texture size. Also, after releasing resources, |
| 2042 // trees need another update to generate new ones. | 2050 // trees need another update to generate new ones. |
| 2043 active_tree_->set_needs_update_draw_properties(); | 2051 active_tree_->set_needs_update_draw_properties(); |
| 2044 if (pending_tree_) | 2052 if (pending_tree_) |
| 2045 pending_tree_->set_needs_update_draw_properties(); | 2053 pending_tree_->set_needs_update_draw_properties(); |
| 2046 client_->UpdateRendererCapabilitiesOnImplThread(); | 2054 client_->UpdateRendererCapabilitiesOnImplThread(); |
| 2047 } | 2055 } |
| 2048 | 2056 |
| 2049 void LayerTreeHostImpl::CreateAndSetTileManager() { | 2057 void LayerTreeHostImpl::RecreateTileManagerResources() { |
|
enne (OOO)
2015/07/06 18:07:26
bikeshedding: This seems less Recreate and more ju
vmpstr
2015/07/06 18:41:35
Done.
| |
| 2050 DCHECK(!tile_manager_); | |
| 2051 DCHECK(output_surface_); | |
| 2052 DCHECK(resource_provider_); | |
| 2053 | |
| 2054 CreateResourceAndTileTaskWorkerPool(&tile_task_worker_pool_, &resource_pool_, | 2058 CreateResourceAndTileTaskWorkerPool(&tile_task_worker_pool_, &resource_pool_, |
| 2055 &staging_resource_pool_); | 2059 &staging_resource_pool_); |
| 2056 DCHECK(tile_task_worker_pool_); | 2060 tile_manager_->SetResources(resource_pool_.get(), |
| 2057 DCHECK(resource_pool_); | 2061 tile_task_worker_pool_->AsTileTaskRunner()); |
| 2058 | |
| 2059 DCHECK(GetTaskRunner()); | |
| 2060 size_t scheduled_raster_task_limit = | |
| 2061 IsSynchronousSingleThreaded() ? std::numeric_limits<size_t>::max() | |
| 2062 : settings_.scheduled_raster_task_limit; | |
| 2063 tile_manager_ = TileManager::Create( | |
| 2064 this, GetTaskRunner(), resource_pool_.get(), | |
| 2065 tile_task_worker_pool_->AsTileTaskRunner(), scheduled_raster_task_limit); | |
| 2066 | |
| 2067 UpdateTileManagerMemoryPolicy(ActualManagedMemoryPolicy()); | 2062 UpdateTileManagerMemoryPolicy(ActualManagedMemoryPolicy()); |
| 2068 } | 2063 } |
| 2069 | 2064 |
| 2070 void LayerTreeHostImpl::CreateResourceAndTileTaskWorkerPool( | 2065 void LayerTreeHostImpl::CreateResourceAndTileTaskWorkerPool( |
| 2071 scoped_ptr<TileTaskWorkerPool>* tile_task_worker_pool, | 2066 scoped_ptr<TileTaskWorkerPool>* tile_task_worker_pool, |
| 2072 scoped_ptr<ResourcePool>* resource_pool, | 2067 scoped_ptr<ResourcePool>* resource_pool, |
| 2073 scoped_ptr<ResourcePool>* staging_resource_pool) { | 2068 scoped_ptr<ResourcePool>* staging_resource_pool) { |
| 2074 DCHECK(GetTaskRunner()); | 2069 DCHECK(GetTaskRunner()); |
| 2075 | 2070 |
| 2076 // Pass the single-threaded synchronous task graph runner to the worker pool | 2071 // Pass the single-threaded synchronous task graph runner to the worker pool |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2176 request_ids, start_time, end_time, active_tree_->source_frame_number()); | 2171 request_ids, start_time, end_time, active_tree_->source_frame_number()); |
| 2177 } | 2172 } |
| 2178 | 2173 |
| 2179 void LayerTreeHostImpl::PostFrameTimingEvents( | 2174 void LayerTreeHostImpl::PostFrameTimingEvents( |
| 2180 scoped_ptr<FrameTimingTracker::CompositeTimingSet> composite_events, | 2175 scoped_ptr<FrameTimingTracker::CompositeTimingSet> composite_events, |
| 2181 scoped_ptr<FrameTimingTracker::MainFrameTimingSet> main_frame_events) { | 2176 scoped_ptr<FrameTimingTracker::MainFrameTimingSet> main_frame_events) { |
| 2182 client_->PostFrameTimingEventsOnImplThread(composite_events.Pass(), | 2177 client_->PostFrameTimingEventsOnImplThread(composite_events.Pass(), |
| 2183 main_frame_events.Pass()); | 2178 main_frame_events.Pass()); |
| 2184 } | 2179 } |
| 2185 | 2180 |
| 2186 void LayerTreeHostImpl::DestroyTileManager() { | 2181 void LayerTreeHostImpl::CleanUpTileManager() { |
| 2187 tile_manager_ = nullptr; | 2182 tile_manager_->FinishTasksAndCleanUp(); |
| 2188 resource_pool_ = nullptr; | 2183 resource_pool_ = nullptr; |
| 2189 staging_resource_pool_ = nullptr; | 2184 staging_resource_pool_ = nullptr; |
| 2190 tile_task_worker_pool_ = nullptr; | 2185 tile_task_worker_pool_ = nullptr; |
| 2191 single_thread_synchronous_task_graph_runner_ = nullptr; | 2186 single_thread_synchronous_task_graph_runner_ = nullptr; |
| 2192 } | 2187 } |
| 2193 | 2188 |
| 2194 bool LayerTreeHostImpl::IsSynchronousSingleThreaded() const { | 2189 bool LayerTreeHostImpl::IsSynchronousSingleThreaded() const { |
| 2195 return !proxy_->HasImplThread() && !settings_.single_thread_proxy_scheduler; | 2190 return !proxy_->HasImplThread() && !settings_.single_thread_proxy_scheduler; |
| 2196 } | 2191 } |
| 2197 | 2192 |
| 2198 bool LayerTreeHostImpl::InitializeRenderer( | 2193 bool LayerTreeHostImpl::InitializeRenderer( |
| 2199 scoped_ptr<OutputSurface> output_surface) { | 2194 scoped_ptr<OutputSurface> output_surface) { |
| 2200 TRACE_EVENT0("cc", "LayerTreeHostImpl::InitializeRenderer"); | 2195 TRACE_EVENT0("cc", "LayerTreeHostImpl::InitializeRenderer"); |
| 2201 | 2196 |
| 2202 // Since we will create a new resource provider, we cannot continue to use | 2197 // Since we will create a new resource provider, we cannot continue to use |
| 2203 // the old resources (i.e. render_surfaces and texture IDs). Clear them | 2198 // the old resources (i.e. render_surfaces and texture IDs). Clear them |
| 2204 // before we destroy the old resource provider. | 2199 // before we destroy the old resource provider. |
| 2205 ReleaseTreeResources(); | 2200 ReleaseTreeResources(); |
| 2206 | 2201 |
| 2207 // Note: order is important here. | 2202 // Note: order is important here. |
| 2208 renderer_ = nullptr; | 2203 renderer_ = nullptr; |
| 2209 DestroyTileManager(); | 2204 CleanUpTileManager(); |
| 2210 resource_provider_ = nullptr; | 2205 resource_provider_ = nullptr; |
| 2211 output_surface_ = nullptr; | 2206 output_surface_ = nullptr; |
| 2212 | 2207 |
| 2213 if (!output_surface->BindToClient(this)) { | 2208 if (!output_surface->BindToClient(this)) { |
| 2214 // Avoid recreating tree resources because we might not have enough | 2209 // Avoid recreating tree resources because we might not have enough |
| 2215 // information to do this yet (eg. we don't have a TileManager at this | 2210 // information to do this yet (eg. we don't have a TileManager at this |
| 2216 // point). | 2211 // point). |
| 2217 return false; | 2212 return false; |
| 2218 } | 2213 } |
| 2219 | 2214 |
| 2220 output_surface_ = output_surface.Pass(); | 2215 output_surface_ = output_surface.Pass(); |
| 2221 resource_provider_ = ResourceProvider::Create( | 2216 resource_provider_ = ResourceProvider::Create( |
| 2222 output_surface_.get(), shared_bitmap_manager_, gpu_memory_buffer_manager_, | 2217 output_surface_.get(), shared_bitmap_manager_, gpu_memory_buffer_manager_, |
| 2223 proxy_->blocking_main_thread_task_runner(), | 2218 proxy_->blocking_main_thread_task_runner(), |
| 2224 settings_.renderer_settings.highp_threshold_min, | 2219 settings_.renderer_settings.highp_threshold_min, |
| 2225 settings_.renderer_settings.use_rgba_4444_textures, | 2220 settings_.renderer_settings.use_rgba_4444_textures, |
| 2226 settings_.renderer_settings.texture_id_allocation_chunk_size, | 2221 settings_.renderer_settings.texture_id_allocation_chunk_size, |
| 2227 settings_.use_persistent_map_for_gpu_memory_buffers); | 2222 settings_.use_persistent_map_for_gpu_memory_buffers); |
| 2228 | 2223 |
| 2229 CreateAndSetRenderer(); | 2224 CreateAndSetRenderer(); |
| 2230 | 2225 |
| 2231 // Since the new renderer may be capable of MSAA, update status here. | 2226 // Since the new renderer may be capable of MSAA, update status here. |
| 2232 UpdateGpuRasterizationStatus(); | 2227 UpdateGpuRasterizationStatus(); |
| 2233 | 2228 |
| 2234 CreateAndSetTileManager(); | 2229 RecreateTileManagerResources(); |
| 2235 RecreateTreeResources(); | 2230 RecreateTreeResources(); |
| 2236 | 2231 |
| 2237 // Initialize vsync parameters to sane values. | 2232 // Initialize vsync parameters to sane values. |
| 2238 const base::TimeDelta display_refresh_interval = | 2233 const base::TimeDelta display_refresh_interval = |
| 2239 base::TimeDelta::FromMicroseconds( | 2234 base::TimeDelta::FromMicroseconds( |
| 2240 base::Time::kMicrosecondsPerSecond / | 2235 base::Time::kMicrosecondsPerSecond / |
| 2241 settings_.renderer_settings.refresh_rate); | 2236 settings_.renderer_settings.refresh_rate); |
| 2242 CommitVSyncParameters(base::TimeTicks(), display_refresh_interval); | 2237 CommitVSyncParameters(base::TimeTicks(), display_refresh_interval); |
| 2243 | 2238 |
| 2244 // TODO(brianderson): Don't use a hard-coded parent draw time. | 2239 // TODO(brianderson): Don't use a hard-coded parent draw time. |
| (...skipping 1190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3435 new_target.SetToMin(layer_impl->MaxScrollOffset()); | 3430 new_target.SetToMin(layer_impl->MaxScrollOffset()); |
| 3436 | 3431 |
| 3437 curve->UpdateTarget( | 3432 curve->UpdateTarget( |
| 3438 animation->TrimTimeToCurrentIteration(CurrentBeginFrameArgs().frame_time) | 3433 animation->TrimTimeToCurrentIteration(CurrentBeginFrameArgs().frame_time) |
| 3439 .InSecondsF(), | 3434 .InSecondsF(), |
| 3440 new_target); | 3435 new_target); |
| 3441 | 3436 |
| 3442 return true; | 3437 return true; |
| 3443 } | 3438 } |
| 3444 } // namespace cc | 3439 } // namespace cc |
| OLD | NEW |