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 f11911aa91d64b012cb488aa0d0d029fd91bbe50..315f5c5ef65d8edf08322c12a658cdce355b421b 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" |
| @@ -122,6 +123,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 +321,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 +1212,17 @@ 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. |
|
vmpstr
2014/04/25 19:05:41
nit: Is this comment still correct? We're using Ge
reveman
2014/04/25 20:18:25
Updated comment.
|
| + if (staging_resource_pool_) { |
| + size_t memory_limit_when_visible = GetMaxTransferBufferUsageBytes( |
| + output_surface_->context_provider().get()); |
| + staging_resource_pool_->CheckBusyResources(); |
| + staging_resource_pool_->SetResourceUsageLimits( |
| + visible_ ? memory_limit_when_visible : 0, |
| + memory_limit_when_visible, |
| + std::numeric_limits<size_t>::max()); |
| + } |
| + |
| DidModifyTilePriorities(); |
| } |
| @@ -1806,20 +1829,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 +1911,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 +1944,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 +2045,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 +2057,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_); |