Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2915)

Unified Diff: cc/tiles/tile_manager.cc

Issue 1866043006: cc: Remove ScheduleOnOriginThread() and CompleteOnOriginThread(). (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: nits Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: cc/tiles/tile_manager.cc
diff --git a/cc/tiles/tile_manager.cc b/cc/tiles/tile_manager.cc
index 58fc640d8ddabec0022996ae04e2099c2d801543..e757f11d230ab5726c7c75fc219b0672ff7c608d 100644
--- a/cc/tiles/tile_manager.cc
+++ b/cc/tiles/tile_manager.cc
@@ -43,7 +43,7 @@ DEFINE_SCOPED_UMA_HISTOGRAM_AREA_TIMER(
class RasterTaskImpl : public TileTask {
public:
- RasterTaskImpl(const Resource* resource,
+ RasterTaskImpl(Resource* resource,
scoped_refptr<RasterSource> raster_source,
const gfx::Rect& content_rect,
const gfx::Rect& invalid_content_rect,
@@ -52,15 +52,17 @@ class RasterTaskImpl : public TileTask {
TileResolution tile_resolution,
int layer_id,
uint64_t source_prepare_tiles_id,
- const void* tile,
+ Tile* tile,
uint64_t new_content_id,
uint64_t previous_content_id,
uint64_t resource_content_id,
int source_frame_number,
- const base::Callback<void(bool)>& reply,
+ std::unique_ptr<RasterBuffer> raster_buffer,
TileTask::Vector* dependencies,
bool supports_concurrent_execution)
- : TileTask(supports_concurrent_execution, dependencies),
+ : TileTask(TileTask::Type::RASTER,
+ supports_concurrent_execution,
+ dependencies),
resource_(resource),
raster_source_(std::move(raster_source)),
content_rect_(content_rect),
@@ -75,7 +77,7 @@ class RasterTaskImpl : public TileTask {
previous_content_id_(previous_content_id),
resource_content_id_(resource_content_id),
source_frame_number_(source_frame_number),
- reply_(reply) {}
+ raster_buffer_(std::move(raster_buffer)) {}
// Overridden from Task:
void RunOnWorkerThread() override {
@@ -97,22 +99,13 @@ class RasterTaskImpl : public TileTask {
contents_scale_, playback_settings_);
}
- // Overridden from TileTask:
- void ScheduleOnOriginThread(RasterBufferProvider* provider) override {
- DCHECK(!raster_buffer_);
- raster_buffer_ = provider->AcquireBufferForRaster(
- resource_, resource_content_id_, previous_content_id_);
- }
- void CompleteOnOriginThread(RasterBufferProvider* provider) override {
- provider->ReleaseBufferForRaster(std::move(raster_buffer_));
- reply_.Run(!state().IsFinished());
- }
-
protected:
~RasterTaskImpl() override { DCHECK(!raster_buffer_); }
- private:
- const Resource* resource_;
+ // TODO(prashant.n) Move this class from unnamed namespace to
+ // tile_task_manager.cc and use friend class. crbug.com/599863.
+ public:
+ Resource* resource_;
scoped_refptr<RasterSource> raster_source_;
gfx::Rect content_rect_;
gfx::Rect invalid_content_rect_;
@@ -121,14 +114,14 @@ class RasterTaskImpl : public TileTask {
TileResolution tile_resolution_;
int layer_id_;
uint64_t source_prepare_tiles_id_;
- const void* tile_;
+ Tile* tile_;
uint64_t new_content_id_;
uint64_t previous_content_id_;
uint64_t resource_content_id_;
int source_frame_number_;
- const base::Callback<void(bool)> reply_;
std::unique_ptr<RasterBuffer> raster_buffer_;
+ private:
DISALLOW_COPY_AND_ASSIGN(RasterTaskImpl);
};
@@ -188,7 +181,7 @@ void InsertNodeForDecodeTask(TaskGraph* graph,
if (task->dependencies().size()) {
DCHECK_EQ(task->dependencies().size(), 1u);
auto* dependency = task->dependencies()[0].get();
- if (!dependency->HasCompleted()) {
+ if (!dependency->state().IsCompleted()) {
InsertNodeForDecodeTask(graph, dependency, use_foreground_category,
priority);
graph->edges.push_back(TaskGraph::Edge(dependency, task));
@@ -213,7 +206,7 @@ void InsertNodesForRasterTask(TaskGraph* graph,
TileTask* decode_task = it->get();
// Skip if already decoded.
- if (decode_task->HasCompleted())
+ if (decode_task->state().IsCompleted())
continue;
dependencies++;
@@ -256,7 +249,7 @@ class TaskSetFinishedTaskImpl : public TileTask {
explicit TaskSetFinishedTaskImpl(
base::SequencedTaskRunner* task_runner,
const base::Closure& on_task_set_finished_callback)
- : TileTask(true),
+ : TileTask(TileTask::Type::DEFAULT, true),
task_runner_(task_runner),
on_task_set_finished_callback_(on_task_set_finished_callback) {}
@@ -266,10 +259,6 @@ class TaskSetFinishedTaskImpl : public TileTask {
TaskSetFinished();
}
- // Overridden from TileTask:
- void ScheduleOnOriginThread(RasterBufferProvider* provider) override {}
- void CompleteOnOriginThread(RasterBufferProvider* provider) override {}
-
protected:
~TaskSetFinishedTaskImpl() override {}
@@ -357,7 +346,7 @@ void TileManager::FinishTasksAndCleanUp() {
// |orphan_tasks_|.
orphan_tasks_.clear();
- tile_task_manager_->CheckForCompletedTasks();
+ CheckForCompletedTasks();
FreeResourcesForReleasedTiles();
CleanUpReleasedTiles();
@@ -469,10 +458,8 @@ bool TileManager::PrepareTiles(
// We need to call CheckForCompletedTasks() once in-between each call
// to ScheduleTasks() to prevent canceled tasks from being scheduled.
- if (!did_check_for_completed_tasks_since_last_schedule_tasks_) {
- tile_task_manager_->CheckForCompletedTasks();
- did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
- }
+ if (!did_check_for_completed_tasks_since_last_schedule_tasks_)
+ CheckForCompletedTasks();
FreeResourcesForReleasedTiles();
CleanUpReleasedTiles();
@@ -507,9 +494,7 @@ void TileManager::Flush() {
return;
}
- tile_task_manager_->CheckForCompletedTasks();
-
- did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
+ CheckForCompletedTasks();
TRACE_EVENT_INSTANT1("cc", "DidFlush", TRACE_EVENT_SCOPE_THREAD, "stats",
RasterTaskCompletionStatsAsValue(flush_stats_));
@@ -795,7 +780,7 @@ void TileManager::ScheduleTasks(
tile->raster_task_ = CreateRasterTask(prioritized_tile);
TileTask* task = tile->raster_task_.get();
- DCHECK(!task->HasCompleted());
+ DCHECK(!task->state().IsCompleted());
if (tile->required_for_activation()) {
required_for_activate_count++;
@@ -915,57 +900,88 @@ scoped_refptr<TileTask> TileManager::CreateRasterTask(
}
bool supports_concurrent_execution = !use_gpu_rasterization_;
+ std::unique_ptr<RasterBuffer> raster_buffer =
+ tile_task_manager_->GetRasterBufferProvider()->AcquireBufferForRaster(
+ resource, resource_content_id, tile->invalidated_id());
return make_scoped_refptr(new RasterTaskImpl(
resource, prioritized_tile.raster_source(), tile->content_rect(),
tile->invalidated_content_rect(), tile->contents_scale(),
playback_settings, prioritized_tile.priority().resolution,
- tile->layer_id(), prepare_tiles_count_, static_cast<const void*>(tile),
- tile->id(), tile->invalidated_id(), resource_content_id,
- tile->source_frame_number(),
- base::Bind(&TileManager::OnRasterTaskCompleted, base::Unretained(this),
- tile->id(), resource),
- &decode_tasks, supports_concurrent_execution));
+ tile->layer_id(), prepare_tiles_count_, tile, tile->id(),
+ tile->invalidated_id(), resource_content_id, tile->source_frame_number(),
+ std::move(raster_buffer), &decode_tasks, supports_concurrent_execution));
}
-void TileManager::OnRasterTaskCompleted(
- Tile::Id tile_id,
- Resource* resource,
- bool was_canceled) {
- DCHECK(tiles_.find(tile_id) != tiles_.end());
+void TileManager::CheckForCompletedTasks() {
+ Task::Vector completed_tasks;
+ tile_task_manager_->CollectCompletedTasks(&completed_tasks);
+
+ for (auto task : completed_tasks) {
+ TileTask* tile_task = static_cast<TileTask*>(task.get());
+ switch (tile_task->type()) {
+ case TileTask::Type::RASTER:
+ OnRasterTaskCompleted(tile_task);
+ break;
+ case TileTask::Type::IMAGE_DECODE:
+ image_decode_controller_->OnImageDecodeTaskCompleted(tile_task);
+ break;
+ case TileTask::Type::IMAGE_UPLOAD:
+ image_decode_controller_->OnImageUploadTaskCompleted(tile_task);
+ break;
+ case TileTask::Type::DEFAULT:
+ // Do nothing.
+ break;
+ default:
+ NOTREACHED();
+ }
- Tile* tile = tiles_[tile_id];
- TileDrawInfo& draw_info = tile->draw_info();
- DCHECK(tile->raster_task_.get());
- orphan_tasks_.push_back(tile->raster_task_);
- tile->raster_task_ = nullptr;
+ task->state().DidComplete();
+ }
+
+ completed_tasks.clear();
+ did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
+}
+
+void TileManager::OnRasterTaskCompleted(TileTask* task) {
+ DCHECK(task);
+ RasterTaskImpl* raster_task = static_cast<RasterTaskImpl*>(task);
+ tile_task_manager_->GetRasterBufferProvider()->ReleaseBufferForRaster(
+ std::move(raster_task->raster_buffer_));
+
+ DCHECK(tiles_.find(raster_task->tile_->id()) != tiles_.end());
+ TileDrawInfo& draw_info = raster_task->tile_->draw_info();
+ DCHECK(raster_task->tile_->raster_task_.get());
+ orphan_tasks_.push_back(raster_task->tile_->raster_task_);
+ raster_task->tile_->raster_task_ = nullptr;
// Unref all the images.
- auto images_it = scheduled_draw_images_.find(tile->id());
+ auto images_it = scheduled_draw_images_.find(raster_task->tile_->id());
const std::vector<DrawImage>& images = images_it->second;
for (const auto& image : images)
image_decode_controller_->UnrefImage(image);
scheduled_draw_images_.erase(images_it);
- if (was_canceled) {
+ if (raster_task->state().IsCanceled()) {
++flush_stats_.canceled_count;
// TODO(ericrk): If more partial raster work is done in the future, it may
// be worth returning the resource to the pool with its previous ID (not
// currently tracked). crrev.com/1370333002/#ps40001 has a possible method
// of achieving this.
- resource_pool_->ReleaseResource(resource, 0 /* content_id */);
+ resource_pool_->ReleaseResource(raster_task->resource_, 0 /* content_id */);
return;
}
++flush_stats_.completed_count;
draw_info.set_use_resource();
- draw_info.resource_ = resource;
- draw_info.contents_swizzled_ = DetermineResourceRequiresSwizzle(tile);
+ draw_info.resource_ = raster_task->resource_;
+ draw_info.contents_swizzled_ =
+ DetermineResourceRequiresSwizzle(raster_task->tile_);
DCHECK(draw_info.IsReadyToDraw());
draw_info.set_was_ever_ready_to_draw();
- client_->NotifyTileStateChanged(tile);
+ client_->NotifyTileStateChanged(raster_task->tile_);
}
ScopedTilePtr TileManager::CreateTile(const Tile::CreateInfo& info,
@@ -1028,8 +1044,7 @@ bool TileManager::IsReadyToDraw() const {
void TileManager::CheckAndIssueSignals() {
TRACE_EVENT0("cc", "TileManager::CheckAndIssueSignals");
- tile_task_manager_->CheckForCompletedTasks();
- did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
+ CheckForCompletedTasks();
// Ready to activate.
if (signals_.ready_to_activate && !signals_.did_notify_ready_to_activate) {
@@ -1068,8 +1083,7 @@ void TileManager::CheckAndIssueSignals() {
}
void TileManager::CheckIfMoreTilesNeedToBePrepared() {
- tile_task_manager_->CheckForCompletedTasks();
- did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
+ CheckForCompletedTasks();
// When OOM, keep re-assigning memory until we reach a steady state
// where top-priority tiles are initialized.

Powered by Google App Engine
This is Rietveld 408576698