Index: cc/tiles/tile_manager.cc |
diff --git a/cc/tiles/tile_manager.cc b/cc/tiles/tile_manager.cc |
index 58fc640d8ddabec0022996ae04e2099c2d801543..51daea1f4d80dbd83744c95ad945bc4a078ec306 100644 |
--- a/cc/tiles/tile_manager.cc |
+++ b/cc/tiles/tile_manager.cc |
@@ -43,7 +43,8 @@ DEFINE_SCOPED_UMA_HISTOGRAM_AREA_TIMER( |
class RasterTaskImpl : public TileTask { |
public: |
- RasterTaskImpl(const Resource* resource, |
+ RasterTaskImpl(TileManager* tile_manager, |
+ Resource* resource, |
scoped_refptr<RasterSource> raster_source, |
const gfx::Rect& content_rect, |
const gfx::Rect& invalid_content_rect, |
@@ -52,15 +53,16 @@ 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), |
+ tile_manager_(tile_manager), |
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 { |
@@ -98,21 +100,17 @@ class RasterTaskImpl : public TileTask { |
} |
// 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()); |
+ void OnTaskCompleted() override { |
+ tile_manager_->OnRasterTaskCompleted(std::move(raster_buffer_), tile_, |
+ resource_, state().IsCanceled()); |
} |
protected: |
~RasterTaskImpl() override { DCHECK(!raster_buffer_); } |
private: |
- const Resource* resource_; |
+ TileManager* tile_manager_; |
+ Resource* resource_; |
scoped_refptr<RasterSource> raster_source_; |
gfx::Rect content_rect_; |
gfx::Rect invalid_content_rect_; |
@@ -121,12 +119,11 @@ 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_; |
DISALLOW_COPY_AND_ASSIGN(RasterTaskImpl); |
@@ -188,7 +185,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().IsFinished()) { |
InsertNodeForDecodeTask(graph, dependency, use_foreground_category, |
priority); |
graph->edges.push_back(TaskGraph::Edge(dependency, task)); |
@@ -213,7 +210,7 @@ void InsertNodesForRasterTask(TaskGraph* graph, |
TileTask* decode_task = it->get(); |
// Skip if already decoded. |
- if (decode_task->HasCompleted()) |
+ if (decode_task->state().IsFinished()) |
continue; |
dependencies++; |
@@ -266,9 +263,7 @@ class TaskSetFinishedTaskImpl : public TileTask { |
TaskSetFinished(); |
} |
- // Overridden from TileTask: |
- void ScheduleOnOriginThread(RasterBufferProvider* provider) override {} |
- void CompleteOnOriginThread(RasterBufferProvider* provider) override {} |
+ void OnTaskCompleted() override{}; |
protected: |
~TaskSetFinishedTaskImpl() override {} |
@@ -508,7 +503,6 @@ void TileManager::Flush() { |
} |
tile_task_manager_->CheckForCompletedTasks(); |
- |
did_check_for_completed_tasks_since_last_schedule_tasks_ = true; |
TRACE_EVENT_INSTANT1("cc", "DidFlush", TRACE_EVENT_SCOPE_THREAD, "stats", |
@@ -795,7 +789,8 @@ void TileManager::ScheduleTasks( |
tile->raster_task_ = CreateRasterTask(prioritized_tile); |
TileTask* task = tile->raster_task_.get(); |
- DCHECK(!task->HasCompleted()); |
+ // TODO(prashant.n): Check this more. crbug.com/599863. |
+ // DCHECK(!task->state().IsFinished()); |
ericrk
2016/05/19 23:04:08
Does this mean that this check was failing without
prashant.n
2016/05/20 01:57:17
Yes.
Should
|
if (tile->required_for_activation()) { |
required_for_activate_count++; |
@@ -915,25 +910,28 @@ scoped_refptr<TileTask> TileManager::CreateRasterTask( |
} |
bool supports_concurrent_execution = !use_gpu_rasterization_; |
+ std::unique_ptr<RasterBuffer> raster_buffer = |
ericrk
2016/05/19 23:04:08
vmpstr@ - I remember there being talk of allocatin
prashant.n
2016/05/20 01:57:17
Then it could have been lot simpler, as acquire an
|
+ 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(), |
+ this, 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, |
+ std::unique_ptr<RasterBuffer> raster_buffer, |
+ Tile* tile, |
Resource* resource, |
bool was_canceled) { |
- DCHECK(tiles_.find(tile_id) != tiles_.end()); |
+ DCHECK(tile); |
+ DCHECK(tiles_.find(tile->id()) != tiles_.end()); |
+ tile_task_manager_->GetRasterBufferProvider()->ReleaseBufferForRaster( |
+ std::move(raster_buffer)); |
- Tile* tile = tiles_[tile_id]; |
TileDrawInfo& draw_info = tile->draw_info(); |
DCHECK(tile->raster_task_.get()); |
orphan_tasks_.push_back(tile->raster_task_); |