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_); |