Chromium Code Reviews| Index: cc/trees/layer_tree_host_impl.cc |
| diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc |
| index 9fac00412bd0ef3329952610fa3236e14b7e03a7..79fb41a8ae4797eeeb0dd5dc9f75f124eb209060 100644 |
| --- a/cc/trees/layer_tree_host_impl.cc |
| +++ b/cc/trees/layer_tree_host_impl.cc |
| @@ -44,6 +44,7 @@ |
| #include "cc/quads/solid_color_draw_quad.h" |
| #include "cc/quads/texture_draw_quad.h" |
| #include "cc/resources/direct_raster_worker_pool.h" |
| +#include "cc/resources/image_copy_raster_worker_pool.h" |
| #include "cc/resources/image_raster_worker_pool.h" |
| #include "cc/resources/memory_history.h" |
| #include "cc/resources/picture_layer_tiling.h" |
| @@ -69,6 +70,10 @@ |
| namespace { |
| +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
|
| +const int kStagingPoolUnusedMemoryLimit = kStagingPoolMemoryLimitWhenVisible; |
| +const int kStagingPoolResourceCountLimit = 48; |
| + |
| void DidVisibilityChange(cc::LayerTreeHostImpl* id, bool visible) { |
| if (visible) { |
| TRACE_EVENT_ASYNC_BEGIN1("webkit", |
| @@ -122,6 +127,16 @@ unsigned GetMapImageTextureTarget(cc::ContextProvider* context_provider) { |
| return GL_TEXTURE_2D; |
| } |
| +unsigned GetCopyImageTextureTarget(cc::ContextProvider* context_provider) { |
| + if (!context_provider) |
| + return GL_TEXTURE_2D; |
| + |
| + if (context_provider->ContextCapabilities().gpu.egl_image_external) |
| + return GL_TEXTURE_EXTERNAL_OES; |
| + |
| + return GL_TEXTURE_2D; |
| +} |
| + |
| } // namespace |
| namespace cc { |
| @@ -310,6 +325,7 @@ LayerTreeHostImpl::~LayerTreeHostImpl() { |
| resource_pool_.reset(); |
| raster_worker_pool_.reset(); |
| direct_raster_worker_pool_.reset(); |
| + staging_resource_pool_.reset(); |
| } |
| void LayerTreeHostImpl::BeginMainFrameAborted(bool did_handle) { |
| @@ -1200,6 +1216,15 @@ void LayerTreeHostImpl::UpdateTileManagerMemoryPolicy( |
| global_tile_state_.unused_memory_limit_in_bytes, |
| global_tile_state_.num_resources_limit); |
| + // We currently use hard-coded limits for staging pool limits. |
| + if (staging_resource_pool_) { |
| + staging_resource_pool_->CheckBusyResources(); |
| + staging_resource_pool_->SetResourceUsageLimits( |
| + visible_ ? kStagingPoolMemoryLimitWhenVisible : 0, |
| + kStagingPoolUnusedMemoryLimit, |
| + kStagingPoolResourceCountLimit); |
| + } |
| + |
| DidModifyTilePriorities(); |
| } |
| @@ -1806,20 +1831,43 @@ void LayerTreeHostImpl::CreateAndSetTileManager( |
| ResourceProvider* resource_provider, |
| ContextProvider* context_provider, |
| bool using_map_image, |
| + bool use_zero_copy, |
| bool allow_rasterize_on_demand) { |
| DCHECK(settings_.impl_side_painting); |
| DCHECK(resource_provider); |
| DCHECK(proxy_->ImplThreadTaskRunner()); |
| if (using_map_image) { |
| - raster_worker_pool_ = |
| - ImageRasterWorkerPool::Create(proxy_->ImplThreadTaskRunner(), |
| - RasterWorkerPool::GetTaskGraphRunner(), |
| - resource_provider); |
| - resource_pool_ = |
| - ResourcePool::Create(resource_provider, |
| - GetMapImageTextureTarget(context_provider), |
| - resource_provider->best_texture_format()); |
| + // We need to create a staging resource pool unless we're using |
| + // ImageRasterWorkerPool that implements zero-copy. |
| + if (use_zero_copy || !resource_provider_->use_sync_query()) { |
| + resource_pool_ = |
| + ResourcePool::Create(resource_provider, |
| + GetMapImageTextureTarget(context_provider), |
| + resource_provider->best_texture_format()); |
| + raster_worker_pool_ = |
| + ImageRasterWorkerPool::Create(proxy_->ImplThreadTaskRunner(), |
| + RasterWorkerPool::GetTaskGraphRunner(), |
| + resource_provider); |
| + } else { |
| + // TODO(reveman): Use GetMapImageTextureTarget instead of |
| + // GetCopyImageTextureTarget when GL_TEXTURE_RECTANGLE_ARB support has |
| + // been added to CHROMIUM_copy_texture. |
| + staging_resource_pool_ = |
| + ResourcePool::Create(resource_provider, |
| + GetCopyImageTextureTarget(context_provider), |
| + resource_provider->best_texture_format()); |
| + resource_pool_ = |
| + ResourcePool::Create(resource_provider, |
| + GL_TEXTURE_2D, |
| + resource_provider->best_texture_format()); |
| + |
| + raster_worker_pool_ = ImageCopyRasterWorkerPool::Create( |
| + proxy_->ImplThreadTaskRunner(), |
| + RasterWorkerPool::GetTaskGraphRunner(), |
| + resource_provider, |
| + staging_resource_pool_.get()); |
| + } |
| } else { |
| raster_worker_pool_ = PixelBufferRasterWorkerPool::Create( |
| proxy_->ImplThreadTaskRunner(), |
| @@ -1865,6 +1913,7 @@ bool LayerTreeHostImpl::InitializeRenderer( |
| renderer_.reset(); |
| tile_manager_.reset(); |
| resource_pool_.reset(); |
| + staging_resource_pool_.reset(); |
| raster_worker_pool_.reset(); |
| direct_raster_worker_pool_.reset(); |
| resource_provider_.reset(); |
| @@ -1897,6 +1946,7 @@ bool LayerTreeHostImpl::InitializeRenderer( |
| resource_provider.get(), |
| output_surface->context_provider().get(), |
| GetRendererCapabilities().using_map_image, |
| + settings_.use_zero_copy, |
| GetRendererCapabilities().allow_rasterize_on_demand); |
| } |
| @@ -1997,6 +2047,7 @@ void LayerTreeHostImpl::ReleaseGL() { |
| resource_pool_.reset(); |
| raster_worker_pool_.reset(); |
| direct_raster_worker_pool_.reset(); |
| + staging_resource_pool_.reset(); |
| resource_provider_->InitializeSoftware(); |
| bool skip_gl_renderer = true; |
| @@ -2008,6 +2059,7 @@ void LayerTreeHostImpl::ReleaseGL() { |
| CreateAndSetTileManager(resource_provider_.get(), |
| NULL, |
| GetRendererCapabilities().using_map_image, |
| + settings_.use_zero_copy, |
| GetRendererCapabilities().allow_rasterize_on_demand); |
| DCHECK(tile_manager_); |