Index: cc/resources/tile_manager.cc |
diff --git a/cc/resources/tile_manager.cc b/cc/resources/tile_manager.cc |
index 7ab1fbf98dc3cd340456c1908ab2a6e4dd66b94f..8d80633e859b5006f8dc69e6cf373f54d4e72295 100644 |
--- a/cc/resources/tile_manager.cc |
+++ b/cc/resources/tile_manager.cc |
@@ -209,11 +209,13 @@ scoped_ptr<TileManager> TileManager::Create( |
base::SequencedTaskRunner* task_runner, |
ResourcePool* resource_pool, |
TileTaskRunner* tile_task_runner, |
+ int compression_threshold, |
RenderingStatsInstrumentation* rendering_stats_instrumentation, |
size_t scheduled_raster_task_limit) { |
- return make_scoped_ptr(new TileManager( |
- client, task_runner, resource_pool, tile_task_runner, |
- rendering_stats_instrumentation, scheduled_raster_task_limit)); |
+ return make_scoped_ptr( |
+ new TileManager(client, task_runner, resource_pool, tile_task_runner, |
+ compression_threshold, rendering_stats_instrumentation, |
+ scheduled_raster_task_limit)); |
} |
TileManager::TileManager( |
@@ -221,6 +223,7 @@ TileManager::TileManager( |
const scoped_refptr<base::SequencedTaskRunner>& task_runner, |
ResourcePool* resource_pool, |
TileTaskRunner* tile_task_runner, |
+ int compression_threshold, |
RenderingStatsInstrumentation* rendering_stats_instrumentation, |
size_t scheduled_raster_task_limit) |
: client_(client), |
@@ -232,6 +235,7 @@ TileManager::TileManager( |
rendering_stats_instrumentation_(rendering_stats_instrumentation), |
did_check_for_completed_tasks_since_last_schedule_tasks_(true), |
did_oom_on_last_assign_(false), |
+ compression_threshold_(compression_threshold), |
ready_to_activate_check_notifier_( |
task_runner_.get(), |
base::Bind(&TileManager::CheckIfReadyToActivate, |
@@ -591,7 +595,8 @@ void TileManager::AssignGpuMemoryToTiles( |
MemoryUsage memory_required_by_tile_to_be_scheduled; |
if (!mts.raster_task.get()) { |
memory_required_by_tile_to_be_scheduled = MemoryUsage::FromConfig( |
- tile->size(), resource_pool_->resource_format()); |
+ tile->size(), |
+ resource_pool_->resource_format(DetermineResourceFormatUsage(tile))); |
} |
bool tile_is_needed_now = priority.priority_bin == TilePriority::NOW; |
@@ -647,6 +652,26 @@ void TileManager::AssignGpuMemoryToTiles( |
had_enough_memory_to_schedule_tiles_needed_now); |
} |
+ResourceFormatUsage TileManager::DetermineResourceFormatUsage( |
+ const Tile* tile) const { |
+ ResourceFormatUsage usage; |
+ if (tile->size().width() % 4 != 0 || tile->size().height() % 4 != 0 || |
+ tile->frequently_invalidated()) { |
+ usage = FORMAT_USAGE_NATIVE; |
+ } else { |
+ usage = tile->IsOpaque() ? FORMAT_USAGE_OPAQUE : FORMAT_USAGE_TRANSLUCENT; |
+ // Urgent tiles can be generated faster if we avoid memory optimized |
+ // formats. |
+ if (compression_threshold_ >= 0) { |
+ TilePriority::PriorityBin bin = tile->combined_priority().priority_bin; |
+ if (static_cast<int>(bin) < compression_threshold_) { |
+ usage = FORMAT_USAGE_NATIVE; |
+ } |
+ } |
+ } |
+ return usage; |
+} |
+ |
void TileManager::FreeResourcesForTile(Tile* tile) { |
ManagedTileState& mts = tile->managed_state(); |
if (mts.draw_info.resource_) |
@@ -729,8 +754,8 @@ scoped_refptr<ImageDecodeTask> TileManager::CreateImageDecodeTask( |
scoped_refptr<RasterTask> TileManager::CreateRasterTask(Tile* tile) { |
ManagedTileState& mts = tile->managed_state(); |
- scoped_ptr<ScopedResource> resource = |
- resource_pool_->AcquireResource(tile->size()); |
+ scoped_ptr<ScopedResource> resource = resource_pool_->AcquireResource( |
+ tile->size(), DetermineResourceFormatUsage(tile)); |
const ScopedResource* const_resource = resource.get(); |
// Create and queue all image decode tasks that this tile depends on. |