summaryrefslogtreecommitdiffstats
path: root/chromium/cc/tiles/tile_manager.cc
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2017-11-20 10:33:36 +0100
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2017-11-22 11:45:12 +0000
commitbe59a35641616a4cf23c4a13fa0632624b021c1b (patch)
tree9da183258bdf9cc413f7562079d25ace6955467f /chromium/cc/tiles/tile_manager.cc
parentd702e4b6a64574e97fc7df8fe3238cde70242080 (diff)
BASELINE: Update Chromium to 62.0.3202.101
Change-Id: I2d5eca8117600df6d331f6166ab24d943d9814ac Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
Diffstat (limited to 'chromium/cc/tiles/tile_manager.cc')
-rw-r--r--chromium/cc/tiles/tile_manager.cc125
1 files changed, 79 insertions, 46 deletions
diff --git a/chromium/cc/tiles/tile_manager.cc b/chromium/cc/tiles/tile_manager.cc
index a995b2e96e9..8b916dea259 100644
--- a/chromium/cc/tiles/tile_manager.cc
+++ b/chromium/cc/tiles/tile_manager.cc
@@ -19,12 +19,13 @@
#include "base/metrics/histogram.h"
#include "base/numerics/safe_conversions.h"
#include "base/optional.h"
+#include "base/sys_info.h"
#include "base/threading/thread_checker.h"
#include "base/trace_event/trace_event_argument.h"
#include "cc/base/devtools_instrumentation.h"
#include "cc/base/histograms.h"
-#include "cc/debug/traced_value.h"
#include "cc/layers/picture_layer_impl.h"
+#include "cc/raster/playback_image_provider.h"
#include "cc/raster/raster_buffer.h"
#include "cc/raster/task_category.h"
#include "cc/tiles/frame_viewer_instrumentation.h"
@@ -91,7 +92,8 @@ class RasterTaskImpl : public TileTask {
uint64_t source_prepare_tiles_id,
std::unique_ptr<RasterBuffer> raster_buffer,
TileTask::Vector* dependencies,
- bool is_gpu_rasterization)
+ bool is_gpu_rasterization,
+ base::Optional<PlaybackImageProvider> image_provider)
: TileTask(!is_gpu_rasterization, dependencies),
tile_manager_(tile_manager),
tile_id_(tile->id()),
@@ -108,8 +110,12 @@ class RasterTaskImpl : public TileTask {
new_content_id_(tile->id()),
source_frame_number_(tile->source_frame_number()),
is_gpu_rasterization_(is_gpu_rasterization),
- raster_buffer_(std::move(raster_buffer)) {
+ raster_buffer_(std::move(raster_buffer)),
+ image_provider_(std::move(image_provider)) {
DCHECK(origin_thread_checker_.CalledOnValidThread());
+
+ if (image_provider_.has_value())
+ playback_settings_.image_provider = &image_provider_.value();
}
// Overridden from Task:
@@ -173,6 +179,7 @@ class RasterTaskImpl : public TileTask {
int source_frame_number_;
bool is_gpu_rasterization_;
std::unique_ptr<RasterBuffer> raster_buffer_;
+ base::Optional<PlaybackImageProvider> image_provider_;
DISALLOW_COPY_AND_ASSIGN(RasterTaskImpl);
};
@@ -363,7 +370,8 @@ TileManager::TileManager(
std::move(image_worker_task_runner)),
checker_image_tracker_(&image_controller_,
this,
- tile_manager_settings_.enable_checker_imaging),
+ tile_manager_settings_.enable_checker_imaging,
+ tile_manager_settings_.min_image_bytes_to_checker),
more_tiles_need_prepare_check_notifier_(
task_runner_,
base::Bind(&TileManager::CheckIfMoreTilesNeedToBePrepared,
@@ -526,25 +534,25 @@ bool TileManager::PrepareTiles(
return true;
}
-void TileManager::Flush() {
- TRACE_EVENT0("cc", "TileManager::Flush");
+void TileManager::CheckForCompletedTasks() {
+ TRACE_EVENT0("cc", "TileManager::CheckForCompletedTasks");
if (!tile_task_manager_) {
- TRACE_EVENT_INSTANT0("cc", "Flush aborted", TRACE_EVENT_SCOPE_THREAD);
+ TRACE_EVENT_INSTANT0("cc", "TileManager::CheckForCompletedTasksAborted",
+ TRACE_EVENT_SCOPE_THREAD);
return;
}
tile_task_manager_->CheckForCompletedTasks();
did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
- // Actually flush.
- raster_buffer_provider_->Flush();
-
- CheckPendingGpuWorkTiles(true /* issue_signals */);
+ CheckPendingGpuWorkTiles(true /* issue_signals */, false /* flush */);
- TRACE_EVENT_INSTANT1("cc", "DidFlush", TRACE_EVENT_SCOPE_THREAD, "stats",
- RasterTaskCompletionStatsAsValue(flush_stats_));
- flush_stats_ = RasterTaskCompletionStats();
+ TRACE_EVENT_INSTANT1(
+ "cc", "TileManager::CheckForCompletedTasksFinished",
+ TRACE_EVENT_SCOPE_THREAD, "stats",
+ RasterTaskCompletionStatsAsValue(raster_task_completion_stats_));
+ raster_task_completion_stats_ = RasterTaskCompletionStats();
}
void TileManager::DidModifyTilePriorities() {
@@ -821,6 +829,15 @@ TileManager::PrioritizedWorkToSchedule TileManager::AssignGpuMemoryToTiles() {
}
}
+ // The hard_limit for low-end devices is 8MB, so we set the max_value for the
+ // histogram to be 8200KB.
+ if (had_enough_memory_to_schedule_tiles_needed_now &&
+ base::SysInfo::AmountOfPhysicalMemoryMB() <= 512) {
+ int64_t tiles_gpu_memory_kb = memory_usage.memory_bytes() / 1024;
+ UMA_HISTOGRAM_CUSTOM_COUNTS("TileManager.TilesGPUMemoryUsage",
+ tiles_gpu_memory_kb, 1, 8200, 100);
+ }
+
UMA_HISTOGRAM_BOOLEAN("TileManager.ExceededMemoryBudget",
!had_enough_memory_to_schedule_tiles_needed_now);
did_oom_on_last_assign_ = !had_enough_memory_to_schedule_tiles_needed_now;
@@ -868,17 +885,19 @@ void TileManager::PartitionImagesForCheckering(
std::vector<DrawImage>* sync_decoded_images,
std::vector<PaintImage>* checkered_images) {
Tile* tile = prioritized_tile.tile();
- std::vector<DrawImage> images_in_tile;
+ std::vector<const DrawImage*> images_in_tile;
prioritized_tile.raster_source()->GetDiscardableImagesInRect(
- tile->enclosing_layer_rect(), tile->raster_transform().scale(),
- raster_color_space, &images_in_tile);
+ tile->enclosing_layer_rect(), &images_in_tile);
WhichTree tree = tile->tiling()->tree();
- for (auto& draw_image : images_in_tile) {
- if (checker_image_tracker_.ShouldCheckerImage(draw_image, tree))
+ for (const auto* original_draw_image : images_in_tile) {
+ DrawImage draw_image(*original_draw_image, tile->raster_transform().scale(),
+ raster_color_space);
+ if (checker_image_tracker_.ShouldCheckerImage(
+ draw_image, tree, tile->required_for_activation()))
checkered_images->push_back(draw_image.paint_image());
else
- sync_decoded_images->push_back(draw_image);
+ sync_decoded_images->push_back(std::move(draw_image));
}
}
@@ -888,14 +907,16 @@ void TileManager::AddCheckeredImagesToDecodeQueue(
CheckerImageTracker::DecodeType decode_type,
CheckerImageTracker::ImageDecodeQueue* image_decode_queue) {
Tile* tile = prioritized_tile.tile();
- std::vector<DrawImage> images_in_tile;
+ std::vector<const DrawImage*> images_in_tile;
prioritized_tile.raster_source()->GetDiscardableImagesInRect(
- tile->enclosing_layer_rect(), tile->raster_transform().scale(),
- raster_color_space, &images_in_tile);
+ tile->enclosing_layer_rect(), &images_in_tile);
WhichTree tree = tile->tiling()->tree();
- for (auto& draw_image : images_in_tile) {
- if (checker_image_tracker_.ShouldCheckerImage(draw_image, tree)) {
+ for (const auto* original_draw_image : images_in_tile) {
+ DrawImage draw_image(*original_draw_image, tile->raster_transform().scale(),
+ raster_color_space);
+ if (checker_image_tracker_.ShouldCheckerImage(
+ draw_image, tree, tile->required_for_activation())) {
image_decode_queue->push_back(CheckerImageTracker::ImageDecodeRequest(
draw_image.paint_image(), decode_type));
}
@@ -989,9 +1010,10 @@ void TileManager::ScheduleTasks(PrioritizedWorkToSchedule work_to_schedule) {
// Add the sync decoded images to |new_locked_images| so they can be added
// to the task graph.
- new_locked_images.insert(new_locked_images.end(),
- sync_decoded_images.begin(),
- sync_decoded_images.end());
+ new_locked_images.insert(
+ new_locked_images.end(),
+ std::make_move_iterator(sync_decoded_images.begin()),
+ std::make_move_iterator(sync_decoded_images.end()));
// For checkered-images, send them to the decode service.
for (auto& image : checkered_images) {
@@ -1101,7 +1123,7 @@ scoped_refptr<TileTask> TileManager::CreateRasterTask(
// For LOW_RESOLUTION tiles, we don't draw or predecode images.
RasterSource::PlaybackSettings playback_settings;
- playback_settings.skip_images =
+ const bool skip_images =
prioritized_tile.priority().resolution == LOW_RESOLUTION;
playback_settings.use_lcd_text = tile->can_use_lcd_text();
@@ -1113,12 +1135,13 @@ scoped_refptr<TileTask> TileManager::CreateRasterTask(
std::vector<DrawImage>& sync_decoded_images =
scheduled_draw_images_[tile->id()];
sync_decoded_images.clear();
- if (!playback_settings.skip_images) {
+ PaintImageIdFlatSet images_to_skip;
+ if (!skip_images) {
std::vector<PaintImage> checkered_images;
PartitionImagesForCheckering(prioritized_tile, color_space,
&sync_decoded_images, &checkered_images);
for (const auto& image : checkered_images) {
- playback_settings.images_to_skip.insert(image.sk_image()->uniqueID());
+ images_to_skip.insert(image.stable_id());
// This can be the case for tiles on the active tree that will be replaced
// or are occluded on the pending tree. While we still need to continue
@@ -1132,12 +1155,7 @@ scoped_refptr<TileTask> TileManager::CreateRasterTask(
}
}
- // We can skip the image hijack canvas if we have no images, or no images to
- // skip during raster.
- playback_settings.use_image_hijack_canvas =
- !sync_decoded_images.empty() || !playback_settings.images_to_skip.empty();
-
- bool has_checker_images = !playback_settings.images_to_skip.empty();
+ const bool has_checker_images = !images_to_skip.empty();
tile->set_raster_task_scheduled_with_checker_images(has_checker_images);
if (has_checker_images)
num_of_tiles_with_checker_images_++;
@@ -1152,11 +1170,19 @@ scoped_refptr<TileTask> TileManager::CreateRasterTask(
std::unique_ptr<RasterBuffer> raster_buffer =
raster_buffer_provider_->AcquireBufferForRaster(
resource, resource_content_id, tile->invalidated_id());
+
+ base::Optional<PlaybackImageProvider> image_provider;
+ const bool has_predecoded_images = !sync_decoded_images.empty();
+ if (skip_images || has_checker_images || has_predecoded_images) {
+ image_provider.emplace(skip_images, std::move(images_to_skip),
+ image_controller_.cache(), color_space);
+ }
+
return make_scoped_refptr(new RasterTaskImpl(
this, tile, resource, prioritized_tile.raster_source(), playback_settings,
prioritized_tile.priority().resolution, invalidated_rect,
prepare_tiles_count_, std::move(raster_buffer), &decode_tasks,
- use_gpu_rasterization_));
+ use_gpu_rasterization_, std::move(image_provider)));
}
void TileManager::ResetSignalsForTesting() {
@@ -1189,13 +1215,13 @@ void TileManager::OnRasterTaskCompleted(
scheduled_draw_images_.erase(images_it);
if (was_canceled) {
- ++flush_stats_.canceled_count;
+ ++raster_task_completion_stats_.canceled_count;
resource_pool_->ReleaseResource(resource);
return;
}
resource_pool_->OnContentReplaced(resource->id(), tile_id);
- ++flush_stats_.completed_count;
+ ++raster_task_completion_stats_.completed_count;
if (!tile) {
resource_pool_->ReleaseResource(resource);
@@ -1292,7 +1318,7 @@ void TileManager::CheckAndIssueSignals() {
tile_task_manager_->CheckForCompletedTasks();
did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
- CheckPendingGpuWorkTiles(false /* issue_signals */);
+ CheckPendingGpuWorkTiles(false /* issue_signals */, true /* flush */);
// Ready to activate.
if (signals_.ready_to_activate && !signals_.did_notify_ready_to_activate) {
@@ -1443,8 +1469,12 @@ void TileManager::ClearCheckerImageTracking(
checker_image_tracker_.ClearTracker(can_clear_decode_policy_tracking);
}
+void TileManager::SetCheckerImagingForceDisabled(bool force_disable) {
+ checker_image_tracker_.set_force_disabled(force_disable);
+}
+
void TileManager::NeedsInvalidationForCheckerImagedTiles() {
- client_->RequestImplSideInvalidation();
+ client_->RequestImplSideInvalidationForCheckerImagedTiles();
}
viz::ResourceFormat TileManager::DetermineResourceFormat(
@@ -1474,12 +1504,15 @@ bool TileManager::UsePartialRaster() const {
raster_buffer_provider_->CanPartialRasterIntoProvidedResource();
}
-void TileManager::CheckPendingGpuWorkTiles(bool issue_signals) {
+void TileManager::CheckPendingGpuWorkTiles(bool issue_signals, bool flush) {
TRACE_EVENT2("cc", "TileManager::CheckPendingGpuWorkTiles",
"pending_gpu_work_tiles", pending_gpu_work_tiles_.size(),
"tree_priority",
TreePriorityToString(global_state_.tree_priority));
+ if (flush)
+ raster_buffer_provider_->Flush();
+
ResourceProvider::ResourceIdArray required_for_activation_ids;
ResourceProvider::ResourceIdArray required_for_draw_ids;
@@ -1518,7 +1551,7 @@ void TileManager::CheckPendingGpuWorkTiles(bool issue_signals) {
required_for_activation_ids,
base::Bind(&TileManager::CheckPendingGpuWorkTiles,
ready_to_draw_callback_weak_ptr_factory_.GetWeakPtr(),
- true /* issue_signals */),
+ true /* issue_signals */, false /* flush */),
pending_required_for_activation_callback_id_);
}
@@ -1529,7 +1562,7 @@ void TileManager::CheckPendingGpuWorkTiles(bool issue_signals) {
required_for_draw_ids,
base::Bind(&TileManager::CheckPendingGpuWorkTiles,
ready_to_draw_callback_weak_ptr_factory_.GetWeakPtr(),
- true /* issue_signals */),
+ true /* issue_signals */, false /* flush */),
pending_required_for_draw_callback_id_);
}
@@ -1556,7 +1589,7 @@ scoped_refptr<TileTask> TileManager::CreateTaskSetFinishedTask(
std::unique_ptr<base::trace_event::ConvertableToTraceFormat>
TileManager::ActivationStateAsValue() {
- auto state = base::MakeUnique<base::trace_event::TracedValue>();
+ auto state = std::make_unique<base::trace_event::TracedValue>();
ActivationStateAsValueInto(state.get());
return std::move(state);
}