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(); |
} |