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

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, 8 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
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"
57 #include "cc/trees/damage_tracker.h" 58 #include "cc/trees/damage_tracker.h"
58 #include "cc/trees/layer_tree_host.h" 59 #include "cc/trees/layer_tree_host.h"
59 #include "cc/trees/layer_tree_host_common.h" 60 #include "cc/trees/layer_tree_host_common.h"
60 #include "cc/trees/layer_tree_impl.h" 61 #include "cc/trees/layer_tree_impl.h"
61 #include "cc/trees/occlusion_tracker.h" 62 #include "cc/trees/occlusion_tracker.h"
62 #include "cc/trees/quad_culler.h" 63 #include "cc/trees/quad_culler.h"
63 #include "cc/trees/single_thread_proxy.h" 64 #include "cc/trees/single_thread_proxy.h"
64 #include "cc/trees/tree_synchronizer.h" 65 #include "cc/trees/tree_synchronizer.h"
65 #include "gpu/GLES2/gl2extchromium.h" 66 #include "gpu/GLES2/gl2extchromium.h"
66 #include "ui/gfx/frame_time.h" 67 #include "ui/gfx/frame_time.h"
67 #include "ui/gfx/size_conversions.h" 68 #include "ui/gfx/size_conversions.h"
68 #include "ui/gfx/vector2d_conversions.h" 69 #include "ui/gfx/vector2d_conversions.h"
69 70
70 namespace { 71 namespace {
71 72
73 const int kStagingPoolMemoryLimitWhenVisible = 32 * 1024 * 1024;
vmpstr 2014/04/23 17:25:46 Can you put a TODO here to maybe move this into gl
reveman 2014/04/24 19:20:43 Latest patch uses GetMaxTransferBufferUsageBytes i
74 const int kStagingPoolUnusedMemoryLimit = kStagingPoolMemoryLimitWhenVisible;
75 const int kStagingPoolResourceCountLimit = 48;
76
72 void DidVisibilityChange(cc::LayerTreeHostImpl* id, bool visible) { 77 void DidVisibilityChange(cc::LayerTreeHostImpl* id, bool visible) {
73 if (visible) { 78 if (visible) {
74 TRACE_EVENT_ASYNC_BEGIN1("webkit", 79 TRACE_EVENT_ASYNC_BEGIN1("webkit",
75 "LayerTreeHostImpl::SetVisible", 80 "LayerTreeHostImpl::SetVisible",
76 id, 81 id,
77 "LayerTreeHostImpl", 82 "LayerTreeHostImpl",
78 id); 83 id);
79 return; 84 return;
80 } 85 }
81 86
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
115 return GL_TEXTURE_2D; 120 return GL_TEXTURE_2D;
116 121
117 if (context_provider->ContextCapabilities().gpu.egl_image_external) 122 if (context_provider->ContextCapabilities().gpu.egl_image_external)
118 return GL_TEXTURE_EXTERNAL_OES; 123 return GL_TEXTURE_EXTERNAL_OES;
119 if (context_provider->ContextCapabilities().gpu.texture_rectangle) 124 if (context_provider->ContextCapabilities().gpu.texture_rectangle)
120 return GL_TEXTURE_RECTANGLE_ARB; 125 return GL_TEXTURE_RECTANGLE_ARB;
121 126
122 return GL_TEXTURE_2D; 127 return GL_TEXTURE_2D;
123 } 128 }
124 129
130 unsigned GetCopyImageTextureTarget(cc::ContextProvider* context_provider) {
131 if (!context_provider)
132 return GL_TEXTURE_2D;
133
134 if (context_provider->ContextCapabilities().gpu.egl_image_external)
135 return GL_TEXTURE_EXTERNAL_OES;
136
137 return GL_TEXTURE_2D;
138 }
139
125 } // namespace 140 } // namespace
126 141
127 namespace cc { 142 namespace cc {
128 143
129 class LayerTreeHostImplTimeSourceAdapter : public TimeSourceClient { 144 class LayerTreeHostImplTimeSourceAdapter : public TimeSourceClient {
130 public: 145 public:
131 static scoped_ptr<LayerTreeHostImplTimeSourceAdapter> Create( 146 static scoped_ptr<LayerTreeHostImplTimeSourceAdapter> Create(
132 LayerTreeHostImpl* layer_tree_host_impl, 147 LayerTreeHostImpl* layer_tree_host_impl,
133 scoped_refptr<DelayBasedTimeSource> time_source) { 148 scoped_refptr<DelayBasedTimeSource> time_source) {
134 return make_scoped_ptr( 149 return make_scoped_ptr(
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after
303 if (pending_tree_) 318 if (pending_tree_)
304 pending_tree_->Shutdown(); 319 pending_tree_->Shutdown();
305 active_tree_->Shutdown(); 320 active_tree_->Shutdown();
306 recycle_tree_.reset(); 321 recycle_tree_.reset();
307 pending_tree_.reset(); 322 pending_tree_.reset();
308 active_tree_.reset(); 323 active_tree_.reset();
309 tile_manager_.reset(); 324 tile_manager_.reset();
310 resource_pool_.reset(); 325 resource_pool_.reset();
311 raster_worker_pool_.reset(); 326 raster_worker_pool_.reset();
312 direct_raster_worker_pool_.reset(); 327 direct_raster_worker_pool_.reset();
328 staging_resource_pool_.reset();
313 } 329 }
314 330
315 void LayerTreeHostImpl::BeginMainFrameAborted(bool did_handle) { 331 void LayerTreeHostImpl::BeginMainFrameAborted(bool did_handle) {
316 // If the begin frame data was handled, then scroll and scale set was applied 332 // 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 333 // by the main thread, so the active tree needs to be updated as if these sent
318 // values were applied and committed. 334 // values were applied and committed.
319 if (did_handle) { 335 if (did_handle) {
320 active_tree_->ApplySentScrollAndScaleDeltasFromAbortedCommit(); 336 active_tree_->ApplySentScrollAndScaleDeltasFromAbortedCommit();
321 active_tree_->ResetContentsTexturesPurged(); 337 active_tree_->ResetContentsTexturesPurged();
322 } 338 }
(...skipping 870 matching lines...) Expand 10 before | Expand all | Expand 10 after
1193 1209
1194 DCHECK(resource_pool_); 1210 DCHECK(resource_pool_);
1195 resource_pool_->CheckBusyResources(); 1211 resource_pool_->CheckBusyResources();
1196 // Soft limit is used for resource pool such that memory returns to soft 1212 // Soft limit is used for resource pool such that memory returns to soft
1197 // limit after going over. 1213 // limit after going over.
1198 resource_pool_->SetResourceUsageLimits( 1214 resource_pool_->SetResourceUsageLimits(
1199 global_tile_state_.soft_memory_limit_in_bytes, 1215 global_tile_state_.soft_memory_limit_in_bytes,
1200 global_tile_state_.unused_memory_limit_in_bytes, 1216 global_tile_state_.unused_memory_limit_in_bytes,
1201 global_tile_state_.num_resources_limit); 1217 global_tile_state_.num_resources_limit);
1202 1218
1219 // We currently use hard-coded limits for staging pool limits.
1220 if (staging_resource_pool_) {
1221 staging_resource_pool_->CheckBusyResources();
1222 staging_resource_pool_->SetResourceUsageLimits(
1223 visible_ ? kStagingPoolMemoryLimitWhenVisible : 0,
1224 kStagingPoolUnusedMemoryLimit,
1225 kStagingPoolResourceCountLimit);
1226 }
1227
1203 DidModifyTilePriorities(); 1228 DidModifyTilePriorities();
1204 } 1229 }
1205 1230
1206 void LayerTreeHostImpl::DidModifyTilePriorities() { 1231 void LayerTreeHostImpl::DidModifyTilePriorities() {
1207 DCHECK(settings_.impl_side_painting); 1232 DCHECK(settings_.impl_side_painting);
1208 // Mark priorities as dirty and schedule a ManageTiles(). 1233 // Mark priorities as dirty and schedule a ManageTiles().
1209 tile_priorities_dirty_ = true; 1234 tile_priorities_dirty_ = true;
1210 client_->SetNeedsManageTilesOnImplThread(); 1235 client_->SetNeedsManageTilesOnImplThread();
1211 } 1236 }
1212 1237
(...skipping 586 matching lines...) Expand 10 before | Expand all | Expand 10 after
1799 if (pending_tree_) 1824 if (pending_tree_)
1800 pending_tree_->set_needs_update_draw_properties(); 1825 pending_tree_->set_needs_update_draw_properties();
1801 client_->UpdateRendererCapabilitiesOnImplThread(); 1826 client_->UpdateRendererCapabilitiesOnImplThread();
1802 } 1827 }
1803 } 1828 }
1804 1829
1805 void LayerTreeHostImpl::CreateAndSetTileManager( 1830 void LayerTreeHostImpl::CreateAndSetTileManager(
1806 ResourceProvider* resource_provider, 1831 ResourceProvider* resource_provider,
1807 ContextProvider* context_provider, 1832 ContextProvider* context_provider,
1808 bool using_map_image, 1833 bool using_map_image,
1834 bool use_zero_copy,
1809 bool allow_rasterize_on_demand) { 1835 bool allow_rasterize_on_demand) {
1810 DCHECK(settings_.impl_side_painting); 1836 DCHECK(settings_.impl_side_painting);
1811 DCHECK(resource_provider); 1837 DCHECK(resource_provider);
1812 DCHECK(proxy_->ImplThreadTaskRunner()); 1838 DCHECK(proxy_->ImplThreadTaskRunner());
1813 1839
1814 if (using_map_image) { 1840 if (using_map_image) {
1815 raster_worker_pool_ = 1841 // We need to create a staging resource pool unless we're using
1816 ImageRasterWorkerPool::Create(proxy_->ImplThreadTaskRunner(), 1842 // ImageRasterWorkerPool that implements zero-copy.
1817 RasterWorkerPool::GetTaskGraphRunner(), 1843 if (use_zero_copy || !resource_provider_->use_sync_query()) {
1818 resource_provider); 1844 resource_pool_ =
1819 resource_pool_ = 1845 ResourcePool::Create(resource_provider,
1820 ResourcePool::Create(resource_provider, 1846 GetMapImageTextureTarget(context_provider),
1821 GetMapImageTextureTarget(context_provider), 1847 resource_provider->best_texture_format());
1822 resource_provider->best_texture_format()); 1848 raster_worker_pool_ =
1849 ImageRasterWorkerPool::Create(proxy_->ImplThreadTaskRunner(),
1850 RasterWorkerPool::GetTaskGraphRunner(),
1851 resource_provider);
1852 } else {
1853 // TODO(reveman): Use GetMapImageTextureTarget instead of
1854 // GetCopyImageTextureTarget when GL_TEXTURE_RECTANGLE_ARB support has
1855 // been added to CHROMIUM_copy_texture.
1856 staging_resource_pool_ =
1857 ResourcePool::Create(resource_provider,
1858 GetCopyImageTextureTarget(context_provider),
1859 resource_provider->best_texture_format());
1860 resource_pool_ =
1861 ResourcePool::Create(resource_provider,
1862 GL_TEXTURE_2D,
1863 resource_provider->best_texture_format());
1864
1865 raster_worker_pool_ = ImageCopyRasterWorkerPool::Create(
1866 proxy_->ImplThreadTaskRunner(),
1867 RasterWorkerPool::GetTaskGraphRunner(),
1868 resource_provider,
1869 staging_resource_pool_.get());
1870 }
1823 } else { 1871 } else {
1824 raster_worker_pool_ = PixelBufferRasterWorkerPool::Create( 1872 raster_worker_pool_ = PixelBufferRasterWorkerPool::Create(
1825 proxy_->ImplThreadTaskRunner(), 1873 proxy_->ImplThreadTaskRunner(),
1826 RasterWorkerPool::GetTaskGraphRunner(), 1874 RasterWorkerPool::GetTaskGraphRunner(),
1827 resource_provider, 1875 resource_provider,
1828 GetMaxTransferBufferUsageBytes(context_provider)); 1876 GetMaxTransferBufferUsageBytes(context_provider));
1829 resource_pool_ = ResourcePool::Create( 1877 resource_pool_ = ResourcePool::Create(
1830 resource_provider, 1878 resource_provider,
1831 GL_TEXTURE_2D, 1879 GL_TEXTURE_2D,
1832 resource_provider->memory_efficient_texture_format()); 1880 resource_provider->memory_efficient_texture_format());
(...skipping 25 matching lines...) Expand all
1858 1906
1859 // Since we will create a new resource provider, we cannot continue to use 1907 // Since we will create a new resource provider, we cannot continue to use
1860 // the old resources (i.e. render_surfaces and texture IDs). Clear them 1908 // the old resources (i.e. render_surfaces and texture IDs). Clear them
1861 // before we destroy the old resource provider. 1909 // before we destroy the old resource provider.
1862 ReleaseTreeResources(); 1910 ReleaseTreeResources();
1863 1911
1864 // Note: order is important here. 1912 // Note: order is important here.
1865 renderer_.reset(); 1913 renderer_.reset();
1866 tile_manager_.reset(); 1914 tile_manager_.reset();
1867 resource_pool_.reset(); 1915 resource_pool_.reset();
1916 staging_resource_pool_.reset();
1868 raster_worker_pool_.reset(); 1917 raster_worker_pool_.reset();
1869 direct_raster_worker_pool_.reset(); 1918 direct_raster_worker_pool_.reset();
1870 resource_provider_.reset(); 1919 resource_provider_.reset();
1871 output_surface_.reset(); 1920 output_surface_.reset();
1872 1921
1873 if (!output_surface->BindToClient(this)) 1922 if (!output_surface->BindToClient(this))
1874 return false; 1923 return false;
1875 1924
1876 scoped_ptr<ResourceProvider> resource_provider = 1925 scoped_ptr<ResourceProvider> resource_provider =
1877 ResourceProvider::Create(output_surface.get(), 1926 ResourceProvider::Create(output_surface.get(),
(...skipping 12 matching lines...) Expand all
1890 output_surface.get(), resource_provider.get(), skip_gl_renderer); 1939 output_surface.get(), resource_provider.get(), skip_gl_renderer);
1891 1940
1892 if (!renderer_) 1941 if (!renderer_)
1893 return false; 1942 return false;
1894 1943
1895 if (settings_.impl_side_painting) { 1944 if (settings_.impl_side_painting) {
1896 CreateAndSetTileManager( 1945 CreateAndSetTileManager(
1897 resource_provider.get(), 1946 resource_provider.get(),
1898 output_surface->context_provider().get(), 1947 output_surface->context_provider().get(),
1899 GetRendererCapabilities().using_map_image, 1948 GetRendererCapabilities().using_map_image,
1949 settings_.use_zero_copy,
1900 GetRendererCapabilities().allow_rasterize_on_demand); 1950 GetRendererCapabilities().allow_rasterize_on_demand);
1901 } 1951 }
1902 1952
1903 if (!settings_.throttle_frame_production) { 1953 if (!settings_.throttle_frame_production) {
1904 // Disable VSync 1954 // Disable VSync
1905 output_surface->SetThrottleFrameProduction(false); 1955 output_surface->SetThrottleFrameProduction(false);
1906 } else if (!settings_.begin_impl_frame_scheduling_enabled) { 1956 } else if (!settings_.begin_impl_frame_scheduling_enabled) {
1907 // Setup BeginFrameEmulation if it's not supported natively 1957 // Setup BeginFrameEmulation if it's not supported natively
1908 const base::TimeDelta display_refresh_interval = 1958 const base::TimeDelta display_refresh_interval =
1909 base::TimeDelta::FromMicroseconds( 1959 base::TimeDelta::FromMicroseconds(
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
1990 DCHECK(output_surface_->capabilities().deferred_gl_initialization); 2040 DCHECK(output_surface_->capabilities().deferred_gl_initialization);
1991 DCHECK(settings_.impl_side_painting); 2041 DCHECK(settings_.impl_side_painting);
1992 DCHECK(output_surface_->context_provider()); 2042 DCHECK(output_surface_->context_provider());
1993 2043
1994 ReleaseTreeResources(); 2044 ReleaseTreeResources();
1995 renderer_.reset(); 2045 renderer_.reset();
1996 tile_manager_.reset(); 2046 tile_manager_.reset();
1997 resource_pool_.reset(); 2047 resource_pool_.reset();
1998 raster_worker_pool_.reset(); 2048 raster_worker_pool_.reset();
1999 direct_raster_worker_pool_.reset(); 2049 direct_raster_worker_pool_.reset();
2050 staging_resource_pool_.reset();
2000 resource_provider_->InitializeSoftware(); 2051 resource_provider_->InitializeSoftware();
2001 2052
2002 bool skip_gl_renderer = true; 2053 bool skip_gl_renderer = true;
2003 CreateAndSetRenderer( 2054 CreateAndSetRenderer(
2004 output_surface_.get(), resource_provider_.get(), skip_gl_renderer); 2055 output_surface_.get(), resource_provider_.get(), skip_gl_renderer);
2005 DCHECK(renderer_); 2056 DCHECK(renderer_);
2006 2057
2007 EnforceZeroBudget(true); 2058 EnforceZeroBudget(true);
2008 CreateAndSetTileManager(resource_provider_.get(), 2059 CreateAndSetTileManager(resource_provider_.get(),
2009 NULL, 2060 NULL,
2010 GetRendererCapabilities().using_map_image, 2061 GetRendererCapabilities().using_map_image,
2062 settings_.use_zero_copy,
2011 GetRendererCapabilities().allow_rasterize_on_demand); 2063 GetRendererCapabilities().allow_rasterize_on_demand);
2012 DCHECK(tile_manager_); 2064 DCHECK(tile_manager_);
2013 2065
2014 SetOffscreenContextProvider(NULL); 2066 SetOffscreenContextProvider(NULL);
2015 2067
2016 client_->SetNeedsCommitOnImplThread(); 2068 client_->SetNeedsCommitOnImplThread();
2017 } 2069 }
2018 2070
2019 void LayerTreeHostImpl::SetViewportSize(const gfx::Size& device_viewport_size) { 2071 void LayerTreeHostImpl::SetViewportSize(const gfx::Size& device_viewport_size) {
2020 if (device_viewport_size == device_viewport_size_) 2072 if (device_viewport_size == device_viewport_size_)
(...skipping 1101 matching lines...) Expand 10 before | Expand all | Expand 10 after
3122 swap_promise_monitor_.erase(monitor); 3174 swap_promise_monitor_.erase(monitor);
3123 } 3175 }
3124 3176
3125 void LayerTreeHostImpl::NotifySwapPromiseMonitorsOfSetNeedsRedraw() { 3177 void LayerTreeHostImpl::NotifySwapPromiseMonitorsOfSetNeedsRedraw() {
3126 std::set<SwapPromiseMonitor*>::iterator it = swap_promise_monitor_.begin(); 3178 std::set<SwapPromiseMonitor*>::iterator it = swap_promise_monitor_.begin();
3127 for (; it != swap_promise_monitor_.end(); it++) 3179 for (; it != swap_promise_monitor_.end(); it++)
3128 (*it)->OnSetNeedsRedrawOnImpl(); 3180 (*it)->OnSetNeedsRedrawOnImpl();
3129 } 3181 }
3130 3182
3131 } // namespace cc 3183 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698