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 | 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 980 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1050 } | 1052 } |
| 1051 | 1053 |
| 1052 DrawResult LayerTreeHostImpl::PrepareToDraw(FrameData* frame) { | 1054 DrawResult LayerTreeHostImpl::PrepareToDraw(FrameData* frame) { |
| 1053 TRACE_EVENT1("cc", | 1055 TRACE_EVENT1("cc", |
| 1054 "LayerTreeHostImpl::PrepareToDraw", | 1056 "LayerTreeHostImpl::PrepareToDraw", |
| 1055 "SourceFrameNumber", | 1057 "SourceFrameNumber", |
| 1056 active_tree_->source_frame_number()); | 1058 active_tree_->source_frame_number()); |
| 1057 if (input_handler_client_) | 1059 if (input_handler_client_) |
| 1058 input_handler_client_->ReconcileElasticOverscrollAndRootScroll(); | 1060 input_handler_client_->ReconcileElasticOverscrollAndRootScroll(); |
| 1059 | 1061 |
| 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( | 1062 UMA_HISTOGRAM_CUSTOM_COUNTS( |
| 1067 "Compositing.NumActiveLayers", active_tree_->NumLayers(), 1, 400, 20); | 1063 "Compositing.NumActiveLayers", active_tree_->NumLayers(), 1, 400, 20); |
| 1068 | 1064 |
| 1069 bool ok = active_tree_->UpdateDrawProperties(); | 1065 bool ok = active_tree_->UpdateDrawProperties(); |
| 1070 DCHECK(ok) << "UpdateDrawProperties failed during draw"; | 1066 DCHECK(ok) << "UpdateDrawProperties failed during draw"; |
| 1071 | 1067 |
| 1068 // This will cause NotifyTileStateChanged() to be called for any visible tiles | |
| 1069 // that completed, which will add damage to the frame for them so they appear | |
| 1070 // as part of the current frame being drawn. | |
| 1071 if (settings().impl_side_painting) | |
| 1072 tile_manager_->UpdateVisibleTiles(global_tile_state_); | |
| 1073 | |
| 1072 frame->render_surface_layer_list = &active_tree_->RenderSurfaceLayerList(); | 1074 frame->render_surface_layer_list = &active_tree_->RenderSurfaceLayerList(); |
| 1073 frame->render_passes.clear(); | 1075 frame->render_passes.clear(); |
| 1074 frame->render_passes_by_id.clear(); | 1076 frame->render_passes_by_id.clear(); |
| 1075 frame->will_draw_layers.clear(); | 1077 frame->will_draw_layers.clear(); |
| 1076 frame->has_no_damage = false; | 1078 frame->has_no_damage = false; |
| 1077 | 1079 |
| 1078 if (active_tree_->root_layer()) { | 1080 if (active_tree_->root_layer()) { |
| 1079 gfx::Rect device_viewport_damage_rect = viewport_damage_rect_; | 1081 gfx::Rect device_viewport_damage_rect = viewport_damage_rect_; |
| 1080 viewport_damage_rect_ = gfx::Rect(); | 1082 viewport_damage_rect_ = gfx::Rect(); |
| 1081 | 1083 |
| (...skipping 773 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1855 | 1857 |
| 1856 // If we just became visible, we have to ensure that we draw high res tiles, | 1858 // If we just became visible, we have to ensure that we draw high res tiles, |
| 1857 // to prevent checkerboard/low res flashes. | 1859 // to prevent checkerboard/low res flashes. |
| 1858 if (visible_) | 1860 if (visible_) |
| 1859 SetRequiresHighResToDraw(); | 1861 SetRequiresHighResToDraw(); |
| 1860 else | 1862 else |
| 1861 EvictAllUIResources(); | 1863 EvictAllUIResources(); |
| 1862 | 1864 |
| 1863 // Evict tiles immediately if invisible since this tab may never get another | 1865 // Evict tiles immediately if invisible since this tab may never get another |
| 1864 // draw or timer tick. | 1866 // draw or timer tick. |
| 1867 // TODO(vmiura): Make sure we do evict tiles in all modes. | |
|
vmpstr
2014/12/30 22:55:23
This needs to be addressed in this patch (ideally
hendrikw
2014/12/31 00:03:56
Done.
| |
| 1865 if (!visible_) | 1868 if (!visible_) |
| 1866 PrepareTiles(); | 1869 PrepareTiles(); |
| 1867 | 1870 |
| 1868 if (!renderer_) | 1871 if (!renderer_) |
| 1869 return; | 1872 return; |
| 1870 | 1873 |
| 1871 renderer_->SetVisible(visible); | 1874 renderer_->SetVisible(visible); |
| 1872 } | 1875 } |
| 1873 | 1876 |
| 1874 void LayerTreeHostImpl::SetNeedsAnimate() { | 1877 void LayerTreeHostImpl::SetNeedsAnimate() { |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1949 pending_tree_->set_needs_update_draw_properties(); | 1952 pending_tree_->set_needs_update_draw_properties(); |
| 1950 client_->UpdateRendererCapabilitiesOnImplThread(); | 1953 client_->UpdateRendererCapabilitiesOnImplThread(); |
| 1951 } | 1954 } |
| 1952 | 1955 |
| 1953 void LayerTreeHostImpl::CreateAndSetTileManager() { | 1956 void LayerTreeHostImpl::CreateAndSetTileManager() { |
| 1954 DCHECK(!tile_manager_); | 1957 DCHECK(!tile_manager_); |
| 1955 DCHECK(settings_.impl_side_painting); | 1958 DCHECK(settings_.impl_side_painting); |
| 1956 DCHECK(output_surface_); | 1959 DCHECK(output_surface_); |
| 1957 DCHECK(resource_provider_); | 1960 DCHECK(resource_provider_); |
| 1958 | 1961 |
| 1962 CreateRasterizer(&rasterizer_); | |
| 1959 CreateResourceAndTileTaskWorkerPool(&tile_task_worker_pool_, &resource_pool_, | 1963 CreateResourceAndTileTaskWorkerPool(&tile_task_worker_pool_, &resource_pool_, |
| 1960 &staging_resource_pool_); | 1964 &staging_resource_pool_); |
| 1961 DCHECK(tile_task_worker_pool_); | 1965 DCHECK(tile_task_worker_pool_); |
| 1962 DCHECK(resource_pool_); | 1966 DCHECK(resource_pool_); |
| 1963 | 1967 |
| 1964 base::SingleThreadTaskRunner* task_runner = | 1968 base::SingleThreadTaskRunner* task_runner = |
| 1965 proxy_->HasImplThread() ? proxy_->ImplThreadTaskRunner() | 1969 proxy_->HasImplThread() ? proxy_->ImplThreadTaskRunner() |
| 1966 : proxy_->MainThreadTaskRunner(); | 1970 : proxy_->MainThreadTaskRunner(); |
| 1967 DCHECK(task_runner); | 1971 DCHECK(task_runner); |
| 1968 size_t scheduled_raster_task_limit = | 1972 size_t scheduled_raster_task_limit = |
| 1969 IsSynchronousSingleThreaded() ? std::numeric_limits<size_t>::max() | 1973 IsSynchronousSingleThreaded() ? std::numeric_limits<size_t>::max() |
| 1970 : settings_.scheduled_raster_task_limit; | 1974 : settings_.scheduled_raster_task_limit; |
| 1971 tile_manager_ = TileManager::Create( | 1975 tile_manager_ = |
| 1972 this, task_runner, resource_pool_.get(), | 1976 TileManager::Create(this, task_runner, resource_pool_.get(), |
| 1973 tile_task_worker_pool_->AsTileTaskRunner(), scheduled_raster_task_limit); | 1977 tile_task_worker_pool_->AsTileTaskRunner(), |
| 1978 rasterizer_.get(), scheduled_raster_task_limit); | |
| 1974 | 1979 |
| 1975 UpdateTileManagerMemoryPolicy(ActualManagedMemoryPolicy()); | 1980 UpdateTileManagerMemoryPolicy(ActualManagedMemoryPolicy()); |
| 1976 } | 1981 } |
| 1977 | 1982 |
| 1983 void LayerTreeHostImpl::CreateRasterizer(scoped_ptr<Rasterizer>* rasterizer) { | |
| 1984 ContextProvider* context_provider = output_surface_->context_provider(); | |
| 1985 if (use_gpu_rasterization_ && context_provider) { | |
| 1986 *rasterizer = | |
| 1987 GpuRasterizer::Create(context_provider, resource_provider_.get(), | |
| 1988 settings_.use_distance_field_text, false); | |
| 1989 return; | |
| 1990 } | |
| 1991 *rasterizer = SoftwareRasterizer::Create(); | |
| 1992 } | |
| 1993 | |
| 1978 void LayerTreeHostImpl::CreateResourceAndTileTaskWorkerPool( | 1994 void LayerTreeHostImpl::CreateResourceAndTileTaskWorkerPool( |
| 1979 scoped_ptr<TileTaskWorkerPool>* tile_task_worker_pool, | 1995 scoped_ptr<TileTaskWorkerPool>* tile_task_worker_pool, |
| 1980 scoped_ptr<ResourcePool>* resource_pool, | 1996 scoped_ptr<ResourcePool>* resource_pool, |
| 1981 scoped_ptr<ResourcePool>* staging_resource_pool) { | 1997 scoped_ptr<ResourcePool>* staging_resource_pool) { |
| 1982 base::SingleThreadTaskRunner* task_runner = | 1998 base::SingleThreadTaskRunner* task_runner = |
| 1983 proxy_->HasImplThread() ? proxy_->ImplThreadTaskRunner() | 1999 proxy_->HasImplThread() ? proxy_->ImplThreadTaskRunner() |
| 1984 : proxy_->MainThreadTaskRunner(); | 2000 : proxy_->MainThreadTaskRunner(); |
| 1985 DCHECK(task_runner); | 2001 DCHECK(task_runner); |
| 1986 | 2002 |
| 1987 ContextProvider* context_provider = output_surface_->context_provider(); | 2003 ContextProvider* context_provider = output_surface_->context_provider(); |
| 1988 if (!context_provider) { | 2004 if (!context_provider) { |
| 1989 *resource_pool = | 2005 *resource_pool = |
| 1990 ResourcePool::Create(resource_provider_.get(), | 2006 ResourcePool::Create(resource_provider_.get(), |
| 1991 GL_TEXTURE_2D, | 2007 GL_TEXTURE_2D, |
| 1992 resource_provider_->best_texture_format()); | 2008 resource_provider_->best_texture_format()); |
| 1993 | 2009 |
| 1994 *tile_task_worker_pool = BitmapTileTaskWorkerPool::Create( | 2010 *tile_task_worker_pool = BitmapTileTaskWorkerPool::Create( |
| 1995 task_runner, TileTaskWorkerPool::GetTaskGraphRunner(), | 2011 task_runner, TileTaskWorkerPool::GetTaskGraphRunner(), |
| 1996 resource_provider_.get()); | 2012 resource_provider_.get()); |
| 1997 return; | 2013 return; |
| 1998 } | 2014 } |
| 1999 | 2015 |
| 2000 if (use_gpu_rasterization_) { | 2016 if (use_gpu_rasterization_) { |
| 2001 *resource_pool = | 2017 *resource_pool = |
| 2002 ResourcePool::Create(resource_provider_.get(), | 2018 ResourcePool::Create(resource_provider_.get(), |
| 2003 GL_TEXTURE_2D, | 2019 GL_TEXTURE_2D, |
| 2004 resource_provider_->best_texture_format()); | 2020 resource_provider_->best_texture_format()); |
| 2005 | 2021 |
| 2006 *tile_task_worker_pool = GpuTileTaskWorkerPool::Create( | 2022 *tile_task_worker_pool = GpuTileTaskWorkerPool::Create( |
| 2007 task_runner, context_provider, resource_provider_.get(), | 2023 task_runner, TileTaskWorkerPool::GetTaskGraphRunner()); |
| 2008 settings_.use_distance_field_text); | |
| 2009 return; | 2024 return; |
| 2010 } | 2025 } |
| 2011 | 2026 |
| 2012 if (GetRendererCapabilities().using_image) { | 2027 if (GetRendererCapabilities().using_image) { |
| 2013 unsigned image_target = settings_.use_image_texture_target; | 2028 unsigned image_target = settings_.use_image_texture_target; |
| 2014 DCHECK_IMPLIES( | 2029 DCHECK_IMPLIES( |
| 2015 image_target == GL_TEXTURE_RECTANGLE_ARB, | 2030 image_target == GL_TEXTURE_RECTANGLE_ARB, |
| 2016 context_provider->ContextCapabilities().gpu.texture_rectangle); | 2031 context_provider->ContextCapabilities().gpu.texture_rectangle); |
| 2017 DCHECK_IMPLIES( | 2032 DCHECK_IMPLIES( |
| 2018 image_target == GL_TEXTURE_EXTERNAL_OES, | 2033 image_target == GL_TEXTURE_EXTERNAL_OES, |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2063 resource_provider_.get(), | 2078 resource_provider_.get(), |
| 2064 GetMaxTransferBufferUsageBytes(context_provider->ContextCapabilities(), | 2079 GetMaxTransferBufferUsageBytes(context_provider->ContextCapabilities(), |
| 2065 settings_.renderer_settings.refresh_rate)); | 2080 settings_.renderer_settings.refresh_rate)); |
| 2066 } | 2081 } |
| 2067 | 2082 |
| 2068 void LayerTreeHostImpl::DestroyTileManager() { | 2083 void LayerTreeHostImpl::DestroyTileManager() { |
| 2069 tile_manager_ = nullptr; | 2084 tile_manager_ = nullptr; |
| 2070 resource_pool_ = nullptr; | 2085 resource_pool_ = nullptr; |
| 2071 staging_resource_pool_ = nullptr; | 2086 staging_resource_pool_ = nullptr; |
| 2072 tile_task_worker_pool_ = nullptr; | 2087 tile_task_worker_pool_ = nullptr; |
| 2088 rasterizer_ = nullptr; | |
| 2073 single_thread_synchronous_task_graph_runner_ = nullptr; | 2089 single_thread_synchronous_task_graph_runner_ = nullptr; |
| 2074 } | 2090 } |
| 2075 | 2091 |
| 2076 bool LayerTreeHostImpl::UsePendingTreeForSync() const { | 2092 bool LayerTreeHostImpl::UsePendingTreeForSync() const { |
| 2077 // In impl-side painting, synchronize to the pending tree so that it has | 2093 // In impl-side painting, synchronize to the pending tree so that it has |
| 2078 // time to raster before being displayed. | 2094 // time to raster before being displayed. |
| 2079 return settings_.impl_side_painting; | 2095 return settings_.impl_side_painting; |
| 2080 } | 2096 } |
| 2081 | 2097 |
| 2082 bool LayerTreeHostImpl::IsSynchronousSingleThreaded() const { | 2098 bool LayerTreeHostImpl::IsSynchronousSingleThreaded() const { |
| (...skipping 1398 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3481 } | 3497 } |
| 3482 | 3498 |
| 3483 void LayerTreeHostImpl::UnregisterPictureLayerImpl(PictureLayerImpl* layer) { | 3499 void LayerTreeHostImpl::UnregisterPictureLayerImpl(PictureLayerImpl* layer) { |
| 3484 std::vector<PictureLayerImpl*>::iterator it = | 3500 std::vector<PictureLayerImpl*>::iterator it = |
| 3485 std::find(picture_layers_.begin(), picture_layers_.end(), layer); | 3501 std::find(picture_layers_.begin(), picture_layers_.end(), layer); |
| 3486 DCHECK(it != picture_layers_.end()); | 3502 DCHECK(it != picture_layers_.end()); |
| 3487 picture_layers_.erase(it); | 3503 picture_layers_.erase(it); |
| 3488 } | 3504 } |
| 3489 | 3505 |
| 3490 } // namespace cc | 3506 } // namespace cc |
| OLD | NEW |