Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(70)

Side by Side Diff: cc/trees/layer_tree_host_impl.cc

Issue 236313006: cc: Add initial GPU-to-GPU copy rasterizer implementation. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « cc/trees/layer_tree_host_impl.h ('k') | cc/trees/layer_tree_settings.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « cc/trees/layer_tree_host_impl.h ('k') | cc/trees/layer_tree_settings.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698