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

Unified Diff: cc/trees/layer_tree_host_impl.cc

Issue 296453009: cc: Get rid of rasterizer delegate. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: switch tile manager Created 6 years, 7 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
« no previous file with comments | « cc/trees/layer_tree_host_impl.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 2294bb5885caeaf89ae838229ced63c8082bd76b..c81824fb995d44a86e300b109f4469a27d69ea12 100644
--- a/cc/trees/layer_tree_host_impl.cc
+++ b/cc/trees/layer_tree_host_impl.cc
@@ -115,6 +115,21 @@ unsigned GetMapImageTextureTarget(cc::ContextProvider* context_provider) {
return GL_TEXTURE_2D;
}
+bool UseZeroCopyTextureUpload(cc::LayerTreeHostImpl* host_impl) {
reveman 2014/05/21 04:17:06 Either make these two functions member functions i
alokp 2014/05/21 05:24:43 Done.
+ // Note: we use zero-copy by default when the renderer is using
+ // shared memory resources.
+ return (host_impl->settings().use_zero_copy ||
+ host_impl->GetRendererCapabilities().using_shared_memory_resources) &&
+ host_impl->GetRendererCapabilities().using_map_image;
+}
+
+bool UseOneCopyTextureUpload(cc::LayerTreeHostImpl* host_impl) {
+ // Sync query support is required by one-copy rasterizer.
+ return host_impl->settings().use_one_copy &&
+ host_impl->GetRendererCapabilities().using_map_image &&
+ host_impl->resource_provider()->use_sync_query();
+}
+
} // namespace
namespace cc {
@@ -302,11 +317,7 @@ LayerTreeHostImpl::~LayerTreeHostImpl() {
recycle_tree_.reset();
pending_tree_.reset();
active_tree_.reset();
- tile_manager_.reset();
- resource_pool_.reset();
- raster_worker_pool_.reset();
- direct_raster_worker_pool_.reset();
- staging_resource_pool_.reset();
+ DestroyTileManager();
}
void LayerTreeHostImpl::BeginMainFrameAborted(bool did_handle) {
@@ -1528,6 +1539,13 @@ void LayerTreeHostImpl::SetUseGpuRasterization(bool use_gpu) {
use_gpu_rasterization_ = use_gpu;
ReleaseTreeResources();
+ // Replace existing tile manager with another one that uses appropriate
+ // rasterizer.
+ if (tile_manager_) {
+ DestroyTileManager();
+ CreateAndSetTileManager(output_surface_->context_provider().get());
+ }
+
// We have released tilings for both active and pending tree.
// We would not have any content to draw until the pending tree is activated.
// Prevent the active tree from drawing until activation.
@@ -1821,24 +1839,24 @@ void LayerTreeHostImpl::ReleaseTreeResources() {
EvictAllUIResources();
}
-void LayerTreeHostImpl::CreateAndSetRenderer(
- OutputSurface* output_surface,
- ResourceProvider* resource_provider,
- bool skip_gl_renderer) {
+void LayerTreeHostImpl::CreateAndSetRenderer(bool skip_gl_renderer) {
DCHECK(!renderer_);
- if (output_surface->capabilities().delegated_rendering) {
+ DCHECK(output_surface_);
+ DCHECK(resource_provider_);
+
+ if (output_surface_->capabilities().delegated_rendering) {
renderer_ = DelegatingRenderer::Create(
- this, &settings_, output_surface, resource_provider);
- } else if (output_surface->context_provider() && !skip_gl_renderer) {
+ this, &settings_, output_surface_.get(), resource_provider_.get());
+ } else if (output_surface_->context_provider() && !skip_gl_renderer) {
renderer_ = GLRenderer::Create(this,
&settings_,
- output_surface,
- resource_provider,
+ output_surface_.get(),
+ resource_provider_.get(),
texture_mailbox_deleter_.get(),
settings_.highp_threshold_min);
- } else if (output_surface->software_device()) {
+ } else if (output_surface_->software_device()) {
renderer_ = SoftwareRenderer::Create(
- this, &settings_, output_surface, resource_provider);
+ this, &settings_, output_surface_.get(), resource_provider_.get());
}
DCHECK(renderer_);
@@ -1855,68 +1873,84 @@ void LayerTreeHostImpl::CreateAndSetRenderer(
}
void LayerTreeHostImpl::CreateAndSetTileManager(
- ResourceProvider* resource_provider,
- ContextProvider* context_provider,
- bool use_zero_copy,
- bool use_one_copy,
- bool allow_rasterize_on_demand) {
+ ContextProvider* context_provider) {
+ DCHECK(!tile_manager_);
DCHECK(settings_.impl_side_painting);
- DCHECK(resource_provider);
+ DCHECK(resource_provider_);
DCHECK(proxy_->ImplThreadTaskRunner());
transfer_buffer_memory_limit_ =
GetMaxTransferBufferUsageBytes(context_provider);
- if (use_zero_copy) {
+ if (use_gpu_rasterization_ && context_provider) {
+ resource_pool_ =
+ ResourcePool::Create(resource_provider_.get(),
+ GL_TEXTURE_2D,
+ resource_provider_->best_texture_format());
+
+ raster_worker_pool_ =
+ DirectRasterWorkerPool::Create(proxy_->ImplThreadTaskRunner(),
+ resource_provider_.get(),
+ context_provider);
+
+ } else if (UseZeroCopyTextureUpload(this)) {
resource_pool_ =
- ResourcePool::Create(resource_provider,
+ ResourcePool::Create(resource_provider_.get(),
GetMapImageTextureTarget(context_provider),
- resource_provider->best_texture_format());
+ resource_provider_->best_texture_format());
+
raster_worker_pool_ =
ImageRasterWorkerPool::Create(proxy_->ImplThreadTaskRunner(),
RasterWorkerPool::GetTaskGraphRunner(),
- resource_provider);
- } else if (use_one_copy) {
+ resource_provider_.get());
+ } else if (UseOneCopyTextureUpload(this)) {
// We need to create a staging resource pool when using copy rasterizer.
staging_resource_pool_ =
- ResourcePool::Create(resource_provider,
+ ResourcePool::Create(resource_provider_.get(),
GetMapImageTextureTarget(context_provider),
- resource_provider->best_texture_format());
+ resource_provider_->best_texture_format());
resource_pool_ =
- ResourcePool::Create(resource_provider,
+ ResourcePool::Create(resource_provider_.get(),
GL_TEXTURE_2D,
- resource_provider->best_texture_format());
+ resource_provider_->best_texture_format());
raster_worker_pool_ = ImageCopyRasterWorkerPool::Create(
proxy_->ImplThreadTaskRunner(),
RasterWorkerPool::GetTaskGraphRunner(),
- resource_provider,
+ resource_provider_.get(),
staging_resource_pool_.get());
} else {
+ resource_pool_ = ResourcePool::Create(
+ resource_provider_.get(),
+ GL_TEXTURE_2D,
+ resource_provider_->memory_efficient_texture_format());
+
raster_worker_pool_ = PixelBufferRasterWorkerPool::Create(
proxy_->ImplThreadTaskRunner(),
RasterWorkerPool::GetTaskGraphRunner(),
- resource_provider,
+ resource_provider_.get(),
transfer_buffer_memory_limit_);
- resource_pool_ = ResourcePool::Create(
- resource_provider,
- GL_TEXTURE_2D,
- resource_provider->memory_efficient_texture_format());
}
- direct_raster_worker_pool_ = DirectRasterWorkerPool::Create(
- proxy_->ImplThreadTaskRunner(), resource_provider, context_provider);
+
tile_manager_ =
TileManager::Create(this,
resource_pool_.get(),
raster_worker_pool_->AsRasterizer(),
- direct_raster_worker_pool_->AsRasterizer(),
- allow_rasterize_on_demand,
+ GetRendererCapabilities().allow_rasterize_on_demand,
rendering_stats_instrumentation_);
+ DCHECK(tile_manager_);
reveman 2014/05/21 04:17:06 I don't think it's necessary to check that ::Creat
alokp 2014/05/21 05:24:43 Done.
UpdateTileManagerMemoryPolicy(ActualManagedMemoryPolicy());
need_to_update_visible_tiles_before_draw_ = false;
}
+void LayerTreeHostImpl::DestroyTileManager() {
+ tile_manager_.reset();
+ resource_pool_.reset();
+ staging_resource_pool_.reset();
+ raster_worker_pool_.reset();
+}
+
void LayerTreeHostImpl::EnforceZeroBudget(bool zero_budget) {
SetManagedMemoryPolicy(cached_managed_memory_policy_, zero_budget);
}
@@ -1934,55 +1968,34 @@ bool LayerTreeHostImpl::InitializeRenderer(
// Note: order is important here.
renderer_.reset();
- tile_manager_.reset();
- resource_pool_.reset();
- staging_resource_pool_.reset();
- raster_worker_pool_.reset();
- direct_raster_worker_pool_.reset();
+ DestroyTileManager();
resource_provider_.reset();
output_surface_.reset();
if (!output_surface->BindToClient(this))
return false;
- scoped_ptr<ResourceProvider> resource_provider =
- ResourceProvider::Create(output_surface.get(),
+ output_surface_ = output_surface.Pass();
+ resource_provider_ =
+ ResourceProvider::Create(output_surface_.get(),
shared_bitmap_manager_,
settings_.highp_threshold_min,
settings_.use_rgba_4444_textures,
settings_.texture_id_allocation_chunk_size,
settings_.use_distance_field_text);
- if (output_surface->capabilities().deferred_gl_initialization)
+ if (output_surface_->capabilities().deferred_gl_initialization)
EnforceZeroBudget(true);
bool skip_gl_renderer = false;
- CreateAndSetRenderer(
- output_surface.get(), resource_provider.get(), skip_gl_renderer);
+ CreateAndSetRenderer(skip_gl_renderer);
+ ContextProvider* context_provider = output_surface_->context_provider().get();
transfer_buffer_memory_limit_ =
- GetMaxTransferBufferUsageBytes(output_surface->context_provider().get());
+ GetMaxTransferBufferUsageBytes(context_provider);
- if (settings_.impl_side_painting) {
- // Note: we use zero-copy rasterizer by default when the renderer is using
- // shared memory resources.
- bool use_zero_copy =
- (settings_.use_zero_copy ||
- GetRendererCapabilities().using_shared_memory_resources) &&
- GetRendererCapabilities().using_map_image;
-
- // Sync query support is required by one-copy rasterizer.
- bool use_one_copy = settings_.use_one_copy &&
- GetRendererCapabilities().using_map_image &&
- resource_provider->use_sync_query();
-
- CreateAndSetTileManager(
- resource_provider.get(),
- output_surface->context_provider().get(),
- use_zero_copy,
- use_one_copy,
- GetRendererCapabilities().allow_rasterize_on_demand);
- }
+ if (settings_.impl_side_painting)
+ CreateAndSetTileManager(context_provider);
// Initialize vsync parameters to sane values.
const base::TimeDelta display_refresh_interval =
@@ -1992,20 +2005,15 @@ bool LayerTreeHostImpl::InitializeRenderer(
// TODO(brianderson): Don't use a hard-coded parent draw time.
base::TimeDelta parent_draw_time =
- output_surface->capabilities().adjust_deadline_for_parent
+ output_surface_->capabilities().adjust_deadline_for_parent
? BeginFrameArgs::DefaultDeadlineAdjustment()
: base::TimeDelta();
client_->SetEstimatedParentDrawTime(parent_draw_time);
- int max_frames_pending =
- output_surface->capabilities().max_frames_pending;
+ int max_frames_pending = output_surface_->capabilities().max_frames_pending;
if (max_frames_pending <= 0)
max_frames_pending = OutputSurface::DEFAULT_MAX_FRAMES_PENDING;
client_->SetMaxSwapsPendingOnImplThread(max_frames_pending);
-
- resource_provider_ = resource_provider.Pass();
- output_surface_ = output_surface.Pass();
-
client_->OnCanDrawStateChanged(CanDraw());
return true;
@@ -2027,8 +2035,7 @@ void LayerTreeHostImpl::DeferredInitialize() {
resource_provider_->InitializeGL();
bool skip_gl_renderer = false;
- CreateAndSetRenderer(
- output_surface_.get(), resource_provider_.get(), skip_gl_renderer);
+ CreateAndSetRenderer(skip_gl_renderer);
EnforceZeroBudget(false);
client_->SetNeedsCommitOnImplThread();
@@ -2041,25 +2048,15 @@ void LayerTreeHostImpl::ReleaseGL() {
ReleaseTreeResources();
renderer_.reset();
- tile_manager_.reset();
- resource_pool_.reset();
- raster_worker_pool_.reset();
- direct_raster_worker_pool_.reset();
- staging_resource_pool_.reset();
+ DestroyTileManager();
resource_provider_->InitializeSoftware();
bool skip_gl_renderer = true;
- CreateAndSetRenderer(
- output_surface_.get(), resource_provider_.get(), skip_gl_renderer);
+ CreateAndSetRenderer(skip_gl_renderer);
EnforceZeroBudget(true);
- DCHECK(GetRendererCapabilities().using_map_image);
- CreateAndSetTileManager(resource_provider_.get(),
- NULL,
- true,
- false,
- GetRendererCapabilities().allow_rasterize_on_demand);
- DCHECK(tile_manager_);
+ DCHECK(UseZeroCopyTextureUpload(this));
reveman 2014/05/21 04:17:06 I don't think this DCHECK makes sense here. You're
alokp 2014/05/21 05:24:43 Done.
+ CreateAndSetTileManager(NULL);
client_->SetNeedsCommitOnImplThread();
}
« no previous file with comments | « cc/trees/layer_tree_host_impl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698