Chromium Code Reviews| Index: cc/resources/tile_manager.cc |
| diff --git a/cc/resources/tile_manager.cc b/cc/resources/tile_manager.cc |
| index f965981ffaa16ef8cec1b58136c2ea1c11412cdf..837985a9600f6dc02a04ad557c8b3433e62dd2ad 100644 |
| --- a/cc/resources/tile_manager.cc |
| +++ b/cc/resources/tile_manager.cc |
| @@ -16,6 +16,7 @@ |
| #include "cc/resources/image_raster_worker_pool.h" |
| #include "cc/resources/pixel_buffer_raster_worker_pool.h" |
| #include "cc/resources/tile.h" |
| +#include "skia/ext/paint_simplifier.h" |
| #include "third_party/skia/include/core/SkCanvas.h" |
| #include "ui/gfx/rect_conversions.h" |
| @@ -23,6 +24,18 @@ namespace cc { |
| namespace { |
| +class DisableLCDTextFilter : public SkDrawFilter { |
| + public: |
| + // SkDrawFilter interface. |
| + virtual bool filter(SkPaint* paint, SkDrawFilter::Type type) OVERRIDE { |
| + if (type != SkDrawFilter::kText_Type) |
| + return true; |
| + |
| + paint->setLCDRenderText(false); |
| + return true; |
| + } |
| +}; |
| + |
| // Determine bin based on three categories of tiles: things we need now, |
| // things we need soon, and eventually. |
| inline TileManagerBin BinFromTilePriority(const TilePriority& prio) { |
| @@ -393,6 +406,19 @@ void TileManager::AddRequiredTileForActivation(Tile* tile) { |
| tiles_that_need_to_be_initialized_for_activation_.insert(tile); |
| } |
| +unsigned TileManager::DetermineRasterFlags(const Tile* tile) const { |
| + DCHECK(tile); |
| + DCHECK(tile->picture_pile()); |
| + |
| + unsigned raster_flags = 0; |
| + if (tile->picture_pile()->can_use_lcd_text()) |
| + raster_flags |= USE_LCD_TEXT; |
| + |
| + if (tile->managed_state().resolution != LOW_RESOLUTION) |
| + raster_flags |= USE_HIGH_QUALITY; |
| + return raster_flags; |
| +} |
| + |
| void TileManager::AssignGpuMemoryToTiles() { |
| TRACE_EVENT0("cc", "TileManager::AssignGpuMemoryToTiles"); |
| @@ -446,11 +472,15 @@ void TileManager::AssignGpuMemoryToTiles() { |
| if (tile_version.resource_) |
| tile_bytes += tile->bytes_consumed_if_allocated(); |
| + unsigned current_raster_flags = tile_version.raster_flags_; |
| + unsigned required_raster_flags = DetermineRasterFlags(tile); |
|
reveman
2013/06/04 16:17:12
What causes required_raster_flags to change and ho
vmpstr
2013/06/04 16:59:08
the quality right now depends on the tile resoluti
reveman
2013/06/04 20:16:08
How come TileRasterFlags is not just part of the T
|
| + |
| // It will cost to allocate a resource. |
| - // Note that this is separate from the above condition, |
| - // so that it's clear why we're adding memory. |
| - if (!tile_version.resource_ && mts.raster_task.is_null()) |
| + if (mts.raster_task.is_null() && |
| + (!tile_version.resource_ || |
| + (current_raster_flags != required_raster_flags))) { |
|
reveman
2013/06/04 16:17:12
what if !mts.raster_task.is_null() but current_ras
vmpstr
2013/06/04 16:59:08
I've added a check in raster task completion.
|
| tile_bytes += tile->bytes_consumed_if_allocated(); |
| + } |
| // Tile is OOM. |
| if (tile_bytes > bytes_left) { |
| @@ -476,8 +506,10 @@ void TileManager::AssignGpuMemoryToTiles() { |
| if (higher_priority_tile_oomed) |
| continue; |
| - if (!tile_version.resource_) |
| + if (!tile_version.resource_ || |
| + (current_raster_flags != required_raster_flags)) { |
| tiles_that_need_to_be_rasterized_.push_back(tile); |
| + } |
| if (!tile_version.resource_ && tile->required_for_activation()) |
| AddRequiredTileForActivation(tile); |
| @@ -561,7 +593,8 @@ void TileManager::ScheduleTasks() { |
| ManagedTileState& mts = tile->managed_state(); |
| DCHECK(tile->tile_version().requires_resource()); |
| - DCHECK(!tile->tile_version().resource_); |
| + DCHECK(!tile->tile_version().resource_ || |
| + (tile->tile_version().raster_flags_ != DetermineRasterFlags(tile))); |
| // Create raster task for this tile if necessary. |
| if (mts.raster_task.is_null()) |
| @@ -610,6 +643,7 @@ TileManager::RasterTaskMetadata TileManager::GetRasterTaskMetadata( |
| metadata.layer_id = tile.layer_id(); |
| metadata.tile_id = &tile; |
| metadata.source_frame_number = tile.source_frame_number(); |
| + metadata.raster_flags = DetermineRasterFlags(&tile); |
| return metadata; |
| } |
| @@ -655,6 +689,7 @@ RasterWorkerPool::RasterTask TileManager::CreateRasterTask(Tile* tile) { |
| pending_decode_tasks_[id] = decode_task; |
| } |
| + RasterTaskMetadata metadata = GetRasterTaskMetadata(*tile); |
| return RasterWorkerPool::RasterTask( |
| tile->picture_pile(), |
| const_resource, |
| @@ -664,19 +699,20 @@ RasterWorkerPool::RasterTask TileManager::CreateRasterTask(Tile* tile) { |
| tile->content_rect(), |
| tile->contents_scale(), |
| use_color_estimator_, |
| - GetRasterTaskMetadata(*tile), |
| + metadata, |
| rendering_stats_instrumentation_), |
| base::Bind(&TileManager::RunRasterTask, |
| analysis, |
| tile->content_rect(), |
| tile->contents_scale(), |
| - GetRasterTaskMetadata(*tile), |
| + metadata, |
| rendering_stats_instrumentation_)), |
| base::Bind(&TileManager::OnRasterTaskCompleted, |
| base::Unretained(this), |
| make_scoped_refptr(tile), |
| base::Passed(&resource), |
| - base::Owned(analysis)), |
| + base::Owned(analysis), |
| + metadata.raster_flags), |
| &decode_tasks); |
| } |
| @@ -684,6 +720,7 @@ void TileManager::OnRasterTaskCompleted( |
| scoped_refptr<Tile> tile, |
| scoped_ptr<ResourcePool::Resource> resource, |
| PicturePileImpl::Analysis* analysis, |
| + unsigned raster_flags, |
| bool was_canceled) { |
| TRACE_EVENT1("cc", "TileManager::OnRasterTaskCompleted", |
| "was_canceled", was_canceled); |
| @@ -697,6 +734,12 @@ void TileManager::OnRasterTaskCompleted( |
| return; |
| } |
| + if (tile->tile_version().resource_) { |
| + resource_pool_->ReleaseResource(tile->tile_version().resource_.Pass()); |
| + DCHECK(tile->tile_version().raster_flags_ != raster_flags); |
| + tile->tile_version().raster_flags_ = INVALID_RASTER_FLAG; |
| + } |
| + |
| mts.picture_pile_analysis = *analysis; |
| mts.picture_pile_analyzed = true; |
| @@ -705,6 +748,7 @@ void TileManager::OnRasterTaskCompleted( |
| resource_pool_->ReleaseResource(resource.Pass()); |
| } else { |
| tile->tile_version().resource_ = resource.Pass(); |
| + tile->tile_version().raster_flags_ = raster_flags; |
| } |
| DidFinishTileInitialization(tile.get()); |
| @@ -790,6 +834,7 @@ scoped_ptr<base::Value> TileManager::RasterTaskMetadata::AsValue() const { |
| is_tile_in_pending_tree_now_bin); |
| res->Set("resolution", TileResolutionAsValue(tile_resolution).release()); |
| res->SetInteger("source_frame_number", source_frame_number); |
| + res->SetInteger("raster_flags", raster_flags); |
| return res.PassAs<base::Value>(); |
| } |
| @@ -817,6 +862,14 @@ bool TileManager::RunRasterTask( |
| SkCanvas canvas(device); |
| + skia::RefPtr<SkDrawFilter> draw_filter; |
| + if ((metadata.raster_flags & USE_HIGH_QUALITY) == 0) |
| + draw_filter = skia::AdoptRef(new skia::PaintSimplifier); |
| + else if ((metadata.raster_flags & USE_LCD_TEXT) == 0) |
| + draw_filter = skia::AdoptRef(new DisableLCDTextFilter); |
|
reveman
2013/06/04 16:17:12
How about low-quality when using lcd text? I don't
vmpstr
2013/06/04 16:59:08
Low quality filter disables lcd text as well. I pr
reveman
2013/06/04 20:16:08
If they can be on/off independently but we don't s
|
| + |
| + canvas.setDrawFilter(draw_filter.get()); |
| + |
| if (stats_instrumentation->record_rendering_stats()) { |
| PicturePileImpl::RasterStats raster_stats; |
| picture_pile->RasterToBitmap(&canvas, rect, contents_scale, &raster_stats); |