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 | 9 |
10 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
42 #include "cc/output/copy_output_request.h" | 42 #include "cc/output/copy_output_request.h" |
43 #include "cc/output/delegating_renderer.h" | 43 #include "cc/output/delegating_renderer.h" |
44 #include "cc/output/gl_renderer.h" | 44 #include "cc/output/gl_renderer.h" |
45 #include "cc/output/software_renderer.h" | 45 #include "cc/output/software_renderer.h" |
46 #include "cc/quads/render_pass_draw_quad.h" | 46 #include "cc/quads/render_pass_draw_quad.h" |
47 #include "cc/quads/shared_quad_state.h" | 47 #include "cc/quads/shared_quad_state.h" |
48 #include "cc/quads/solid_color_draw_quad.h" | 48 #include "cc/quads/solid_color_draw_quad.h" |
49 #include "cc/quads/texture_draw_quad.h" | 49 #include "cc/quads/texture_draw_quad.h" |
50 #include "cc/resources/bitmap_tile_task_worker_pool.h" | 50 #include "cc/resources/bitmap_tile_task_worker_pool.h" |
51 #include "cc/resources/eviction_tile_priority_queue.h" | 51 #include "cc/resources/eviction_tile_priority_queue.h" |
| 52 #include "cc/resources/gpu_rasterizer.h" |
52 #include "cc/resources/gpu_tile_task_worker_pool.h" | 53 #include "cc/resources/gpu_tile_task_worker_pool.h" |
53 #include "cc/resources/memory_history.h" | 54 #include "cc/resources/memory_history.h" |
54 #include "cc/resources/one_copy_tile_task_worker_pool.h" | 55 #include "cc/resources/one_copy_tile_task_worker_pool.h" |
55 #include "cc/resources/picture_layer_tiling.h" | 56 #include "cc/resources/picture_layer_tiling.h" |
56 #include "cc/resources/pixel_buffer_tile_task_worker_pool.h" | 57 #include "cc/resources/pixel_buffer_tile_task_worker_pool.h" |
57 #include "cc/resources/prioritized_resource_manager.h" | 58 #include "cc/resources/prioritized_resource_manager.h" |
58 #include "cc/resources/raster_tile_priority_queue.h" | 59 #include "cc/resources/raster_tile_priority_queue.h" |
59 #include "cc/resources/resource_pool.h" | 60 #include "cc/resources/resource_pool.h" |
| 61 #include "cc/resources/software_rasterizer.h" |
60 #include "cc/resources/texture_mailbox_deleter.h" | 62 #include "cc/resources/texture_mailbox_deleter.h" |
61 #include "cc/resources/tile_task_worker_pool.h" | 63 #include "cc/resources/tile_task_worker_pool.h" |
62 #include "cc/resources/ui_resource_bitmap.h" | 64 #include "cc/resources/ui_resource_bitmap.h" |
63 #include "cc/resources/zero_copy_tile_task_worker_pool.h" | 65 #include "cc/resources/zero_copy_tile_task_worker_pool.h" |
64 #include "cc/scheduler/delay_based_time_source.h" | 66 #include "cc/scheduler/delay_based_time_source.h" |
65 #include "cc/trees/damage_tracker.h" | 67 #include "cc/trees/damage_tracker.h" |
66 #include "cc/trees/layer_tree_host.h" | 68 #include "cc/trees/layer_tree_host.h" |
67 #include "cc/trees/layer_tree_host_common.h" | 69 #include "cc/trees/layer_tree_host_common.h" |
68 #include "cc/trees/layer_tree_impl.h" | 70 #include "cc/trees/layer_tree_impl.h" |
69 #include "cc/trees/occlusion_tracker.h" | 71 #include "cc/trees/occlusion_tracker.h" |
(...skipping 397 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
467 | 469 |
468 scoped_ptr<SwapPromiseMonitor> | 470 scoped_ptr<SwapPromiseMonitor> |
469 LayerTreeHostImpl::CreateLatencyInfoSwapPromiseMonitor( | 471 LayerTreeHostImpl::CreateLatencyInfoSwapPromiseMonitor( |
470 ui::LatencyInfo* latency) { | 472 ui::LatencyInfo* latency) { |
471 return make_scoped_ptr( | 473 return make_scoped_ptr( |
472 new LatencyInfoSwapPromiseMonitor(latency, NULL, this)); | 474 new LatencyInfoSwapPromiseMonitor(latency, NULL, this)); |
473 } | 475 } |
474 | 476 |
475 ScrollElasticityHelper* LayerTreeHostImpl::CreateScrollElasticityHelper() { | 477 ScrollElasticityHelper* LayerTreeHostImpl::CreateScrollElasticityHelper() { |
476 DCHECK(!scroll_elasticity_helper_); | 478 DCHECK(!scroll_elasticity_helper_); |
477 scroll_elasticity_helper_.reset( | 479 if (settings_.enable_elastic_overscroll) { |
478 ScrollElasticityHelper::CreateForLayerTreeHostImpl(this)); | 480 scroll_elasticity_helper_.reset( |
| 481 ScrollElasticityHelper::CreateForLayerTreeHostImpl(this)); |
| 482 } |
479 return scroll_elasticity_helper_.get(); | 483 return scroll_elasticity_helper_.get(); |
480 } | 484 } |
481 | 485 |
482 void LayerTreeHostImpl::QueueSwapPromiseForMainThreadScrollUpdate( | 486 void LayerTreeHostImpl::QueueSwapPromiseForMainThreadScrollUpdate( |
483 scoped_ptr<SwapPromise> swap_promise) { | 487 scoped_ptr<SwapPromise> swap_promise) { |
484 swap_promises_for_main_thread_scroll_update_.push_back(swap_promise.Pass()); | 488 swap_promises_for_main_thread_scroll_update_.push_back(swap_promise.Pass()); |
485 } | 489 } |
486 | 490 |
487 void LayerTreeHostImpl::TrackDamageForAllSurfaces( | 491 void LayerTreeHostImpl::TrackDamageForAllSurfaces( |
488 LayerImpl* root_draw_layer, | 492 LayerImpl* root_draw_layer, |
(...skipping 561 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1050 } | 1054 } |
1051 | 1055 |
1052 DrawResult LayerTreeHostImpl::PrepareToDraw(FrameData* frame) { | 1056 DrawResult LayerTreeHostImpl::PrepareToDraw(FrameData* frame) { |
1053 TRACE_EVENT1("cc", | 1057 TRACE_EVENT1("cc", |
1054 "LayerTreeHostImpl::PrepareToDraw", | 1058 "LayerTreeHostImpl::PrepareToDraw", |
1055 "SourceFrameNumber", | 1059 "SourceFrameNumber", |
1056 active_tree_->source_frame_number()); | 1060 active_tree_->source_frame_number()); |
1057 if (input_handler_client_) | 1061 if (input_handler_client_) |
1058 input_handler_client_->ReconcileElasticOverscrollAndRootScroll(); | 1062 input_handler_client_->ReconcileElasticOverscrollAndRootScroll(); |
1059 | 1063 |
1060 // This will cause NotifyTileStateChanged() to be called for any visible tiles | |
1061 // that completed, which will add damage to the frame for them so they appear | |
1062 // as part of the current frame being drawn. | |
1063 if (settings().impl_side_painting) | |
1064 tile_manager_->UpdateVisibleTiles(); | |
1065 | |
1066 UMA_HISTOGRAM_CUSTOM_COUNTS( | 1064 UMA_HISTOGRAM_CUSTOM_COUNTS( |
1067 "Compositing.NumActiveLayers", active_tree_->NumLayers(), 1, 400, 20); | 1065 "Compositing.NumActiveLayers", active_tree_->NumLayers(), 1, 400, 20); |
1068 | 1066 |
1069 bool ok = active_tree_->UpdateDrawProperties(); | 1067 bool ok = active_tree_->UpdateDrawProperties(); |
1070 DCHECK(ok) << "UpdateDrawProperties failed during draw"; | 1068 DCHECK(ok) << "UpdateDrawProperties failed during draw"; |
1071 | 1069 |
| 1070 // This will cause NotifyTileStateChanged() to be called for any visible tiles |
| 1071 // that completed, which will add damage to the frame for them so they appear |
| 1072 // as part of the current frame being drawn. |
| 1073 if (settings().impl_side_painting) |
| 1074 tile_manager_->UpdateVisibleTiles(global_tile_state_); |
| 1075 |
1072 frame->render_surface_layer_list = &active_tree_->RenderSurfaceLayerList(); | 1076 frame->render_surface_layer_list = &active_tree_->RenderSurfaceLayerList(); |
1073 frame->render_passes.clear(); | 1077 frame->render_passes.clear(); |
1074 frame->render_passes_by_id.clear(); | 1078 frame->render_passes_by_id.clear(); |
1075 frame->will_draw_layers.clear(); | 1079 frame->will_draw_layers.clear(); |
1076 frame->has_no_damage = false; | 1080 frame->has_no_damage = false; |
1077 | 1081 |
1078 if (active_tree_->root_layer()) { | 1082 if (active_tree_->root_layer()) { |
1079 gfx::Rect device_viewport_damage_rect = viewport_damage_rect_; | 1083 gfx::Rect device_viewport_damage_rect = viewport_damage_rect_; |
1080 viewport_damage_rect_ = gfx::Rect(); | 1084 viewport_damage_rect_ = gfx::Rect(); |
1081 | 1085 |
(...skipping 726 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1808 active_tree_->top_controls_height()); | 1812 active_tree_->top_controls_height()); |
1809 } | 1813 } |
1810 | 1814 |
1811 UpdateViewportContainerSizes(); | 1815 UpdateViewportContainerSizes(); |
1812 } else { | 1816 } else { |
1813 active_tree_->ProcessUIResourceRequestQueue(); | 1817 active_tree_->ProcessUIResourceRequestQueue(); |
1814 } | 1818 } |
1815 | 1819 |
1816 active_tree_->DidBecomeActive(); | 1820 active_tree_->DidBecomeActive(); |
1817 ActivateAnimations(); | 1821 ActivateAnimations(); |
1818 if (settings_.impl_side_painting) | 1822 if (settings_.impl_side_painting) { |
1819 client_->RenewTreePriority(); | 1823 client_->RenewTreePriority(); |
| 1824 // If we have any picture layers, then by activating we also modified tile |
| 1825 // priorities. |
| 1826 if (!picture_layers_.empty()) |
| 1827 DidModifyTilePriorities(); |
| 1828 } |
1820 | 1829 |
1821 client_->OnCanDrawStateChanged(CanDraw()); | 1830 client_->OnCanDrawStateChanged(CanDraw()); |
1822 client_->DidActivateSyncTree(); | 1831 client_->DidActivateSyncTree(); |
1823 if (!tree_activation_callback_.is_null()) | 1832 if (!tree_activation_callback_.is_null()) |
1824 tree_activation_callback_.Run(); | 1833 tree_activation_callback_.Run(); |
1825 | 1834 |
1826 if (debug_state_.continuous_painting) { | 1835 if (debug_state_.continuous_painting) { |
1827 const RenderingStats& stats = | 1836 const RenderingStats& stats = |
1828 rendering_stats_instrumentation_->GetRenderingStats(); | 1837 rendering_stats_instrumentation_->GetRenderingStats(); |
1829 // TODO(hendrikw): This requires a different metric when we commit directly | 1838 // TODO(hendrikw): This requires a different metric when we commit directly |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1949 pending_tree_->set_needs_update_draw_properties(); | 1958 pending_tree_->set_needs_update_draw_properties(); |
1950 client_->UpdateRendererCapabilitiesOnImplThread(); | 1959 client_->UpdateRendererCapabilitiesOnImplThread(); |
1951 } | 1960 } |
1952 | 1961 |
1953 void LayerTreeHostImpl::CreateAndSetTileManager() { | 1962 void LayerTreeHostImpl::CreateAndSetTileManager() { |
1954 DCHECK(!tile_manager_); | 1963 DCHECK(!tile_manager_); |
1955 DCHECK(settings_.impl_side_painting); | 1964 DCHECK(settings_.impl_side_painting); |
1956 DCHECK(output_surface_); | 1965 DCHECK(output_surface_); |
1957 DCHECK(resource_provider_); | 1966 DCHECK(resource_provider_); |
1958 | 1967 |
| 1968 rasterizer_ = CreateRasterizer(); |
1959 CreateResourceAndTileTaskWorkerPool(&tile_task_worker_pool_, &resource_pool_, | 1969 CreateResourceAndTileTaskWorkerPool(&tile_task_worker_pool_, &resource_pool_, |
1960 &staging_resource_pool_); | 1970 &staging_resource_pool_); |
1961 DCHECK(tile_task_worker_pool_); | 1971 DCHECK(tile_task_worker_pool_); |
1962 DCHECK(resource_pool_); | 1972 DCHECK(resource_pool_); |
1963 | 1973 |
1964 base::SingleThreadTaskRunner* task_runner = | 1974 base::SingleThreadTaskRunner* task_runner = |
1965 proxy_->HasImplThread() ? proxy_->ImplThreadTaskRunner() | 1975 proxy_->HasImplThread() ? proxy_->ImplThreadTaskRunner() |
1966 : proxy_->MainThreadTaskRunner(); | 1976 : proxy_->MainThreadTaskRunner(); |
1967 DCHECK(task_runner); | 1977 DCHECK(task_runner); |
1968 size_t scheduled_raster_task_limit = | 1978 size_t scheduled_raster_task_limit = |
1969 IsSynchronousSingleThreaded() ? std::numeric_limits<size_t>::max() | 1979 IsSynchronousSingleThreaded() ? std::numeric_limits<size_t>::max() |
1970 : settings_.scheduled_raster_task_limit; | 1980 : settings_.scheduled_raster_task_limit; |
1971 tile_manager_ = TileManager::Create( | 1981 tile_manager_ = |
1972 this, task_runner, resource_pool_.get(), | 1982 TileManager::Create(this, task_runner, resource_pool_.get(), |
1973 tile_task_worker_pool_->AsTileTaskRunner(), scheduled_raster_task_limit); | 1983 tile_task_worker_pool_->AsTileTaskRunner(), |
| 1984 rasterizer_.get(), scheduled_raster_task_limit); |
1974 | 1985 |
1975 UpdateTileManagerMemoryPolicy(ActualManagedMemoryPolicy()); | 1986 UpdateTileManagerMemoryPolicy(ActualManagedMemoryPolicy()); |
1976 } | 1987 } |
1977 | 1988 |
| 1989 scoped_ptr<Rasterizer> LayerTreeHostImpl::CreateRasterizer() { |
| 1990 ContextProvider* context_provider = output_surface_->context_provider(); |
| 1991 if (use_gpu_rasterization_ && context_provider) { |
| 1992 return GpuRasterizer::Create(context_provider, resource_provider_.get(), |
| 1993 settings_.use_distance_field_text, false); |
| 1994 } |
| 1995 return SoftwareRasterizer::Create(); |
| 1996 } |
| 1997 |
1978 void LayerTreeHostImpl::CreateResourceAndTileTaskWorkerPool( | 1998 void LayerTreeHostImpl::CreateResourceAndTileTaskWorkerPool( |
1979 scoped_ptr<TileTaskWorkerPool>* tile_task_worker_pool, | 1999 scoped_ptr<TileTaskWorkerPool>* tile_task_worker_pool, |
1980 scoped_ptr<ResourcePool>* resource_pool, | 2000 scoped_ptr<ResourcePool>* resource_pool, |
1981 scoped_ptr<ResourcePool>* staging_resource_pool) { | 2001 scoped_ptr<ResourcePool>* staging_resource_pool) { |
1982 base::SingleThreadTaskRunner* task_runner = | 2002 base::SingleThreadTaskRunner* task_runner = |
1983 proxy_->HasImplThread() ? proxy_->ImplThreadTaskRunner() | 2003 proxy_->HasImplThread() ? proxy_->ImplThreadTaskRunner() |
1984 : proxy_->MainThreadTaskRunner(); | 2004 : proxy_->MainThreadTaskRunner(); |
1985 DCHECK(task_runner); | 2005 DCHECK(task_runner); |
1986 | 2006 |
1987 ContextProvider* context_provider = output_surface_->context_provider(); | 2007 ContextProvider* context_provider = output_surface_->context_provider(); |
1988 if (!context_provider) { | 2008 if (!context_provider) { |
1989 *resource_pool = | 2009 *resource_pool = |
1990 ResourcePool::Create(resource_provider_.get(), | 2010 ResourcePool::Create(resource_provider_.get(), |
1991 GL_TEXTURE_2D, | 2011 GL_TEXTURE_2D, |
1992 resource_provider_->best_texture_format()); | 2012 resource_provider_->best_texture_format()); |
1993 | 2013 |
1994 *tile_task_worker_pool = BitmapTileTaskWorkerPool::Create( | 2014 *tile_task_worker_pool = BitmapTileTaskWorkerPool::Create( |
1995 task_runner, TileTaskWorkerPool::GetTaskGraphRunner(), | 2015 task_runner, TileTaskWorkerPool::GetTaskGraphRunner(), |
1996 resource_provider_.get()); | 2016 resource_provider_.get()); |
1997 return; | 2017 return; |
1998 } | 2018 } |
1999 | 2019 |
2000 if (use_gpu_rasterization_) { | 2020 if (use_gpu_rasterization_) { |
2001 *resource_pool = | 2021 *resource_pool = |
2002 ResourcePool::Create(resource_provider_.get(), | 2022 ResourcePool::Create(resource_provider_.get(), |
2003 GL_TEXTURE_2D, | 2023 GL_TEXTURE_2D, |
2004 resource_provider_->best_texture_format()); | 2024 resource_provider_->best_texture_format()); |
2005 | 2025 |
2006 *tile_task_worker_pool = GpuTileTaskWorkerPool::Create( | 2026 *tile_task_worker_pool = GpuTileTaskWorkerPool::Create( |
2007 task_runner, context_provider, resource_provider_.get(), | 2027 task_runner, TileTaskWorkerPool::GetTaskGraphRunner()); |
2008 settings_.use_distance_field_text); | |
2009 return; | 2028 return; |
2010 } | 2029 } |
2011 | 2030 |
2012 if (GetRendererCapabilities().using_image) { | 2031 if (GetRendererCapabilities().using_image) { |
2013 unsigned image_target = settings_.use_image_texture_target; | 2032 unsigned image_target = settings_.use_image_texture_target; |
2014 DCHECK_IMPLIES( | 2033 DCHECK_IMPLIES( |
2015 image_target == GL_TEXTURE_RECTANGLE_ARB, | 2034 image_target == GL_TEXTURE_RECTANGLE_ARB, |
2016 context_provider->ContextCapabilities().gpu.texture_rectangle); | 2035 context_provider->ContextCapabilities().gpu.texture_rectangle); |
2017 DCHECK_IMPLIES( | 2036 DCHECK_IMPLIES( |
2018 image_target == GL_TEXTURE_EXTERNAL_OES, | 2037 image_target == GL_TEXTURE_EXTERNAL_OES, |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2063 resource_provider_.get(), | 2082 resource_provider_.get(), |
2064 GetMaxTransferBufferUsageBytes(context_provider->ContextCapabilities(), | 2083 GetMaxTransferBufferUsageBytes(context_provider->ContextCapabilities(), |
2065 settings_.renderer_settings.refresh_rate)); | 2084 settings_.renderer_settings.refresh_rate)); |
2066 } | 2085 } |
2067 | 2086 |
2068 void LayerTreeHostImpl::DestroyTileManager() { | 2087 void LayerTreeHostImpl::DestroyTileManager() { |
2069 tile_manager_ = nullptr; | 2088 tile_manager_ = nullptr; |
2070 resource_pool_ = nullptr; | 2089 resource_pool_ = nullptr; |
2071 staging_resource_pool_ = nullptr; | 2090 staging_resource_pool_ = nullptr; |
2072 tile_task_worker_pool_ = nullptr; | 2091 tile_task_worker_pool_ = nullptr; |
| 2092 rasterizer_ = nullptr; |
2073 single_thread_synchronous_task_graph_runner_ = nullptr; | 2093 single_thread_synchronous_task_graph_runner_ = nullptr; |
2074 } | 2094 } |
2075 | 2095 |
2076 bool LayerTreeHostImpl::UsePendingTreeForSync() const { | 2096 bool LayerTreeHostImpl::UsePendingTreeForSync() const { |
2077 // In impl-side painting, synchronize to the pending tree so that it has | 2097 // In impl-side painting, synchronize to the pending tree so that it has |
2078 // time to raster before being displayed. | 2098 // time to raster before being displayed. |
2079 return settings_.impl_side_painting; | 2099 return settings_.impl_side_painting; |
2080 } | 2100 } |
2081 | 2101 |
2082 bool LayerTreeHostImpl::IsSynchronousSingleThreaded() const { | 2102 bool LayerTreeHostImpl::IsSynchronousSingleThreaded() const { |
(...skipping 1398 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3481 } | 3501 } |
3482 | 3502 |
3483 void LayerTreeHostImpl::UnregisterPictureLayerImpl(PictureLayerImpl* layer) { | 3503 void LayerTreeHostImpl::UnregisterPictureLayerImpl(PictureLayerImpl* layer) { |
3484 std::vector<PictureLayerImpl*>::iterator it = | 3504 std::vector<PictureLayerImpl*>::iterator it = |
3485 std::find(picture_layers_.begin(), picture_layers_.end(), layer); | 3505 std::find(picture_layers_.begin(), picture_layers_.end(), layer); |
3486 DCHECK(it != picture_layers_.end()); | 3506 DCHECK(it != picture_layers_.end()); |
3487 picture_layers_.erase(it); | 3507 picture_layers_.erase(it); |
3488 } | 3508 } |
3489 | 3509 |
3490 } // namespace cc | 3510 } // namespace cc |
OLD | NEW |