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 1ec6d3357383893432c553f312d4eeba7ee46f06..9a28420e2bb67ce6290cd484de81314f3502657b 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" |
| @@ -262,7 +263,8 @@ LayerTreeHostImpl::LayerTreeHostImpl( |
| did_lose_called_(false), |
| #endif |
| shared_bitmap_manager_(manager), |
| - id_(id) { |
| + id_(id), |
| + transfer_buffer_memory_limit_(0u) { |
| DCHECK(proxy_->IsImplThread()); |
| DidVisibilityChange(this, visible_); |
| @@ -310,6 +312,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) { |
| @@ -1203,6 +1206,16 @@ void LayerTreeHostImpl::UpdateTileManagerMemoryPolicy( |
| unused_memory_limit_in_bytes, |
| global_tile_state_.num_resources_limit); |
| + // Staging pool resources are used as transfer buffers so we use |
| + // |transfer_buffer_memory_limit_| as the memory limit for this resource pool. |
| + if (staging_resource_pool_) { |
| + staging_resource_pool_->CheckBusyResources(); |
| + staging_resource_pool_->SetResourceUsageLimits( |
| + visible_ ? transfer_buffer_memory_limit_ : 0, |
| + transfer_buffer_memory_limit_, |
| + std::numeric_limits<size_t>::max()); |
| + } |
| + |
| DidModifyTilePriorities(); |
| } |
| @@ -1822,27 +1835,47 @@ void LayerTreeHostImpl::CreateAndSetRenderer( |
| void LayerTreeHostImpl::CreateAndSetTileManager( |
| ResourceProvider* resource_provider, |
| ContextProvider* context_provider, |
| - bool using_map_image, |
| + 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
|
| + bool use_one_copy, |
| bool allow_rasterize_on_demand) { |
| DCHECK(settings_.impl_side_painting); |
| DCHECK(resource_provider); |
| DCHECK(proxy_->ImplThreadTaskRunner()); |
| - if (using_map_image) { |
| + transfer_buffer_memory_limit_ = |
| + GetMaxTransferBufferUsageBytes(context_provider); |
| + |
| + if (use_zero_copy) { |
| + 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); |
| - resource_pool_ = |
| + } else if (use_one_copy) { |
| + // We need to create a staging resource pool when using copy rasterizer. |
| + staging_resource_pool_ = |
| ResourcePool::Create(resource_provider, |
| GetMapImageTextureTarget(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(), |
| RasterWorkerPool::GetTaskGraphRunner(), |
| resource_provider, |
| - GetMaxTransferBufferUsageBytes(context_provider)); |
| + transfer_buffer_memory_limit_); |
| resource_pool_ = ResourcePool::Create( |
| resource_provider, |
| GL_TEXTURE_2D, |
| @@ -1882,6 +1915,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(); |
| @@ -1904,11 +1938,21 @@ bool LayerTreeHostImpl::InitializeRenderer( |
| CreateAndSetRenderer( |
| output_surface.get(), resource_provider.get(), skip_gl_renderer); |
| + transfer_buffer_memory_limit_ = |
| + GetMaxTransferBufferUsageBytes(output_surface->context_provider().get()); |
| + |
| if (settings_.impl_side_painting) { |
| CreateAndSetTileManager( |
| resource_provider.get(), |
| output_surface->context_provider().get(), |
| - GetRendererCapabilities().using_map_image, |
| + // Use zero-copy rasterizer by default when using shared memory |
| + // resources. |
| + (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.
|
| + GetRendererCapabilities().using_shared_memory_resources) && |
|
reveman
2014/04/30 19:01:09
This should get us the behavior we want with the S
|
| + GetRendererCapabilities().using_map_image, |
| + // Sync query support is required by one-copy rasterizer. |
| + settings_.use_one_copy && GetRendererCapabilities().using_map_image && |
| + resource_provider->use_sync_query(), |
| GetRendererCapabilities().allow_rasterize_on_demand); |
| } |
| @@ -1973,6 +2017,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; |
| @@ -1980,9 +2025,11 @@ void LayerTreeHostImpl::ReleaseGL() { |
| output_surface_.get(), resource_provider_.get(), skip_gl_renderer); |
| EnforceZeroBudget(true); |
| + DCHECK(GetRendererCapabilities().using_map_image); |
| CreateAndSetTileManager(resource_provider_.get(), |
| NULL, |
| - GetRendererCapabilities().using_map_image, |
| + true, |
| + false, |
| GetRendererCapabilities().allow_rasterize_on_demand); |
| DCHECK(tile_manager_); |