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 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
43 #include "cc/quads/shared_quad_state.h" | 43 #include "cc/quads/shared_quad_state.h" |
44 #include "cc/quads/solid_color_draw_quad.h" | 44 #include "cc/quads/solid_color_draw_quad.h" |
45 #include "cc/quads/texture_draw_quad.h" | 45 #include "cc/quads/texture_draw_quad.h" |
46 #include "cc/resources/direct_raster_worker_pool.h" | 46 #include "cc/resources/direct_raster_worker_pool.h" |
47 #include "cc/resources/image_raster_worker_pool.h" | 47 #include "cc/resources/image_raster_worker_pool.h" |
48 #include "cc/resources/memory_history.h" | 48 #include "cc/resources/memory_history.h" |
49 #include "cc/resources/picture_layer_tiling.h" | 49 #include "cc/resources/picture_layer_tiling.h" |
50 #include "cc/resources/pixel_buffer_raster_worker_pool.h" | 50 #include "cc/resources/pixel_buffer_raster_worker_pool.h" |
51 #include "cc/resources/prioritized_resource_manager.h" | 51 #include "cc/resources/prioritized_resource_manager.h" |
52 #include "cc/resources/raster_worker_pool.h" | 52 #include "cc/resources/raster_worker_pool.h" |
| 53 #include "cc/resources/resource_pool.h" |
53 #include "cc/resources/texture_mailbox_deleter.h" | 54 #include "cc/resources/texture_mailbox_deleter.h" |
54 #include "cc/resources/ui_resource_bitmap.h" | 55 #include "cc/resources/ui_resource_bitmap.h" |
55 #include "cc/scheduler/delay_based_time_source.h" | 56 #include "cc/scheduler/delay_based_time_source.h" |
56 #include "cc/trees/damage_tracker.h" | 57 #include "cc/trees/damage_tracker.h" |
57 #include "cc/trees/layer_tree_host.h" | 58 #include "cc/trees/layer_tree_host.h" |
58 #include "cc/trees/layer_tree_host_common.h" | 59 #include "cc/trees/layer_tree_host_common.h" |
59 #include "cc/trees/layer_tree_impl.h" | 60 #include "cc/trees/layer_tree_impl.h" |
60 #include "cc/trees/occlusion_tracker.h" | 61 #include "cc/trees/occlusion_tracker.h" |
61 #include "cc/trees/quad_culler.h" | 62 #include "cc/trees/quad_culler.h" |
62 #include "cc/trees/single_thread_proxy.h" | 63 #include "cc/trees/single_thread_proxy.h" |
(...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
300 // will outlive them, and we must make good. | 301 // will outlive them, and we must make good. |
301 if (recycle_tree_) | 302 if (recycle_tree_) |
302 recycle_tree_->Shutdown(); | 303 recycle_tree_->Shutdown(); |
303 if (pending_tree_) | 304 if (pending_tree_) |
304 pending_tree_->Shutdown(); | 305 pending_tree_->Shutdown(); |
305 active_tree_->Shutdown(); | 306 active_tree_->Shutdown(); |
306 recycle_tree_.reset(); | 307 recycle_tree_.reset(); |
307 pending_tree_.reset(); | 308 pending_tree_.reset(); |
308 active_tree_.reset(); | 309 active_tree_.reset(); |
309 tile_manager_.reset(); | 310 tile_manager_.reset(); |
| 311 resource_pool_.reset(); |
310 raster_worker_pool_.reset(); | 312 raster_worker_pool_.reset(); |
311 direct_raster_worker_pool_.reset(); | 313 direct_raster_worker_pool_.reset(); |
312 } | 314 } |
313 | 315 |
314 void LayerTreeHostImpl::BeginMainFrameAborted(bool did_handle) { | 316 void LayerTreeHostImpl::BeginMainFrameAborted(bool did_handle) { |
315 // If the begin frame data was handled, then scroll and scale set was applied | 317 // If the begin frame data was handled, then scroll and scale set was applied |
316 // by the main thread, so the active tree needs to be updated as if these sent | 318 // by the main thread, so the active tree needs to be updated as if these sent |
317 // values were applied and committed. | 319 // values were applied and committed. |
318 if (did_handle) { | 320 if (did_handle) { |
319 active_tree_->ApplySentScrollAndScaleDeltasFromAbortedCommit(); | 321 active_tree_->ApplySentScrollAndScaleDeltasFromAbortedCommit(); |
(...skipping 863 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1183 (static_cast<int64>(global_tile_state_.soft_memory_limit_in_bytes) * | 1185 (static_cast<int64>(global_tile_state_.soft_memory_limit_in_bytes) * |
1184 settings_.max_unused_resource_memory_percentage) / | 1186 settings_.max_unused_resource_memory_percentage) / |
1185 100); | 1187 100); |
1186 global_tile_state_.memory_limit_policy = | 1188 global_tile_state_.memory_limit_policy = |
1187 ManagedMemoryPolicy::PriorityCutoffToTileMemoryLimitPolicy( | 1189 ManagedMemoryPolicy::PriorityCutoffToTileMemoryLimitPolicy( |
1188 visible_ ? | 1190 visible_ ? |
1189 policy.priority_cutoff_when_visible : | 1191 policy.priority_cutoff_when_visible : |
1190 gpu::MemoryAllocation::CUTOFF_ALLOW_NOTHING); | 1192 gpu::MemoryAllocation::CUTOFF_ALLOW_NOTHING); |
1191 global_tile_state_.num_resources_limit = policy.num_resources_limit; | 1193 global_tile_state_.num_resources_limit = policy.num_resources_limit; |
1192 | 1194 |
| 1195 DCHECK(resource_pool_); |
| 1196 resource_pool_->CheckBusyResources(); |
| 1197 // Soft limit is used for resource pool such that memory returns to soft |
| 1198 // limit after going over. |
| 1199 resource_pool_->SetResourceUsageLimits( |
| 1200 global_tile_state_.soft_memory_limit_in_bytes, |
| 1201 global_tile_state_.unused_memory_limit_in_bytes, |
| 1202 global_tile_state_.num_resources_limit); |
| 1203 |
1193 DidModifyTilePriorities(); | 1204 DidModifyTilePriorities(); |
1194 } | 1205 } |
1195 | 1206 |
1196 void LayerTreeHostImpl::DidModifyTilePriorities() { | 1207 void LayerTreeHostImpl::DidModifyTilePriorities() { |
1197 DCHECK(settings_.impl_side_painting); | 1208 DCHECK(settings_.impl_side_painting); |
1198 // Mark priorities as dirty and schedule a ManageTiles(). | 1209 // Mark priorities as dirty and schedule a ManageTiles(). |
1199 tile_priorities_dirty_ = true; | 1210 tile_priorities_dirty_ = true; |
1200 client_->SetNeedsManageTilesOnImplThread(); | 1211 client_->SetNeedsManageTilesOnImplThread(); |
1201 } | 1212 } |
1202 | 1213 |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1296 | 1307 |
1297 void LayerTreeHostImpl::ReclaimResources(const CompositorFrameAck* ack) { | 1308 void LayerTreeHostImpl::ReclaimResources(const CompositorFrameAck* ack) { |
1298 // TODO(piman): We may need to do some validation on this ack before | 1309 // TODO(piman): We may need to do some validation on this ack before |
1299 // processing it. | 1310 // processing it. |
1300 if (renderer_) | 1311 if (renderer_) |
1301 renderer_->ReceiveSwapBuffersAck(*ack); | 1312 renderer_->ReceiveSwapBuffersAck(*ack); |
1302 | 1313 |
1303 // In OOM, we now might be able to release more resources that were held | 1314 // In OOM, we now might be able to release more resources that were held |
1304 // because they were exported. | 1315 // because they were exported. |
1305 if (tile_manager_) { | 1316 if (tile_manager_) { |
1306 DCHECK(tile_manager_->resource_pool()); | 1317 DCHECK(resource_pool_); |
1307 | 1318 |
1308 // TODO(vmpstr): Move resource pool to be LTHI member. | 1319 resource_pool_->CheckBusyResources(); |
1309 tile_manager_->resource_pool()->CheckBusyResources(); | 1320 resource_pool_->ReduceResourceUsage(); |
1310 tile_manager_->resource_pool()->ReduceResourceUsage(); | |
1311 } | 1321 } |
1312 // If we're not visible, we likely released resources, so we want to | 1322 // If we're not visible, we likely released resources, so we want to |
1313 // aggressively flush here to make sure those DeleteTextures make it to the | 1323 // aggressively flush here to make sure those DeleteTextures make it to the |
1314 // GPU process to free up the memory. | 1324 // GPU process to free up the memory. |
1315 if (resource_provider_ && !visible_) | 1325 if (resource_provider_ && !visible_) |
1316 resource_provider_->ShallowFlushIfSupported(); | 1326 resource_provider_->ShallowFlushIfSupported(); |
1317 } | 1327 } |
1318 | 1328 |
1319 void LayerTreeHostImpl::OnCanDrawStateChangedForTree() { | 1329 void LayerTreeHostImpl::OnCanDrawStateChangedForTree() { |
1320 client_->OnCanDrawStateChanged(CanDraw()); | 1330 client_->OnCanDrawStateChanged(CanDraw()); |
(...skipping 469 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1790 void LayerTreeHostImpl::CreateAndSetTileManager( | 1800 void LayerTreeHostImpl::CreateAndSetTileManager( |
1791 ResourceProvider* resource_provider, | 1801 ResourceProvider* resource_provider, |
1792 ContextProvider* context_provider, | 1802 ContextProvider* context_provider, |
1793 bool using_map_image, | 1803 bool using_map_image, |
1794 bool allow_rasterize_on_demand) { | 1804 bool allow_rasterize_on_demand) { |
1795 DCHECK(settings_.impl_side_painting); | 1805 DCHECK(settings_.impl_side_painting); |
1796 DCHECK(resource_provider); | 1806 DCHECK(resource_provider); |
1797 DCHECK(proxy_->ImplThreadTaskRunner()); | 1807 DCHECK(proxy_->ImplThreadTaskRunner()); |
1798 | 1808 |
1799 if (using_map_image) { | 1809 if (using_map_image) { |
1800 raster_worker_pool_ = ImageRasterWorkerPool::Create( | 1810 raster_worker_pool_ = |
1801 proxy_->ImplThreadTaskRunner(), | 1811 ImageRasterWorkerPool::Create(proxy_->ImplThreadTaskRunner(), |
1802 RasterWorkerPool::GetTaskGraphRunner(), | 1812 RasterWorkerPool::GetTaskGraphRunner(), |
1803 resource_provider, | 1813 resource_provider); |
1804 GetMapImageTextureTarget(context_provider)); | 1814 resource_pool_ = |
| 1815 ResourcePool::Create(resource_provider, |
| 1816 GetMapImageTextureTarget(context_provider), |
| 1817 resource_provider->best_texture_format()); |
1805 } else { | 1818 } else { |
1806 raster_worker_pool_ = PixelBufferRasterWorkerPool::Create( | 1819 raster_worker_pool_ = PixelBufferRasterWorkerPool::Create( |
1807 proxy_->ImplThreadTaskRunner(), | 1820 proxy_->ImplThreadTaskRunner(), |
1808 RasterWorkerPool::GetTaskGraphRunner(), | 1821 RasterWorkerPool::GetTaskGraphRunner(), |
1809 resource_provider, | 1822 resource_provider, |
1810 GetMaxTransferBufferUsageBytes(context_provider)); | 1823 GetMaxTransferBufferUsageBytes(context_provider)); |
| 1824 resource_pool_ = ResourcePool::Create( |
| 1825 resource_provider, |
| 1826 GL_TEXTURE_2D, |
| 1827 resource_provider->memory_efficient_texture_format()); |
1811 } | 1828 } |
1812 direct_raster_worker_pool_ = DirectRasterWorkerPool::Create( | 1829 direct_raster_worker_pool_ = DirectRasterWorkerPool::Create( |
1813 proxy_->ImplThreadTaskRunner(), resource_provider, context_provider); | 1830 proxy_->ImplThreadTaskRunner(), resource_provider, context_provider); |
1814 tile_manager_ = | 1831 tile_manager_ = |
1815 TileManager::Create(this, | 1832 TileManager::Create(this, |
1816 resource_provider, | 1833 resource_pool_.get(), |
1817 raster_worker_pool_->AsRasterizer(), | 1834 raster_worker_pool_->AsRasterizer(), |
1818 direct_raster_worker_pool_->AsRasterizer(), | 1835 direct_raster_worker_pool_->AsRasterizer(), |
1819 GetMaxRasterTasksUsageBytes(context_provider), | 1836 GetMaxRasterTasksUsageBytes(context_provider), |
1820 allow_rasterize_on_demand, | 1837 allow_rasterize_on_demand, |
1821 rendering_stats_instrumentation_); | 1838 rendering_stats_instrumentation_); |
1822 | 1839 |
1823 UpdateTileManagerMemoryPolicy(ActualManagedMemoryPolicy()); | 1840 UpdateTileManagerMemoryPolicy(ActualManagedMemoryPolicy()); |
1824 need_to_update_visible_tiles_before_draw_ = false; | 1841 need_to_update_visible_tiles_before_draw_ = false; |
1825 } | 1842 } |
1826 | 1843 |
1827 void LayerTreeHostImpl::EnforceZeroBudget(bool zero_budget) { | 1844 void LayerTreeHostImpl::EnforceZeroBudget(bool zero_budget) { |
1828 SetManagedMemoryPolicy(cached_managed_memory_policy_, zero_budget); | 1845 SetManagedMemoryPolicy(cached_managed_memory_policy_, zero_budget); |
1829 } | 1846 } |
1830 | 1847 |
1831 bool LayerTreeHostImpl::InitializeRenderer( | 1848 bool LayerTreeHostImpl::InitializeRenderer( |
1832 scoped_ptr<OutputSurface> output_surface) { | 1849 scoped_ptr<OutputSurface> output_surface) { |
1833 #if DCHECK_IS_ON | 1850 #if DCHECK_IS_ON |
1834 DCHECK(!renderer_ || did_lose_called_); | 1851 DCHECK(!renderer_ || did_lose_called_); |
1835 #endif | 1852 #endif |
1836 | 1853 |
1837 // Since we will create a new resource provider, we cannot continue to use | 1854 // Since we will create a new resource provider, we cannot continue to use |
1838 // the old resources (i.e. render_surfaces and texture IDs). Clear them | 1855 // the old resources (i.e. render_surfaces and texture IDs). Clear them |
1839 // before we destroy the old resource provider. | 1856 // before we destroy the old resource provider. |
1840 ReleaseTreeResources(); | 1857 ReleaseTreeResources(); |
1841 | 1858 |
1842 // Note: order is important here. | 1859 // Note: order is important here. |
1843 renderer_.reset(); | 1860 renderer_.reset(); |
1844 tile_manager_.reset(); | 1861 tile_manager_.reset(); |
| 1862 resource_pool_.reset(); |
1845 raster_worker_pool_.reset(); | 1863 raster_worker_pool_.reset(); |
1846 direct_raster_worker_pool_.reset(); | 1864 direct_raster_worker_pool_.reset(); |
1847 resource_provider_.reset(); | 1865 resource_provider_.reset(); |
1848 output_surface_.reset(); | 1866 output_surface_.reset(); |
1849 | 1867 |
1850 if (!output_surface->BindToClient(this)) | 1868 if (!output_surface->BindToClient(this)) |
1851 return false; | 1869 return false; |
1852 | 1870 |
1853 scoped_ptr<ResourceProvider> resource_provider = | 1871 scoped_ptr<ResourceProvider> resource_provider = |
1854 ResourceProvider::Create(output_surface.get(), | 1872 ResourceProvider::Create(output_surface.get(), |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1962 } | 1980 } |
1963 | 1981 |
1964 void LayerTreeHostImpl::ReleaseGL() { | 1982 void LayerTreeHostImpl::ReleaseGL() { |
1965 DCHECK(output_surface_->capabilities().deferred_gl_initialization); | 1983 DCHECK(output_surface_->capabilities().deferred_gl_initialization); |
1966 DCHECK(settings_.impl_side_painting); | 1984 DCHECK(settings_.impl_side_painting); |
1967 DCHECK(output_surface_->context_provider()); | 1985 DCHECK(output_surface_->context_provider()); |
1968 | 1986 |
1969 ReleaseTreeResources(); | 1987 ReleaseTreeResources(); |
1970 renderer_.reset(); | 1988 renderer_.reset(); |
1971 tile_manager_.reset(); | 1989 tile_manager_.reset(); |
| 1990 resource_pool_.reset(); |
1972 raster_worker_pool_.reset(); | 1991 raster_worker_pool_.reset(); |
1973 direct_raster_worker_pool_.reset(); | 1992 direct_raster_worker_pool_.reset(); |
1974 resource_provider_->InitializeSoftware(); | 1993 resource_provider_->InitializeSoftware(); |
1975 | 1994 |
1976 bool skip_gl_renderer = true; | 1995 bool skip_gl_renderer = true; |
1977 CreateAndSetRenderer( | 1996 CreateAndSetRenderer( |
1978 output_surface_.get(), resource_provider_.get(), skip_gl_renderer); | 1997 output_surface_.get(), resource_provider_.get(), skip_gl_renderer); |
1979 DCHECK(renderer_); | 1998 DCHECK(renderer_); |
1980 | 1999 |
1981 EnforceZeroBudget(true); | 2000 EnforceZeroBudget(true); |
(...skipping 1087 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3069 swap_promise_monitor_.erase(monitor); | 3088 swap_promise_monitor_.erase(monitor); |
3070 } | 3089 } |
3071 | 3090 |
3072 void LayerTreeHostImpl::NotifySwapPromiseMonitorsOfSetNeedsRedraw() { | 3091 void LayerTreeHostImpl::NotifySwapPromiseMonitorsOfSetNeedsRedraw() { |
3073 std::set<SwapPromiseMonitor*>::iterator it = swap_promise_monitor_.begin(); | 3092 std::set<SwapPromiseMonitor*>::iterator it = swap_promise_monitor_.begin(); |
3074 for (; it != swap_promise_monitor_.end(); it++) | 3093 for (; it != swap_promise_monitor_.end(); it++) |
3075 (*it)->OnSetNeedsRedrawOnImpl(); | 3094 (*it)->OnSetNeedsRedrawOnImpl(); |
3076 } | 3095 } |
3077 | 3096 |
3078 } // namespace cc | 3097 } // namespace cc |
OLD | NEW |