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 982 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1052 } | 1054 } |
1053 | 1055 |
1054 DrawResult LayerTreeHostImpl::PrepareToDraw(FrameData* frame) { | 1056 DrawResult LayerTreeHostImpl::PrepareToDraw(FrameData* frame) { |
1055 TRACE_EVENT1("cc", | 1057 TRACE_EVENT1("cc", |
1056 "LayerTreeHostImpl::PrepareToDraw", | 1058 "LayerTreeHostImpl::PrepareToDraw", |
1057 "SourceFrameNumber", | 1059 "SourceFrameNumber", |
1058 active_tree_->source_frame_number()); | 1060 active_tree_->source_frame_number()); |
1059 if (input_handler_client_) | 1061 if (input_handler_client_) |
1060 input_handler_client_->ReconcileElasticOverscrollAndRootScroll(); | 1062 input_handler_client_->ReconcileElasticOverscrollAndRootScroll(); |
1061 | 1063 |
1062 // This will cause NotifyTileStateChanged() to be called for any visible tiles | |
1063 // that completed, which will add damage to the frame for them so they appear | |
1064 // as part of the current frame being drawn. | |
1065 if (settings().impl_side_painting) | |
1066 tile_manager_->UpdateVisibleTiles(); | |
1067 | |
1068 UMA_HISTOGRAM_CUSTOM_COUNTS( | 1064 UMA_HISTOGRAM_CUSTOM_COUNTS( |
1069 "Compositing.NumActiveLayers", active_tree_->NumLayers(), 1, 400, 20); | 1065 "Compositing.NumActiveLayers", active_tree_->NumLayers(), 1, 400, 20); |
1070 | 1066 |
1071 bool ok = active_tree_->UpdateDrawProperties(); | 1067 bool ok = active_tree_->UpdateDrawProperties(); |
1072 DCHECK(ok) << "UpdateDrawProperties failed during draw"; | 1068 DCHECK(ok) << "UpdateDrawProperties failed during draw"; |
1073 | 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 |
1074 frame->render_surface_layer_list = &active_tree_->RenderSurfaceLayerList(); | 1076 frame->render_surface_layer_list = &active_tree_->RenderSurfaceLayerList(); |
1075 frame->render_passes.clear(); | 1077 frame->render_passes.clear(); |
1076 frame->render_passes_by_id.clear(); | 1078 frame->render_passes_by_id.clear(); |
1077 frame->will_draw_layers.clear(); | 1079 frame->will_draw_layers.clear(); |
1078 frame->has_no_damage = false; | 1080 frame->has_no_damage = false; |
1079 | 1081 |
1080 if (active_tree_->root_layer()) { | 1082 if (active_tree_->root_layer()) { |
1081 gfx::Rect device_viewport_damage_rect = viewport_damage_rect_; | 1083 gfx::Rect device_viewport_damage_rect = viewport_damage_rect_; |
1082 viewport_damage_rect_ = gfx::Rect(); | 1084 viewport_damage_rect_ = gfx::Rect(); |
1083 | 1085 |
(...skipping 872 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1956 pending_tree_->set_needs_update_draw_properties(); | 1958 pending_tree_->set_needs_update_draw_properties(); |
1957 client_->UpdateRendererCapabilitiesOnImplThread(); | 1959 client_->UpdateRendererCapabilitiesOnImplThread(); |
1958 } | 1960 } |
1959 | 1961 |
1960 void LayerTreeHostImpl::CreateAndSetTileManager() { | 1962 void LayerTreeHostImpl::CreateAndSetTileManager() { |
1961 DCHECK(!tile_manager_); | 1963 DCHECK(!tile_manager_); |
1962 DCHECK(settings_.impl_side_painting); | 1964 DCHECK(settings_.impl_side_painting); |
1963 DCHECK(output_surface_); | 1965 DCHECK(output_surface_); |
1964 DCHECK(resource_provider_); | 1966 DCHECK(resource_provider_); |
1965 | 1967 |
| 1968 rasterizer_ = CreateRasterizer(); |
1966 CreateResourceAndTileTaskWorkerPool(&tile_task_worker_pool_, &resource_pool_, | 1969 CreateResourceAndTileTaskWorkerPool(&tile_task_worker_pool_, &resource_pool_, |
1967 &staging_resource_pool_); | 1970 &staging_resource_pool_); |
1968 DCHECK(tile_task_worker_pool_); | 1971 DCHECK(tile_task_worker_pool_); |
1969 DCHECK(resource_pool_); | 1972 DCHECK(resource_pool_); |
1970 | 1973 |
1971 base::SingleThreadTaskRunner* task_runner = | 1974 base::SingleThreadTaskRunner* task_runner = |
1972 proxy_->HasImplThread() ? proxy_->ImplThreadTaskRunner() | 1975 proxy_->HasImplThread() ? proxy_->ImplThreadTaskRunner() |
1973 : proxy_->MainThreadTaskRunner(); | 1976 : proxy_->MainThreadTaskRunner(); |
1974 DCHECK(task_runner); | 1977 DCHECK(task_runner); |
1975 size_t scheduled_raster_task_limit = | 1978 size_t scheduled_raster_task_limit = |
1976 IsSynchronousSingleThreaded() ? std::numeric_limits<size_t>::max() | 1979 IsSynchronousSingleThreaded() ? std::numeric_limits<size_t>::max() |
1977 : settings_.scheduled_raster_task_limit; | 1980 : settings_.scheduled_raster_task_limit; |
1978 tile_manager_ = TileManager::Create( | 1981 tile_manager_ = |
1979 this, task_runner, resource_pool_.get(), | 1982 TileManager::Create(this, task_runner, resource_pool_.get(), |
1980 tile_task_worker_pool_->AsTileTaskRunner(), scheduled_raster_task_limit); | 1983 tile_task_worker_pool_->AsTileTaskRunner(), |
| 1984 rasterizer_.get(), scheduled_raster_task_limit); |
1981 | 1985 |
1982 UpdateTileManagerMemoryPolicy(ActualManagedMemoryPolicy()); | 1986 UpdateTileManagerMemoryPolicy(ActualManagedMemoryPolicy()); |
1983 } | 1987 } |
1984 | 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 |
1985 void LayerTreeHostImpl::CreateResourceAndTileTaskWorkerPool( | 1998 void LayerTreeHostImpl::CreateResourceAndTileTaskWorkerPool( |
1986 scoped_ptr<TileTaskWorkerPool>* tile_task_worker_pool, | 1999 scoped_ptr<TileTaskWorkerPool>* tile_task_worker_pool, |
1987 scoped_ptr<ResourcePool>* resource_pool, | 2000 scoped_ptr<ResourcePool>* resource_pool, |
1988 scoped_ptr<ResourcePool>* staging_resource_pool) { | 2001 scoped_ptr<ResourcePool>* staging_resource_pool) { |
1989 base::SingleThreadTaskRunner* task_runner = | 2002 base::SingleThreadTaskRunner* task_runner = |
1990 proxy_->HasImplThread() ? proxy_->ImplThreadTaskRunner() | 2003 proxy_->HasImplThread() ? proxy_->ImplThreadTaskRunner() |
1991 : proxy_->MainThreadTaskRunner(); | 2004 : proxy_->MainThreadTaskRunner(); |
1992 DCHECK(task_runner); | 2005 DCHECK(task_runner); |
1993 | 2006 |
1994 ContextProvider* context_provider = output_surface_->context_provider(); | 2007 ContextProvider* context_provider = output_surface_->context_provider(); |
1995 if (!context_provider) { | 2008 if (!context_provider) { |
1996 *resource_pool = | 2009 *resource_pool = |
1997 ResourcePool::Create(resource_provider_.get(), | 2010 ResourcePool::Create(resource_provider_.get(), |
1998 GL_TEXTURE_2D, | 2011 GL_TEXTURE_2D, |
1999 resource_provider_->best_texture_format()); | 2012 resource_provider_->best_texture_format()); |
2000 | 2013 |
2001 *tile_task_worker_pool = BitmapTileTaskWorkerPool::Create( | 2014 *tile_task_worker_pool = BitmapTileTaskWorkerPool::Create( |
2002 task_runner, TileTaskWorkerPool::GetTaskGraphRunner(), | 2015 task_runner, TileTaskWorkerPool::GetTaskGraphRunner(), |
2003 resource_provider_.get()); | 2016 resource_provider_.get()); |
2004 return; | 2017 return; |
2005 } | 2018 } |
2006 | 2019 |
2007 if (use_gpu_rasterization_) { | 2020 if (use_gpu_rasterization_) { |
2008 *resource_pool = | 2021 *resource_pool = |
2009 ResourcePool::Create(resource_provider_.get(), | 2022 ResourcePool::Create(resource_provider_.get(), |
2010 GL_TEXTURE_2D, | 2023 GL_TEXTURE_2D, |
2011 resource_provider_->best_texture_format()); | 2024 resource_provider_->best_texture_format()); |
2012 | 2025 |
2013 *tile_task_worker_pool = GpuTileTaskWorkerPool::Create( | 2026 *tile_task_worker_pool = GpuTileTaskWorkerPool::Create( |
2014 task_runner, context_provider, resource_provider_.get(), | 2027 task_runner, TileTaskWorkerPool::GetTaskGraphRunner()); |
2015 settings_.use_distance_field_text); | |
2016 return; | 2028 return; |
2017 } | 2029 } |
2018 | 2030 |
2019 if (GetRendererCapabilities().using_image) { | 2031 if (GetRendererCapabilities().using_image) { |
2020 unsigned image_target = settings_.use_image_texture_target; | 2032 unsigned image_target = settings_.use_image_texture_target; |
2021 DCHECK_IMPLIES( | 2033 DCHECK_IMPLIES( |
2022 image_target == GL_TEXTURE_RECTANGLE_ARB, | 2034 image_target == GL_TEXTURE_RECTANGLE_ARB, |
2023 context_provider->ContextCapabilities().gpu.texture_rectangle); | 2035 context_provider->ContextCapabilities().gpu.texture_rectangle); |
2024 DCHECK_IMPLIES( | 2036 DCHECK_IMPLIES( |
2025 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... |
2070 resource_provider_.get(), | 2082 resource_provider_.get(), |
2071 GetMaxTransferBufferUsageBytes(context_provider->ContextCapabilities(), | 2083 GetMaxTransferBufferUsageBytes(context_provider->ContextCapabilities(), |
2072 settings_.renderer_settings.refresh_rate)); | 2084 settings_.renderer_settings.refresh_rate)); |
2073 } | 2085 } |
2074 | 2086 |
2075 void LayerTreeHostImpl::DestroyTileManager() { | 2087 void LayerTreeHostImpl::DestroyTileManager() { |
2076 tile_manager_ = nullptr; | 2088 tile_manager_ = nullptr; |
2077 resource_pool_ = nullptr; | 2089 resource_pool_ = nullptr; |
2078 staging_resource_pool_ = nullptr; | 2090 staging_resource_pool_ = nullptr; |
2079 tile_task_worker_pool_ = nullptr; | 2091 tile_task_worker_pool_ = nullptr; |
| 2092 rasterizer_ = nullptr; |
2080 single_thread_synchronous_task_graph_runner_ = nullptr; | 2093 single_thread_synchronous_task_graph_runner_ = nullptr; |
2081 } | 2094 } |
2082 | 2095 |
2083 bool LayerTreeHostImpl::UsePendingTreeForSync() const { | 2096 bool LayerTreeHostImpl::UsePendingTreeForSync() const { |
2084 // 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 |
2085 // time to raster before being displayed. | 2098 // time to raster before being displayed. |
2086 return settings_.impl_side_painting; | 2099 return settings_.impl_side_painting; |
2087 } | 2100 } |
2088 | 2101 |
2089 bool LayerTreeHostImpl::IsSynchronousSingleThreaded() const { | 2102 bool LayerTreeHostImpl::IsSynchronousSingleThreaded() const { |
(...skipping 1398 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3488 } | 3501 } |
3489 | 3502 |
3490 void LayerTreeHostImpl::UnregisterPictureLayerImpl(PictureLayerImpl* layer) { | 3503 void LayerTreeHostImpl::UnregisterPictureLayerImpl(PictureLayerImpl* layer) { |
3491 std::vector<PictureLayerImpl*>::iterator it = | 3504 std::vector<PictureLayerImpl*>::iterator it = |
3492 std::find(picture_layers_.begin(), picture_layers_.end(), layer); | 3505 std::find(picture_layers_.begin(), picture_layers_.end(), layer); |
3493 DCHECK(it != picture_layers_.end()); | 3506 DCHECK(it != picture_layers_.end()); |
3494 picture_layers_.erase(it); | 3507 picture_layers_.erase(it); |
3495 } | 3508 } |
3496 | 3509 |
3497 } // namespace cc | 3510 } // namespace cc |
OLD | NEW |