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 305 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
375 | 377 |
376 void LayerTreeHostImpl::Animate(base::TimeTicks monotonic_time) { | 378 void LayerTreeHostImpl::Animate(base::TimeTicks monotonic_time) { |
377 if (input_handler_client_) | 379 if (input_handler_client_) |
378 input_handler_client_->Animate(monotonic_time); | 380 input_handler_client_->Animate(monotonic_time); |
379 AnimatePageScale(monotonic_time); | 381 AnimatePageScale(monotonic_time); |
380 AnimateLayers(monotonic_time); | 382 AnimateLayers(monotonic_time); |
381 AnimateScrollbars(monotonic_time); | 383 AnimateScrollbars(monotonic_time); |
382 AnimateTopControls(monotonic_time); | 384 AnimateTopControls(monotonic_time); |
383 } | 385 } |
384 | 386 |
| 387 void LayerTreeHostImpl::PrepareTilesBeforeDraw() { |
| 388 if (!tile_manager_) |
| 389 return; |
| 390 |
| 391 tile_manager_->PrepareTilesBeforeDraw(global_tile_state_); |
| 392 } |
| 393 |
385 void LayerTreeHostImpl::PrepareTiles() { | 394 void LayerTreeHostImpl::PrepareTiles() { |
386 if (!tile_manager_) | 395 if (!tile_manager_) |
387 return; | 396 return; |
388 if (!tile_priorities_dirty_) | 397 if (!tile_priorities_dirty_) |
389 return; | 398 return; |
390 | 399 |
391 tile_priorities_dirty_ = false; | 400 tile_priorities_dirty_ = false; |
392 tile_manager_->PrepareTiles(global_tile_state_); | 401 tile_manager_->PrepareTiles(global_tile_state_); |
393 | 402 |
394 client_->DidPrepareTiles(); | 403 client_->DidPrepareTiles(); |
(...skipping 663 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1058 // as part of the current frame being drawn. | 1067 // as part of the current frame being drawn. |
1059 if (settings().impl_side_painting) | 1068 if (settings().impl_side_painting) |
1060 tile_manager_->UpdateVisibleTiles(); | 1069 tile_manager_->UpdateVisibleTiles(); |
1061 | 1070 |
1062 UMA_HISTOGRAM_CUSTOM_COUNTS( | 1071 UMA_HISTOGRAM_CUSTOM_COUNTS( |
1063 "Compositing.NumActiveLayers", active_tree_->NumLayers(), 1, 400, 20); | 1072 "Compositing.NumActiveLayers", active_tree_->NumLayers(), 1, 400, 20); |
1064 | 1073 |
1065 bool ok = active_tree_->UpdateDrawProperties(); | 1074 bool ok = active_tree_->UpdateDrawProperties(); |
1066 DCHECK(ok) << "UpdateDrawProperties failed during draw"; | 1075 DCHECK(ok) << "UpdateDrawProperties failed during draw"; |
1067 | 1076 |
| 1077 PrepareTilesBeforeDraw(); |
| 1078 |
1068 frame->render_surface_layer_list = &active_tree_->RenderSurfaceLayerList(); | 1079 frame->render_surface_layer_list = &active_tree_->RenderSurfaceLayerList(); |
1069 frame->render_passes.clear(); | 1080 frame->render_passes.clear(); |
1070 frame->render_passes_by_id.clear(); | 1081 frame->render_passes_by_id.clear(); |
1071 frame->will_draw_layers.clear(); | 1082 frame->will_draw_layers.clear(); |
1072 frame->has_no_damage = false; | 1083 frame->has_no_damage = false; |
1073 | 1084 |
1074 if (active_tree_->root_layer()) { | 1085 if (active_tree_->root_layer()) { |
1075 gfx::Rect device_viewport_damage_rect = viewport_damage_rect_; | 1086 gfx::Rect device_viewport_damage_rect = viewport_damage_rect_; |
1076 viewport_damage_rect_ = gfx::Rect(); | 1087 viewport_damage_rect_ = gfx::Rect(); |
1077 | 1088 |
(...skipping 773 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1851 | 1862 |
1852 // If we just became visible, we have to ensure that we draw high res tiles, | 1863 // If we just became visible, we have to ensure that we draw high res tiles, |
1853 // to prevent checkerboard/low res flashes. | 1864 // to prevent checkerboard/low res flashes. |
1854 if (visible_) | 1865 if (visible_) |
1855 SetRequiresHighResToDraw(); | 1866 SetRequiresHighResToDraw(); |
1856 else | 1867 else |
1857 EvictAllUIResources(); | 1868 EvictAllUIResources(); |
1858 | 1869 |
1859 // Evict tiles immediately if invisible since this tab may never get another | 1870 // Evict tiles immediately if invisible since this tab may never get another |
1860 // draw or timer tick. | 1871 // draw or timer tick. |
| 1872 // TODO(vmiura): Make sure we do evict tiles in all modes. |
1861 if (!visible_) | 1873 if (!visible_) |
1862 PrepareTiles(); | 1874 PrepareTiles(); |
1863 | 1875 |
1864 if (!renderer_) | 1876 if (!renderer_) |
1865 return; | 1877 return; |
1866 | 1878 |
1867 renderer_->SetVisible(visible); | 1879 renderer_->SetVisible(visible); |
1868 } | 1880 } |
1869 | 1881 |
1870 void LayerTreeHostImpl::SetNeedsAnimate() { | 1882 void LayerTreeHostImpl::SetNeedsAnimate() { |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1945 pending_tree_->set_needs_update_draw_properties(); | 1957 pending_tree_->set_needs_update_draw_properties(); |
1946 client_->UpdateRendererCapabilitiesOnImplThread(); | 1958 client_->UpdateRendererCapabilitiesOnImplThread(); |
1947 } | 1959 } |
1948 | 1960 |
1949 void LayerTreeHostImpl::CreateAndSetTileManager() { | 1961 void LayerTreeHostImpl::CreateAndSetTileManager() { |
1950 DCHECK(!tile_manager_); | 1962 DCHECK(!tile_manager_); |
1951 DCHECK(settings_.impl_side_painting); | 1963 DCHECK(settings_.impl_side_painting); |
1952 DCHECK(output_surface_); | 1964 DCHECK(output_surface_); |
1953 DCHECK(resource_provider_); | 1965 DCHECK(resource_provider_); |
1954 | 1966 |
1955 CreateResourceAndTileTaskWorkerPool(&tile_task_worker_pool_, &resource_pool_, | 1967 CreateResourceAndTileTaskWorkerPool(&tile_task_worker_pool_, &rasterizer_, |
1956 &staging_resource_pool_); | 1968 &resource_pool_, &staging_resource_pool_); |
1957 DCHECK(tile_task_worker_pool_); | 1969 DCHECK(tile_task_worker_pool_); |
1958 DCHECK(resource_pool_); | 1970 DCHECK(resource_pool_); |
1959 | 1971 |
1960 base::SingleThreadTaskRunner* task_runner = | 1972 base::SingleThreadTaskRunner* task_runner = |
1961 proxy_->HasImplThread() ? proxy_->ImplThreadTaskRunner() | 1973 proxy_->HasImplThread() ? proxy_->ImplThreadTaskRunner() |
1962 : proxy_->MainThreadTaskRunner(); | 1974 : proxy_->MainThreadTaskRunner(); |
1963 DCHECK(task_runner); | 1975 DCHECK(task_runner); |
1964 size_t scheduled_raster_task_limit = | 1976 size_t scheduled_raster_task_limit = |
1965 IsSynchronousSingleThreaded() ? std::numeric_limits<size_t>::max() | 1977 IsSynchronousSingleThreaded() ? std::numeric_limits<size_t>::max() |
1966 : settings_.scheduled_raster_task_limit; | 1978 : settings_.scheduled_raster_task_limit; |
1967 tile_manager_ = TileManager::Create( | 1979 tile_manager_ = |
1968 this, task_runner, resource_pool_.get(), | 1980 TileManager::Create(this, task_runner, resource_pool_.get(), |
1969 tile_task_worker_pool_->AsTileTaskRunner(), scheduled_raster_task_limit); | 1981 tile_task_worker_pool_->AsTileTaskRunner(), |
| 1982 rasterizer_.get(), scheduled_raster_task_limit); |
1970 | 1983 |
1971 UpdateTileManagerMemoryPolicy(ActualManagedMemoryPolicy()); | 1984 UpdateTileManagerMemoryPolicy(ActualManagedMemoryPolicy()); |
1972 } | 1985 } |
1973 | 1986 |
1974 void LayerTreeHostImpl::CreateResourceAndTileTaskWorkerPool( | 1987 void LayerTreeHostImpl::CreateResourceAndTileTaskWorkerPool( |
1975 scoped_ptr<TileTaskWorkerPool>* tile_task_worker_pool, | 1988 scoped_ptr<TileTaskWorkerPool>* tile_task_worker_pool, |
| 1989 scoped_ptr<Rasterizer>* rasterizer, |
1976 scoped_ptr<ResourcePool>* resource_pool, | 1990 scoped_ptr<ResourcePool>* resource_pool, |
1977 scoped_ptr<ResourcePool>* staging_resource_pool) { | 1991 scoped_ptr<ResourcePool>* staging_resource_pool) { |
1978 base::SingleThreadTaskRunner* task_runner = | 1992 base::SingleThreadTaskRunner* task_runner = |
1979 proxy_->HasImplThread() ? proxy_->ImplThreadTaskRunner() | 1993 proxy_->HasImplThread() ? proxy_->ImplThreadTaskRunner() |
1980 : proxy_->MainThreadTaskRunner(); | 1994 : proxy_->MainThreadTaskRunner(); |
1981 DCHECK(task_runner); | 1995 DCHECK(task_runner); |
1982 | 1996 |
1983 ContextProvider* context_provider = output_surface_->context_provider(); | 1997 ContextProvider* context_provider = output_surface_->context_provider(); |
1984 if (!context_provider) { | 1998 if (!context_provider) { |
1985 *resource_pool = | 1999 *resource_pool = |
1986 ResourcePool::Create(resource_provider_.get(), | 2000 ResourcePool::Create(resource_provider_.get(), |
1987 GL_TEXTURE_2D, | 2001 GL_TEXTURE_2D, |
1988 resource_provider_->best_texture_format()); | 2002 resource_provider_->best_texture_format()); |
1989 | 2003 |
1990 *tile_task_worker_pool = BitmapTileTaskWorkerPool::Create( | 2004 *tile_task_worker_pool = BitmapTileTaskWorkerPool::Create( |
1991 task_runner, TileTaskWorkerPool::GetTaskGraphRunner(), | 2005 task_runner, TileTaskWorkerPool::GetTaskGraphRunner(), |
1992 resource_provider_.get()); | 2006 resource_provider_.get()); |
| 2007 |
| 2008 *rasterizer = SoftwareRasterizer::Create(); |
1993 return; | 2009 return; |
1994 } | 2010 } |
1995 | 2011 |
1996 if (use_gpu_rasterization_) { | 2012 if (use_gpu_rasterization_) { |
1997 *resource_pool = | 2013 *resource_pool = |
1998 ResourcePool::Create(resource_provider_.get(), | 2014 ResourcePool::Create(resource_provider_.get(), |
1999 GL_TEXTURE_2D, | 2015 GL_TEXTURE_2D, |
2000 resource_provider_->best_texture_format()); | 2016 resource_provider_->best_texture_format()); |
2001 | 2017 |
2002 *tile_task_worker_pool = GpuTileTaskWorkerPool::Create( | 2018 *tile_task_worker_pool = GpuTileTaskWorkerPool::Create( |
2003 task_runner, context_provider, resource_provider_.get(), | 2019 task_runner, TileTaskWorkerPool::GetTaskGraphRunner(), context_provider, |
2004 settings_.use_distance_field_text); | 2020 resource_provider_.get(), settings_.use_distance_field_text); |
| 2021 |
| 2022 *rasterizer = |
| 2023 GpuRasterizer::Create(context_provider, resource_provider_.get(), |
| 2024 settings_.use_distance_field_text, false); |
| 2025 |
2005 return; | 2026 return; |
2006 } | 2027 } |
2007 | 2028 |
2008 if (GetRendererCapabilities().using_image) { | 2029 if (GetRendererCapabilities().using_image) { |
2009 unsigned image_target = settings_.use_image_texture_target; | 2030 unsigned image_target = settings_.use_image_texture_target; |
2010 DCHECK_IMPLIES( | 2031 DCHECK_IMPLIES( |
2011 image_target == GL_TEXTURE_RECTANGLE_ARB, | 2032 image_target == GL_TEXTURE_RECTANGLE_ARB, |
2012 context_provider->ContextCapabilities().gpu.texture_rectangle); | 2033 context_provider->ContextCapabilities().gpu.texture_rectangle); |
2013 DCHECK_IMPLIES( | 2034 DCHECK_IMPLIES( |
2014 image_target == GL_TEXTURE_EXTERNAL_OES, | 2035 image_target == GL_TEXTURE_EXTERNAL_OES, |
2015 context_provider->ContextCapabilities().gpu.egl_image_external); | 2036 context_provider->ContextCapabilities().gpu.egl_image_external); |
2016 | 2037 |
| 2038 *rasterizer = SoftwareRasterizer::Create(); |
| 2039 |
2017 if (settings_.use_zero_copy || IsSynchronousSingleThreaded()) { | 2040 if (settings_.use_zero_copy || IsSynchronousSingleThreaded()) { |
2018 *resource_pool = | 2041 *resource_pool = |
2019 ResourcePool::Create(resource_provider_.get(), image_target, | 2042 ResourcePool::Create(resource_provider_.get(), image_target, |
2020 resource_provider_->best_texture_format()); | 2043 resource_provider_->best_texture_format()); |
2021 | 2044 |
2022 TaskGraphRunner* task_graph_runner; | 2045 TaskGraphRunner* task_graph_runner; |
2023 if (IsSynchronousSingleThreaded()) { | 2046 if (IsSynchronousSingleThreaded()) { |
2024 DCHECK(!single_thread_synchronous_task_graph_runner_); | 2047 DCHECK(!single_thread_synchronous_task_graph_runner_); |
2025 single_thread_synchronous_task_graph_runner_.reset(new TaskGraphRunner); | 2048 single_thread_synchronous_task_graph_runner_.reset(new TaskGraphRunner); |
2026 task_graph_runner = single_thread_synchronous_task_graph_runner_.get(); | 2049 task_graph_runner = single_thread_synchronous_task_graph_runner_.get(); |
(...skipping 25 matching lines...) Expand all Loading... |
2052 | 2075 |
2053 *resource_pool = ResourcePool::Create( | 2076 *resource_pool = ResourcePool::Create( |
2054 resource_provider_.get(), GL_TEXTURE_2D, | 2077 resource_provider_.get(), GL_TEXTURE_2D, |
2055 resource_provider_->memory_efficient_texture_format()); | 2078 resource_provider_->memory_efficient_texture_format()); |
2056 | 2079 |
2057 *tile_task_worker_pool = PixelBufferTileTaskWorkerPool::Create( | 2080 *tile_task_worker_pool = PixelBufferTileTaskWorkerPool::Create( |
2058 task_runner, TileTaskWorkerPool::GetTaskGraphRunner(), context_provider, | 2081 task_runner, TileTaskWorkerPool::GetTaskGraphRunner(), context_provider, |
2059 resource_provider_.get(), | 2082 resource_provider_.get(), |
2060 GetMaxTransferBufferUsageBytes(context_provider->ContextCapabilities(), | 2083 GetMaxTransferBufferUsageBytes(context_provider->ContextCapabilities(), |
2061 settings_.renderer_settings.refresh_rate)); | 2084 settings_.renderer_settings.refresh_rate)); |
| 2085 |
| 2086 *rasterizer = SoftwareRasterizer::Create(); |
2062 } | 2087 } |
2063 | 2088 |
2064 void LayerTreeHostImpl::DestroyTileManager() { | 2089 void LayerTreeHostImpl::DestroyTileManager() { |
2065 tile_manager_ = nullptr; | 2090 tile_manager_ = nullptr; |
2066 resource_pool_ = nullptr; | 2091 resource_pool_ = nullptr; |
2067 staging_resource_pool_ = nullptr; | 2092 staging_resource_pool_ = nullptr; |
2068 tile_task_worker_pool_ = nullptr; | 2093 tile_task_worker_pool_ = nullptr; |
| 2094 rasterizer_ = nullptr; |
2069 single_thread_synchronous_task_graph_runner_ = nullptr; | 2095 single_thread_synchronous_task_graph_runner_ = nullptr; |
2070 } | 2096 } |
2071 | 2097 |
2072 bool LayerTreeHostImpl::UsePendingTreeForSync() const { | 2098 bool LayerTreeHostImpl::UsePendingTreeForSync() const { |
2073 // In impl-side painting, synchronize to the pending tree so that it has | 2099 // In impl-side painting, synchronize to the pending tree so that it has |
2074 // time to raster before being displayed. | 2100 // time to raster before being displayed. |
2075 return settings_.impl_side_painting; | 2101 return settings_.impl_side_painting; |
2076 } | 2102 } |
2077 | 2103 |
2078 bool LayerTreeHostImpl::IsSynchronousSingleThreaded() const { | 2104 bool LayerTreeHostImpl::IsSynchronousSingleThreaded() const { |
(...skipping 1398 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3477 } | 3503 } |
3478 | 3504 |
3479 void LayerTreeHostImpl::UnregisterPictureLayerImpl(PictureLayerImpl* layer) { | 3505 void LayerTreeHostImpl::UnregisterPictureLayerImpl(PictureLayerImpl* layer) { |
3480 std::vector<PictureLayerImpl*>::iterator it = | 3506 std::vector<PictureLayerImpl*>::iterator it = |
3481 std::find(picture_layers_.begin(), picture_layers_.end(), layer); | 3507 std::find(picture_layers_.begin(), picture_layers_.end(), layer); |
3482 DCHECK(it != picture_layers_.end()); | 3508 DCHECK(it != picture_layers_.end()); |
3483 picture_layers_.erase(it); | 3509 picture_layers_.erase(it); |
3484 } | 3510 } |
3485 | 3511 |
3486 } // namespace cc | 3512 } // namespace cc |
OLD | NEW |