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

Unified 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 side-by-side diff with in-line comments
Download patch
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_);

Powered by Google App Engine
This is Rietveld 408576698