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 977 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1047 DCHECK_GE(frame->render_passes.size(), position_from_end); | 1049 DCHECK_GE(frame->render_passes.size(), position_from_end); |
1048 } | 1050 } |
1049 } | 1051 } |
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 // This will cause NotifyTileStateChanged() to be called for any visible tiles | |
1058 // that completed, which will add damage to the frame for them so they appear | |
1059 // as part of the current frame being drawn. | |
1060 if (settings().impl_side_painting) | |
1061 tile_manager_->UpdateVisibleTiles(); | |
1062 | |
1063 UMA_HISTOGRAM_CUSTOM_COUNTS( | 1059 UMA_HISTOGRAM_CUSTOM_COUNTS( |
1064 "Compositing.NumActiveLayers", active_tree_->NumLayers(), 1, 400, 20); | 1060 "Compositing.NumActiveLayers", active_tree_->NumLayers(), 1, 400, 20); |
1065 | 1061 |
1066 bool ok = active_tree_->UpdateDrawProperties(); | 1062 bool ok = active_tree_->UpdateDrawProperties(); |
1067 DCHECK(ok) << "UpdateDrawProperties failed during draw"; | 1063 DCHECK(ok) << "UpdateDrawProperties failed during draw"; |
1068 | 1064 |
1065 // This will cause NotifyTileStateChanged() to be called for any visible tiles | |
1066 // that completed, which will add damage to the frame for them so they appear | |
1067 // as part of the current frame being drawn. | |
1068 if (settings().impl_side_painting) | |
1069 tile_manager_->UpdateVisibleTiles(global_tile_state_); | |
1070 | |
1069 frame->render_surface_layer_list = &active_tree_->RenderSurfaceLayerList(); | 1071 frame->render_surface_layer_list = &active_tree_->RenderSurfaceLayerList(); |
1070 frame->render_passes.clear(); | 1072 frame->render_passes.clear(); |
1071 frame->render_passes_by_id.clear(); | 1073 frame->render_passes_by_id.clear(); |
1072 frame->will_draw_layers.clear(); | 1074 frame->will_draw_layers.clear(); |
1073 frame->has_no_damage = false; | 1075 frame->has_no_damage = false; |
1074 | 1076 |
1075 if (active_tree_->root_layer()) { | 1077 if (active_tree_->root_layer()) { |
1076 gfx::Rect device_viewport_damage_rect = viewport_damage_rect_; | 1078 gfx::Rect device_viewport_damage_rect = viewport_damage_rect_; |
1077 viewport_damage_rect_ = gfx::Rect(); | 1079 viewport_damage_rect_ = gfx::Rect(); |
1078 | 1080 |
(...skipping 773 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1852 | 1854 |
1853 // If we just became visible, we have to ensure that we draw high res tiles, | 1855 // If we just became visible, we have to ensure that we draw high res tiles, |
1854 // to prevent checkerboard/low res flashes. | 1856 // to prevent checkerboard/low res flashes. |
1855 if (visible_) | 1857 if (visible_) |
1856 SetRequiresHighResToDraw(); | 1858 SetRequiresHighResToDraw(); |
1857 else | 1859 else |
1858 EvictAllUIResources(); | 1860 EvictAllUIResources(); |
1859 | 1861 |
1860 // Evict tiles immediately if invisible since this tab may never get another | 1862 // Evict tiles immediately if invisible since this tab may never get another |
1861 // draw or timer tick. | 1863 // draw or timer tick. |
1864 // TODO(vmiura): Make sure we do evict tiles in all modes. | |
1862 if (!visible_) | 1865 if (!visible_) |
1863 PrepareTiles(); | 1866 PrepareTiles(); |
1864 | 1867 |
1865 if (!renderer_) | 1868 if (!renderer_) |
1866 return; | 1869 return; |
1867 | 1870 |
1868 renderer_->SetVisible(visible); | 1871 renderer_->SetVisible(visible); |
1869 } | 1872 } |
1870 | 1873 |
1871 void LayerTreeHostImpl::SetNeedsAnimate() { | 1874 void LayerTreeHostImpl::SetNeedsAnimate() { |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1946 pending_tree_->set_needs_update_draw_properties(); | 1949 pending_tree_->set_needs_update_draw_properties(); |
1947 client_->UpdateRendererCapabilitiesOnImplThread(); | 1950 client_->UpdateRendererCapabilitiesOnImplThread(); |
1948 } | 1951 } |
1949 | 1952 |
1950 void LayerTreeHostImpl::CreateAndSetTileManager() { | 1953 void LayerTreeHostImpl::CreateAndSetTileManager() { |
1951 DCHECK(!tile_manager_); | 1954 DCHECK(!tile_manager_); |
1952 DCHECK(settings_.impl_side_painting); | 1955 DCHECK(settings_.impl_side_painting); |
1953 DCHECK(output_surface_); | 1956 DCHECK(output_surface_); |
1954 DCHECK(resource_provider_); | 1957 DCHECK(resource_provider_); |
1955 | 1958 |
1956 CreateResourceAndTileTaskWorkerPool(&tile_task_worker_pool_, &resource_pool_, | 1959 CreateResourceAndTileTaskWorkerPool(&tile_task_worker_pool_, &rasterizer_, |
vmpstr
2014/12/23 09:54:42
..AndRasterizer? :) Can TileManager own the raster
hendrikw
2014/12/23 18:10:33
Do you want TileManager to take a enum (GPU or sof
vmiura
2014/12/23 18:33:13
TileManager doesn't have access to context_provide
hendrikw
2014/12/23 18:54:29
oh fun.
vmiura
2014/12/23 19:08:25
Flowing rasterizer specific settings through TileM
vmpstr
2014/12/23 20:00:01
I meant to say we can create it here, but why stor
| |
1957 &staging_resource_pool_); | 1960 &resource_pool_, &staging_resource_pool_); |
1958 DCHECK(tile_task_worker_pool_); | 1961 DCHECK(tile_task_worker_pool_); |
1959 DCHECK(resource_pool_); | 1962 DCHECK(resource_pool_); |
1960 | 1963 |
1961 base::SingleThreadTaskRunner* task_runner = | 1964 base::SingleThreadTaskRunner* task_runner = |
1962 proxy_->HasImplThread() ? proxy_->ImplThreadTaskRunner() | 1965 proxy_->HasImplThread() ? proxy_->ImplThreadTaskRunner() |
1963 : proxy_->MainThreadTaskRunner(); | 1966 : proxy_->MainThreadTaskRunner(); |
1964 DCHECK(task_runner); | 1967 DCHECK(task_runner); |
1965 size_t scheduled_raster_task_limit = | 1968 size_t scheduled_raster_task_limit = |
1966 IsSynchronousSingleThreaded() ? std::numeric_limits<size_t>::max() | 1969 IsSynchronousSingleThreaded() ? std::numeric_limits<size_t>::max() |
1967 : settings_.scheduled_raster_task_limit; | 1970 : settings_.scheduled_raster_task_limit; |
1968 tile_manager_ = TileManager::Create( | 1971 tile_manager_ = |
1969 this, task_runner, resource_pool_.get(), | 1972 TileManager::Create(this, task_runner, resource_pool_.get(), |
1970 tile_task_worker_pool_->AsTileTaskRunner(), scheduled_raster_task_limit); | 1973 tile_task_worker_pool_->AsTileTaskRunner(), |
1974 rasterizer_.get(), scheduled_raster_task_limit); | |
1971 | 1975 |
1972 UpdateTileManagerMemoryPolicy(ActualManagedMemoryPolicy()); | 1976 UpdateTileManagerMemoryPolicy(ActualManagedMemoryPolicy()); |
1973 } | 1977 } |
1974 | 1978 |
1975 void LayerTreeHostImpl::CreateResourceAndTileTaskWorkerPool( | 1979 void LayerTreeHostImpl::CreateResourceAndTileTaskWorkerPool( |
1976 scoped_ptr<TileTaskWorkerPool>* tile_task_worker_pool, | 1980 scoped_ptr<TileTaskWorkerPool>* tile_task_worker_pool, |
1981 scoped_ptr<Rasterizer>* rasterizer, | |
1977 scoped_ptr<ResourcePool>* resource_pool, | 1982 scoped_ptr<ResourcePool>* resource_pool, |
1978 scoped_ptr<ResourcePool>* staging_resource_pool) { | 1983 scoped_ptr<ResourcePool>* staging_resource_pool) { |
1979 base::SingleThreadTaskRunner* task_runner = | 1984 base::SingleThreadTaskRunner* task_runner = |
1980 proxy_->HasImplThread() ? proxy_->ImplThreadTaskRunner() | 1985 proxy_->HasImplThread() ? proxy_->ImplThreadTaskRunner() |
1981 : proxy_->MainThreadTaskRunner(); | 1986 : proxy_->MainThreadTaskRunner(); |
1982 DCHECK(task_runner); | 1987 DCHECK(task_runner); |
1983 | 1988 |
1984 ContextProvider* context_provider = output_surface_->context_provider(); | 1989 ContextProvider* context_provider = output_surface_->context_provider(); |
1985 if (!context_provider) { | 1990 if (!context_provider) { |
1986 *resource_pool = | 1991 *resource_pool = |
1987 ResourcePool::Create(resource_provider_.get(), | 1992 ResourcePool::Create(resource_provider_.get(), |
1988 GL_TEXTURE_2D, | 1993 GL_TEXTURE_2D, |
1989 resource_provider_->best_texture_format()); | 1994 resource_provider_->best_texture_format()); |
1990 | 1995 |
1991 *tile_task_worker_pool = BitmapTileTaskWorkerPool::Create( | 1996 *tile_task_worker_pool = BitmapTileTaskWorkerPool::Create( |
1992 task_runner, TileTaskWorkerPool::GetTaskGraphRunner(), | 1997 task_runner, TileTaskWorkerPool::GetTaskGraphRunner(), |
1993 resource_provider_.get()); | 1998 resource_provider_.get()); |
1999 | |
2000 *rasterizer = SoftwareRasterizer::Create(); | |
1994 return; | 2001 return; |
1995 } | 2002 } |
1996 | 2003 |
1997 if (use_gpu_rasterization_) { | 2004 if (use_gpu_rasterization_) { |
1998 *resource_pool = | 2005 *resource_pool = |
1999 ResourcePool::Create(resource_provider_.get(), | 2006 ResourcePool::Create(resource_provider_.get(), |
2000 GL_TEXTURE_2D, | 2007 GL_TEXTURE_2D, |
2001 resource_provider_->best_texture_format()); | 2008 resource_provider_->best_texture_format()); |
2002 | 2009 |
2003 *tile_task_worker_pool = GpuTileTaskWorkerPool::Create( | 2010 *tile_task_worker_pool = GpuTileTaskWorkerPool::Create( |
2004 task_runner, context_provider, resource_provider_.get(), | 2011 task_runner, TileTaskWorkerPool::GetTaskGraphRunner()); |
2005 settings_.use_distance_field_text); | 2012 |
2013 *rasterizer = | |
2014 GpuRasterizer::Create(context_provider, resource_provider_.get(), | |
2015 settings_.use_distance_field_text, false); | |
2016 | |
2006 return; | 2017 return; |
2007 } | 2018 } |
2008 | 2019 |
2020 *rasterizer = SoftwareRasterizer::Create(); | |
2021 | |
2009 if (GetRendererCapabilities().using_image) { | 2022 if (GetRendererCapabilities().using_image) { |
2010 unsigned image_target = settings_.use_image_texture_target; | 2023 unsigned image_target = settings_.use_image_texture_target; |
2011 DCHECK_IMPLIES( | 2024 DCHECK_IMPLIES( |
2012 image_target == GL_TEXTURE_RECTANGLE_ARB, | 2025 image_target == GL_TEXTURE_RECTANGLE_ARB, |
2013 context_provider->ContextCapabilities().gpu.texture_rectangle); | 2026 context_provider->ContextCapabilities().gpu.texture_rectangle); |
2014 DCHECK_IMPLIES( | 2027 DCHECK_IMPLIES( |
2015 image_target == GL_TEXTURE_EXTERNAL_OES, | 2028 image_target == GL_TEXTURE_EXTERNAL_OES, |
2016 context_provider->ContextCapabilities().gpu.egl_image_external); | 2029 context_provider->ContextCapabilities().gpu.egl_image_external); |
2017 | 2030 |
2018 if (settings_.use_zero_copy || IsSynchronousSingleThreaded()) { | 2031 if (settings_.use_zero_copy || IsSynchronousSingleThreaded()) { |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2060 resource_provider_.get(), | 2073 resource_provider_.get(), |
2061 GetMaxTransferBufferUsageBytes(context_provider->ContextCapabilities(), | 2074 GetMaxTransferBufferUsageBytes(context_provider->ContextCapabilities(), |
2062 settings_.renderer_settings.refresh_rate)); | 2075 settings_.renderer_settings.refresh_rate)); |
2063 } | 2076 } |
2064 | 2077 |
2065 void LayerTreeHostImpl::DestroyTileManager() { | 2078 void LayerTreeHostImpl::DestroyTileManager() { |
2066 tile_manager_ = nullptr; | 2079 tile_manager_ = nullptr; |
2067 resource_pool_ = nullptr; | 2080 resource_pool_ = nullptr; |
2068 staging_resource_pool_ = nullptr; | 2081 staging_resource_pool_ = nullptr; |
2069 tile_task_worker_pool_ = nullptr; | 2082 tile_task_worker_pool_ = nullptr; |
2083 rasterizer_ = nullptr; | |
2070 single_thread_synchronous_task_graph_runner_ = nullptr; | 2084 single_thread_synchronous_task_graph_runner_ = nullptr; |
2071 } | 2085 } |
2072 | 2086 |
2073 bool LayerTreeHostImpl::UsePendingTreeForSync() const { | 2087 bool LayerTreeHostImpl::UsePendingTreeForSync() const { |
2074 // In impl-side painting, synchronize to the pending tree so that it has | 2088 // In impl-side painting, synchronize to the pending tree so that it has |
2075 // time to raster before being displayed. | 2089 // time to raster before being displayed. |
2076 return settings_.impl_side_painting; | 2090 return settings_.impl_side_painting; |
2077 } | 2091 } |
2078 | 2092 |
2079 bool LayerTreeHostImpl::IsSynchronousSingleThreaded() const { | 2093 bool LayerTreeHostImpl::IsSynchronousSingleThreaded() const { |
(...skipping 1398 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3478 } | 3492 } |
3479 | 3493 |
3480 void LayerTreeHostImpl::UnregisterPictureLayerImpl(PictureLayerImpl* layer) { | 3494 void LayerTreeHostImpl::UnregisterPictureLayerImpl(PictureLayerImpl* layer) { |
3481 std::vector<PictureLayerImpl*>::iterator it = | 3495 std::vector<PictureLayerImpl*>::iterator it = |
3482 std::find(picture_layers_.begin(), picture_layers_.end(), layer); | 3496 std::find(picture_layers_.begin(), picture_layers_.end(), layer); |
3483 DCHECK(it != picture_layers_.end()); | 3497 DCHECK(it != picture_layers_.end()); |
3484 picture_layers_.erase(it); | 3498 picture_layers_.erase(it); |
3485 } | 3499 } |
3486 | 3500 |
3487 } // namespace cc | 3501 } // namespace cc |
OLD | NEW |