Index: cc/resources/tile_manager.cc |
diff --git a/cc/resources/tile_manager.cc b/cc/resources/tile_manager.cc |
index dff3a52f871ac6a80cd05b77e92fc25ab6b14fed..28c3513f3615519743ed73b197ee0be4b9eb5604 100644 |
--- a/cc/resources/tile_manager.cc |
+++ b/cc/resources/tile_manager.cc |
@@ -622,7 +622,8 @@ void TileManager::AssignGpuMemoryToTiles( |
MemoryUsage memory_required_by_tile_to_be_scheduled; |
if (!tile->raster_task_.get()) { |
memory_required_by_tile_to_be_scheduled = MemoryUsage::FromConfig( |
- tile->desired_texture_size(), resource_pool_->resource_format()); |
+ tile->desired_texture_size(), |
+ resource_pool_->resource_format(DetermineResourceFormatUsage(tile))); |
} |
bool tile_is_needed_now = priority.priority_bin == TilePriority::NOW; |
@@ -676,6 +677,18 @@ void TileManager::AssignGpuMemoryToTiles( |
had_enough_memory_to_schedule_tiles_needed_now); |
} |
+ResourceFormatUsage TileManager::DetermineResourceFormatUsage( |
+ const Tile* tile) const { |
+ ResourceFormatUsage usage; |
+ gfx::Size size = tile->desired_texture_size(); |
+ if ((size.width() % 4 != 0) || (size.height() % 4 != 0)) { |
+ usage = FORMAT_USAGE_NATIVE; |
+ } else { |
+ usage = tile->IsOpaque() ? FORMAT_USAGE_OPAQUE : FORMAT_USAGE_TRANSLUSCENT; |
+ } |
+ return usage; |
+} |
+ |
void TileManager::FreeResourcesForTile(Tile* tile) { |
TileDrawInfo& draw_info = tile->draw_info(); |
if (draw_info.resource_) |
@@ -756,7 +769,8 @@ scoped_refptr<ImageDecodeTask> TileManager::CreateImageDecodeTask( |
scoped_refptr<RasterTask> TileManager::CreateRasterTask(Tile* tile) { |
scoped_ptr<ScopedResource> resource = |
- resource_pool_->AcquireResource(tile->desired_texture_size()); |
+ resource_pool_->AcquireResource(tile->desired_texture_size(), |
+ DetermineResourceFormatUsage(tile)); |
const ScopedResource* const_resource = resource.get(); |
// Create and queue all image decode tasks that this tile depends on. |