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 26 matching lines...) Expand all Loading... | |
| 37 #include "cc/output/compositor_frame_metadata.h" | 37 #include "cc/output/compositor_frame_metadata.h" |
| 38 #include "cc/output/copy_output_request.h" | 38 #include "cc/output/copy_output_request.h" |
| 39 #include "cc/output/delegating_renderer.h" | 39 #include "cc/output/delegating_renderer.h" |
| 40 #include "cc/output/gl_renderer.h" | 40 #include "cc/output/gl_renderer.h" |
| 41 #include "cc/output/software_renderer.h" | 41 #include "cc/output/software_renderer.h" |
| 42 #include "cc/quads/render_pass_draw_quad.h" | 42 #include "cc/quads/render_pass_draw_quad.h" |
| 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_copy_raster_worker_pool.h" | |
| 47 #include "cc/resources/image_raster_worker_pool.h" | 48 #include "cc/resources/image_raster_worker_pool.h" |
| 48 #include "cc/resources/memory_history.h" | 49 #include "cc/resources/memory_history.h" |
| 49 #include "cc/resources/picture_layer_tiling.h" | 50 #include "cc/resources/picture_layer_tiling.h" |
| 50 #include "cc/resources/pixel_buffer_raster_worker_pool.h" | 51 #include "cc/resources/pixel_buffer_raster_worker_pool.h" |
| 51 #include "cc/resources/prioritized_resource_manager.h" | 52 #include "cc/resources/prioritized_resource_manager.h" |
| 52 #include "cc/resources/raster_worker_pool.h" | 53 #include "cc/resources/raster_worker_pool.h" |
| 53 #include "cc/resources/resource_pool.h" | 54 #include "cc/resources/resource_pool.h" |
| 54 #include "cc/resources/texture_mailbox_deleter.h" | 55 #include "cc/resources/texture_mailbox_deleter.h" |
| 55 #include "cc/resources/ui_resource_bitmap.h" | 56 #include "cc/resources/ui_resource_bitmap.h" |
| 56 #include "cc/scheduler/delay_based_time_source.h" | 57 #include "cc/scheduler/delay_based_time_source.h" |
| (...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 255 overdraw_bottom_height_(0.f), | 256 overdraw_bottom_height_(0.f), |
| 256 device_viewport_valid_for_tile_management_(true), | 257 device_viewport_valid_for_tile_management_(true), |
| 257 animation_registrar_(AnimationRegistrar::Create()), | 258 animation_registrar_(AnimationRegistrar::Create()), |
| 258 rendering_stats_instrumentation_(rendering_stats_instrumentation), | 259 rendering_stats_instrumentation_(rendering_stats_instrumentation), |
| 259 micro_benchmark_controller_(this), | 260 micro_benchmark_controller_(this), |
| 260 need_to_update_visible_tiles_before_draw_(false), | 261 need_to_update_visible_tiles_before_draw_(false), |
| 261 #if DCHECK_IS_ON | 262 #if DCHECK_IS_ON |
| 262 did_lose_called_(false), | 263 did_lose_called_(false), |
| 263 #endif | 264 #endif |
| 264 shared_bitmap_manager_(manager), | 265 shared_bitmap_manager_(manager), |
| 265 id_(id) { | 266 id_(id), |
| 267 transfer_buffer_memory_limit_(0u) { | |
| 266 DCHECK(proxy_->IsImplThread()); | 268 DCHECK(proxy_->IsImplThread()); |
| 267 DidVisibilityChange(this, visible_); | 269 DidVisibilityChange(this, visible_); |
| 268 | 270 |
| 269 SetDebugState(settings.initial_debug_state); | 271 SetDebugState(settings.initial_debug_state); |
| 270 | 272 |
| 271 if (settings.calculate_top_controls_position) { | 273 if (settings.calculate_top_controls_position) { |
| 272 top_controls_manager_ = | 274 top_controls_manager_ = |
| 273 TopControlsManager::Create(this, | 275 TopControlsManager::Create(this, |
| 274 settings.top_controls_height, | 276 settings.top_controls_height, |
| 275 settings.top_controls_show_threshold, | 277 settings.top_controls_show_threshold, |
| (...skipping 27 matching lines...) Expand all Loading... | |
| 303 if (pending_tree_) | 305 if (pending_tree_) |
| 304 pending_tree_->Shutdown(); | 306 pending_tree_->Shutdown(); |
| 305 active_tree_->Shutdown(); | 307 active_tree_->Shutdown(); |
| 306 recycle_tree_.reset(); | 308 recycle_tree_.reset(); |
| 307 pending_tree_.reset(); | 309 pending_tree_.reset(); |
| 308 active_tree_.reset(); | 310 active_tree_.reset(); |
| 309 tile_manager_.reset(); | 311 tile_manager_.reset(); |
| 310 resource_pool_.reset(); | 312 resource_pool_.reset(); |
| 311 raster_worker_pool_.reset(); | 313 raster_worker_pool_.reset(); |
| 312 direct_raster_worker_pool_.reset(); | 314 direct_raster_worker_pool_.reset(); |
| 315 staging_resource_pool_.reset(); | |
| 313 } | 316 } |
| 314 | 317 |
| 315 void LayerTreeHostImpl::BeginMainFrameAborted(bool did_handle) { | 318 void LayerTreeHostImpl::BeginMainFrameAborted(bool did_handle) { |
| 316 // If the begin frame data was handled, then scroll and scale set was applied | 319 // If the begin frame data was handled, then scroll and scale set was applied |
| 317 // by the main thread, so the active tree needs to be updated as if these sent | 320 // by the main thread, so the active tree needs to be updated as if these sent |
| 318 // values were applied and committed. | 321 // values were applied and committed. |
| 319 if (did_handle) { | 322 if (did_handle) { |
| 320 active_tree_->ApplySentScrollAndScaleDeltasFromAbortedCommit(); | 323 active_tree_->ApplySentScrollAndScaleDeltasFromAbortedCommit(); |
| 321 active_tree_->ResetContentsTexturesPurged(); | 324 active_tree_->ResetContentsTexturesPurged(); |
| 322 } | 325 } |
| (...skipping 873 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1196 | 1199 |
| 1197 DCHECK(resource_pool_); | 1200 DCHECK(resource_pool_); |
| 1198 resource_pool_->CheckBusyResources(); | 1201 resource_pool_->CheckBusyResources(); |
| 1199 // Soft limit is used for resource pool such that memory returns to soft | 1202 // Soft limit is used for resource pool such that memory returns to soft |
| 1200 // limit after going over. | 1203 // limit after going over. |
| 1201 resource_pool_->SetResourceUsageLimits( | 1204 resource_pool_->SetResourceUsageLimits( |
| 1202 global_tile_state_.soft_memory_limit_in_bytes, | 1205 global_tile_state_.soft_memory_limit_in_bytes, |
| 1203 unused_memory_limit_in_bytes, | 1206 unused_memory_limit_in_bytes, |
| 1204 global_tile_state_.num_resources_limit); | 1207 global_tile_state_.num_resources_limit); |
| 1205 | 1208 |
| 1209 // Staging pool resources are used as transfer buffers so we use | |
| 1210 // |transfer_buffer_memory_limit_| as the memory limit for this resource pool. | |
| 1211 if (staging_resource_pool_) { | |
| 1212 staging_resource_pool_->CheckBusyResources(); | |
| 1213 staging_resource_pool_->SetResourceUsageLimits( | |
| 1214 visible_ ? transfer_buffer_memory_limit_ : 0, | |
| 1215 transfer_buffer_memory_limit_, | |
| 1216 std::numeric_limits<size_t>::max()); | |
| 1217 } | |
| 1218 | |
| 1206 DidModifyTilePriorities(); | 1219 DidModifyTilePriorities(); |
| 1207 } | 1220 } |
| 1208 | 1221 |
| 1209 void LayerTreeHostImpl::DidModifyTilePriorities() { | 1222 void LayerTreeHostImpl::DidModifyTilePriorities() { |
| 1210 DCHECK(settings_.impl_side_painting); | 1223 DCHECK(settings_.impl_side_painting); |
| 1211 // Mark priorities as dirty and schedule a ManageTiles(). | 1224 // Mark priorities as dirty and schedule a ManageTiles(). |
| 1212 tile_priorities_dirty_ = true; | 1225 tile_priorities_dirty_ = true; |
| 1213 client_->SetNeedsManageTilesOnImplThread(); | 1226 client_->SetNeedsManageTilesOnImplThread(); |
| 1214 } | 1227 } |
| 1215 | 1228 |
| (...skipping 599 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1815 // trees need another update to generate new ones. | 1828 // trees need another update to generate new ones. |
| 1816 active_tree_->set_needs_update_draw_properties(); | 1829 active_tree_->set_needs_update_draw_properties(); |
| 1817 if (pending_tree_) | 1830 if (pending_tree_) |
| 1818 pending_tree_->set_needs_update_draw_properties(); | 1831 pending_tree_->set_needs_update_draw_properties(); |
| 1819 client_->UpdateRendererCapabilitiesOnImplThread(); | 1832 client_->UpdateRendererCapabilitiesOnImplThread(); |
| 1820 } | 1833 } |
| 1821 | 1834 |
| 1822 void LayerTreeHostImpl::CreateAndSetTileManager( | 1835 void LayerTreeHostImpl::CreateAndSetTileManager( |
| 1823 ResourceProvider* resource_provider, | 1836 ResourceProvider* resource_provider, |
| 1824 ContextProvider* context_provider, | 1837 ContextProvider* context_provider, |
| 1825 bool using_map_image, | 1838 bool use_zero_copy, |
|
vmpstr
2014/04/30 22:42:41
I would DCHECK(!use_zero_copy || !use_one_copy) fo
reveman
2014/04/30 23:23:56
That's currently allowed and I don't think we need
| |
| 1839 bool use_one_copy, | |
| 1826 bool allow_rasterize_on_demand) { | 1840 bool allow_rasterize_on_demand) { |
| 1827 DCHECK(settings_.impl_side_painting); | 1841 DCHECK(settings_.impl_side_painting); |
| 1828 DCHECK(resource_provider); | 1842 DCHECK(resource_provider); |
| 1829 DCHECK(proxy_->ImplThreadTaskRunner()); | 1843 DCHECK(proxy_->ImplThreadTaskRunner()); |
| 1830 | 1844 |
| 1831 if (using_map_image) { | 1845 transfer_buffer_memory_limit_ = |
| 1846 GetMaxTransferBufferUsageBytes(context_provider); | |
| 1847 | |
| 1848 if (use_zero_copy) { | |
| 1849 resource_pool_ = | |
| 1850 ResourcePool::Create(resource_provider, | |
| 1851 GetMapImageTextureTarget(context_provider), | |
| 1852 resource_provider->best_texture_format()); | |
| 1832 raster_worker_pool_ = | 1853 raster_worker_pool_ = |
| 1833 ImageRasterWorkerPool::Create(proxy_->ImplThreadTaskRunner(), | 1854 ImageRasterWorkerPool::Create(proxy_->ImplThreadTaskRunner(), |
| 1834 RasterWorkerPool::GetTaskGraphRunner(), | 1855 RasterWorkerPool::GetTaskGraphRunner(), |
| 1835 resource_provider); | 1856 resource_provider); |
| 1836 resource_pool_ = | 1857 } else if (use_one_copy) { |
| 1858 // We need to create a staging resource pool when using copy rasterizer. | |
| 1859 staging_resource_pool_ = | |
| 1837 ResourcePool::Create(resource_provider, | 1860 ResourcePool::Create(resource_provider, |
| 1838 GetMapImageTextureTarget(context_provider), | 1861 GetMapImageTextureTarget(context_provider), |
| 1839 resource_provider->best_texture_format()); | 1862 resource_provider->best_texture_format()); |
| 1863 resource_pool_ = | |
| 1864 ResourcePool::Create(resource_provider, | |
| 1865 GL_TEXTURE_2D, | |
| 1866 resource_provider->best_texture_format()); | |
| 1867 | |
| 1868 raster_worker_pool_ = ImageCopyRasterWorkerPool::Create( | |
| 1869 proxy_->ImplThreadTaskRunner(), | |
| 1870 RasterWorkerPool::GetTaskGraphRunner(), | |
| 1871 resource_provider, | |
| 1872 staging_resource_pool_.get()); | |
| 1840 } else { | 1873 } else { |
| 1841 raster_worker_pool_ = PixelBufferRasterWorkerPool::Create( | 1874 raster_worker_pool_ = PixelBufferRasterWorkerPool::Create( |
| 1842 proxy_->ImplThreadTaskRunner(), | 1875 proxy_->ImplThreadTaskRunner(), |
| 1843 RasterWorkerPool::GetTaskGraphRunner(), | 1876 RasterWorkerPool::GetTaskGraphRunner(), |
| 1844 resource_provider, | 1877 resource_provider, |
| 1845 GetMaxTransferBufferUsageBytes(context_provider)); | 1878 transfer_buffer_memory_limit_); |
| 1846 resource_pool_ = ResourcePool::Create( | 1879 resource_pool_ = ResourcePool::Create( |
| 1847 resource_provider, | 1880 resource_provider, |
| 1848 GL_TEXTURE_2D, | 1881 GL_TEXTURE_2D, |
| 1849 resource_provider->memory_efficient_texture_format()); | 1882 resource_provider->memory_efficient_texture_format()); |
| 1850 } | 1883 } |
| 1851 direct_raster_worker_pool_ = DirectRasterWorkerPool::Create( | 1884 direct_raster_worker_pool_ = DirectRasterWorkerPool::Create( |
| 1852 proxy_->ImplThreadTaskRunner(), resource_provider, context_provider); | 1885 proxy_->ImplThreadTaskRunner(), resource_provider, context_provider); |
| 1853 tile_manager_ = | 1886 tile_manager_ = |
| 1854 TileManager::Create(this, | 1887 TileManager::Create(this, |
| 1855 resource_pool_.get(), | 1888 resource_pool_.get(), |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 1875 | 1908 |
| 1876 // Since we will create a new resource provider, we cannot continue to use | 1909 // Since we will create a new resource provider, we cannot continue to use |
| 1877 // the old resources (i.e. render_surfaces and texture IDs). Clear them | 1910 // the old resources (i.e. render_surfaces and texture IDs). Clear them |
| 1878 // before we destroy the old resource provider. | 1911 // before we destroy the old resource provider. |
| 1879 ReleaseTreeResources(); | 1912 ReleaseTreeResources(); |
| 1880 | 1913 |
| 1881 // Note: order is important here. | 1914 // Note: order is important here. |
| 1882 renderer_.reset(); | 1915 renderer_.reset(); |
| 1883 tile_manager_.reset(); | 1916 tile_manager_.reset(); |
| 1884 resource_pool_.reset(); | 1917 resource_pool_.reset(); |
| 1918 staging_resource_pool_.reset(); | |
| 1885 raster_worker_pool_.reset(); | 1919 raster_worker_pool_.reset(); |
| 1886 direct_raster_worker_pool_.reset(); | 1920 direct_raster_worker_pool_.reset(); |
| 1887 resource_provider_.reset(); | 1921 resource_provider_.reset(); |
| 1888 output_surface_.reset(); | 1922 output_surface_.reset(); |
| 1889 | 1923 |
| 1890 if (!output_surface->BindToClient(this)) | 1924 if (!output_surface->BindToClient(this)) |
| 1891 return false; | 1925 return false; |
| 1892 | 1926 |
| 1893 scoped_ptr<ResourceProvider> resource_provider = | 1927 scoped_ptr<ResourceProvider> resource_provider = |
| 1894 ResourceProvider::Create(output_surface.get(), | 1928 ResourceProvider::Create(output_surface.get(), |
| 1895 shared_bitmap_manager_, | 1929 shared_bitmap_manager_, |
| 1896 settings_.highp_threshold_min, | 1930 settings_.highp_threshold_min, |
| 1897 settings_.use_rgba_4444_textures, | 1931 settings_.use_rgba_4444_textures, |
| 1898 settings_.texture_id_allocation_chunk_size); | 1932 settings_.texture_id_allocation_chunk_size); |
| 1899 | 1933 |
| 1900 if (output_surface->capabilities().deferred_gl_initialization) | 1934 if (output_surface->capabilities().deferred_gl_initialization) |
| 1901 EnforceZeroBudget(true); | 1935 EnforceZeroBudget(true); |
| 1902 | 1936 |
| 1903 bool skip_gl_renderer = false; | 1937 bool skip_gl_renderer = false; |
| 1904 CreateAndSetRenderer( | 1938 CreateAndSetRenderer( |
| 1905 output_surface.get(), resource_provider.get(), skip_gl_renderer); | 1939 output_surface.get(), resource_provider.get(), skip_gl_renderer); |
| 1906 | 1940 |
| 1941 transfer_buffer_memory_limit_ = | |
| 1942 GetMaxTransferBufferUsageBytes(output_surface->context_provider().get()); | |
| 1943 | |
| 1907 if (settings_.impl_side_painting) { | 1944 if (settings_.impl_side_painting) { |
| 1908 CreateAndSetTileManager( | 1945 CreateAndSetTileManager( |
| 1909 resource_provider.get(), | 1946 resource_provider.get(), |
| 1910 output_surface->context_provider().get(), | 1947 output_surface->context_provider().get(), |
| 1911 GetRendererCapabilities().using_map_image, | 1948 // Use zero-copy rasterizer by default when using shared memory |
| 1949 // resources. | |
| 1950 (settings_.use_zero_copy || | |
|
vmpstr
2014/04/30 22:42:41
nit: consider determining this ahead of time:
boo
reveman
2014/04/30 23:23:56
Good idea. Done.
| |
| 1951 GetRendererCapabilities().using_shared_memory_resources) && | |
|
reveman
2014/04/30 19:01:09
This should get us the behavior we want with the S
| |
| 1952 GetRendererCapabilities().using_map_image, | |
| 1953 // Sync query support is required by one-copy rasterizer. | |
| 1954 settings_.use_one_copy && GetRendererCapabilities().using_map_image && | |
| 1955 resource_provider->use_sync_query(), | |
| 1912 GetRendererCapabilities().allow_rasterize_on_demand); | 1956 GetRendererCapabilities().allow_rasterize_on_demand); |
| 1913 } | 1957 } |
| 1914 | 1958 |
| 1915 // Initialize vsync parameters to sane values. | 1959 // Initialize vsync parameters to sane values. |
| 1916 const base::TimeDelta display_refresh_interval = | 1960 const base::TimeDelta display_refresh_interval = |
| 1917 base::TimeDelta::FromMicroseconds(base::Time::kMicrosecondsPerSecond / | 1961 base::TimeDelta::FromMicroseconds(base::Time::kMicrosecondsPerSecond / |
| 1918 settings_.refresh_rate); | 1962 settings_.refresh_rate); |
| 1919 CommitVSyncParameters(base::TimeTicks(), display_refresh_interval); | 1963 CommitVSyncParameters(base::TimeTicks(), display_refresh_interval); |
| 1920 | 1964 |
| 1921 // TODO(brianderson): Don't use a hard-coded parent draw time. | 1965 // TODO(brianderson): Don't use a hard-coded parent draw time. |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1966 DCHECK(output_surface_->capabilities().deferred_gl_initialization); | 2010 DCHECK(output_surface_->capabilities().deferred_gl_initialization); |
| 1967 DCHECK(settings_.impl_side_painting); | 2011 DCHECK(settings_.impl_side_painting); |
| 1968 DCHECK(output_surface_->context_provider()); | 2012 DCHECK(output_surface_->context_provider()); |
| 1969 | 2013 |
| 1970 ReleaseTreeResources(); | 2014 ReleaseTreeResources(); |
| 1971 renderer_.reset(); | 2015 renderer_.reset(); |
| 1972 tile_manager_.reset(); | 2016 tile_manager_.reset(); |
| 1973 resource_pool_.reset(); | 2017 resource_pool_.reset(); |
| 1974 raster_worker_pool_.reset(); | 2018 raster_worker_pool_.reset(); |
| 1975 direct_raster_worker_pool_.reset(); | 2019 direct_raster_worker_pool_.reset(); |
| 2020 staging_resource_pool_.reset(); | |
| 1976 resource_provider_->InitializeSoftware(); | 2021 resource_provider_->InitializeSoftware(); |
| 1977 | 2022 |
| 1978 bool skip_gl_renderer = true; | 2023 bool skip_gl_renderer = true; |
| 1979 CreateAndSetRenderer( | 2024 CreateAndSetRenderer( |
| 1980 output_surface_.get(), resource_provider_.get(), skip_gl_renderer); | 2025 output_surface_.get(), resource_provider_.get(), skip_gl_renderer); |
| 1981 | 2026 |
| 1982 EnforceZeroBudget(true); | 2027 EnforceZeroBudget(true); |
| 2028 DCHECK(GetRendererCapabilities().using_map_image); | |
| 1983 CreateAndSetTileManager(resource_provider_.get(), | 2029 CreateAndSetTileManager(resource_provider_.get(), |
| 1984 NULL, | 2030 NULL, |
| 1985 GetRendererCapabilities().using_map_image, | 2031 true, |
| 2032 false, | |
| 1986 GetRendererCapabilities().allow_rasterize_on_demand); | 2033 GetRendererCapabilities().allow_rasterize_on_demand); |
| 1987 DCHECK(tile_manager_); | 2034 DCHECK(tile_manager_); |
| 1988 | 2035 |
| 1989 client_->SetNeedsCommitOnImplThread(); | 2036 client_->SetNeedsCommitOnImplThread(); |
| 1990 } | 2037 } |
| 1991 | 2038 |
| 1992 void LayerTreeHostImpl::SetViewportSize(const gfx::Size& device_viewport_size) { | 2039 void LayerTreeHostImpl::SetViewportSize(const gfx::Size& device_viewport_size) { |
| 1993 if (device_viewport_size == device_viewport_size_) | 2040 if (device_viewport_size == device_viewport_size_) |
| 1994 return; | 2041 return; |
| 1995 | 2042 |
| (...skipping 1084 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3080 swap_promise_monitor_.erase(monitor); | 3127 swap_promise_monitor_.erase(monitor); |
| 3081 } | 3128 } |
| 3082 | 3129 |
| 3083 void LayerTreeHostImpl::NotifySwapPromiseMonitorsOfSetNeedsRedraw() { | 3130 void LayerTreeHostImpl::NotifySwapPromiseMonitorsOfSetNeedsRedraw() { |
| 3084 std::set<SwapPromiseMonitor*>::iterator it = swap_promise_monitor_.begin(); | 3131 std::set<SwapPromiseMonitor*>::iterator it = swap_promise_monitor_.begin(); |
| 3085 for (; it != swap_promise_monitor_.end(); it++) | 3132 for (; it != swap_promise_monitor_.end(); it++) |
| 3086 (*it)->OnSetNeedsRedrawOnImpl(); | 3133 (*it)->OnSetNeedsRedrawOnImpl(); |
| 3087 } | 3134 } |
| 3088 | 3135 |
| 3089 } // namespace cc | 3136 } // namespace cc |
| OLD | NEW |