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

Side by Side 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 unified diff | Download patch
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "cc/tiles/tile_manager.h" 5 #include "cc/tiles/tile_manager.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <stdint.h> 8 #include <stdint.h>
9 9
10 #include <algorithm> 10 #include <algorithm>
(...skipping 25 matching lines...) Expand all
36 // a tile is of solid color. 36 // a tile is of solid color.
37 const bool kUseColorEstimator = true; 37 const bool kUseColorEstimator = true;
38 38
39 DEFINE_SCOPED_UMA_HISTOGRAM_AREA_TIMER( 39 DEFINE_SCOPED_UMA_HISTOGRAM_AREA_TIMER(
40 ScopedRasterTaskTimer, 40 ScopedRasterTaskTimer,
41 "Compositing.%s.RasterTask.RasterUs", 41 "Compositing.%s.RasterTask.RasterUs",
42 "Compositing.%s.RasterTask.RasterPixelsPerMs"); 42 "Compositing.%s.RasterTask.RasterPixelsPerMs");
43 43
44 class RasterTaskImpl : public TileTask { 44 class RasterTaskImpl : public TileTask {
45 public: 45 public:
46 RasterTaskImpl(const Resource* resource, 46 RasterTaskImpl(Resource* resource,
47 scoped_refptr<RasterSource> raster_source, 47 scoped_refptr<RasterSource> raster_source,
48 const gfx::Rect& content_rect, 48 const gfx::Rect& content_rect,
49 const gfx::Rect& invalid_content_rect, 49 const gfx::Rect& invalid_content_rect,
50 float contents_scale, 50 float contents_scale,
51 const RasterSource::PlaybackSettings& playback_settings, 51 const RasterSource::PlaybackSettings& playback_settings,
52 TileResolution tile_resolution, 52 TileResolution tile_resolution,
53 int layer_id, 53 int layer_id,
54 uint64_t source_prepare_tiles_id, 54 uint64_t source_prepare_tiles_id,
55 const void* tile, 55 Tile* tile,
56 uint64_t new_content_id, 56 uint64_t new_content_id,
57 uint64_t previous_content_id, 57 uint64_t previous_content_id,
58 uint64_t resource_content_id, 58 uint64_t resource_content_id,
59 int source_frame_number, 59 int source_frame_number,
60 const base::Callback<void(bool)>& reply, 60 std::unique_ptr<RasterBuffer> raster_buffer,
61 TileTask::Vector* dependencies, 61 TileTask::Vector* dependencies,
62 bool supports_concurrent_execution) 62 bool supports_concurrent_execution)
63 : TileTask(supports_concurrent_execution, dependencies), 63 : TileTask(TileTask::Type::RASTER,
64 supports_concurrent_execution,
65 dependencies),
64 resource_(resource), 66 resource_(resource),
65 raster_source_(std::move(raster_source)), 67 raster_source_(std::move(raster_source)),
66 content_rect_(content_rect), 68 content_rect_(content_rect),
67 invalid_content_rect_(invalid_content_rect), 69 invalid_content_rect_(invalid_content_rect),
68 contents_scale_(contents_scale), 70 contents_scale_(contents_scale),
69 playback_settings_(playback_settings), 71 playback_settings_(playback_settings),
70 tile_resolution_(tile_resolution), 72 tile_resolution_(tile_resolution),
71 layer_id_(layer_id), 73 layer_id_(layer_id),
72 source_prepare_tiles_id_(source_prepare_tiles_id), 74 source_prepare_tiles_id_(source_prepare_tiles_id),
73 tile_(tile), 75 tile_(tile),
74 new_content_id_(new_content_id), 76 new_content_id_(new_content_id),
75 previous_content_id_(previous_content_id), 77 previous_content_id_(previous_content_id),
76 resource_content_id_(resource_content_id), 78 resource_content_id_(resource_content_id),
77 source_frame_number_(source_frame_number), 79 source_frame_number_(source_frame_number),
78 reply_(reply) {} 80 raster_buffer_(std::move(raster_buffer)) {}
79 81
80 // Overridden from Task: 82 // Overridden from Task:
81 void RunOnWorkerThread() override { 83 void RunOnWorkerThread() override {
82 TRACE_EVENT1("cc", "RasterizerTaskImpl::RunOnWorkerThread", 84 TRACE_EVENT1("cc", "RasterizerTaskImpl::RunOnWorkerThread",
83 "source_prepare_tiles_id", source_prepare_tiles_id_); 85 "source_prepare_tiles_id", source_prepare_tiles_id_);
84 86
85 DCHECK(raster_source_.get()); 87 DCHECK(raster_source_.get());
86 DCHECK(raster_buffer_); 88 DCHECK(raster_buffer_);
87 89
88 frame_viewer_instrumentation::ScopedRasterTask raster_task( 90 frame_viewer_instrumentation::ScopedRasterTask raster_task(
89 tile_, tile_resolution_, source_frame_number_, layer_id_); 91 tile_, tile_resolution_, source_frame_number_, layer_id_);
90 ScopedRasterTaskTimer timer; 92 ScopedRasterTaskTimer timer;
91 timer.SetArea(content_rect_.size().GetArea()); 93 timer.SetArea(content_rect_.size().GetArea());
92 94
93 DCHECK(raster_source_); 95 DCHECK(raster_source_);
94 96
95 raster_buffer_->Playback(raster_source_.get(), content_rect_, 97 raster_buffer_->Playback(raster_source_.get(), content_rect_,
96 invalid_content_rect_, new_content_id_, 98 invalid_content_rect_, new_content_id_,
97 contents_scale_, playback_settings_); 99 contents_scale_, playback_settings_);
98 } 100 }
99 101
100 // Overridden from TileTask:
101 void ScheduleOnOriginThread(RasterBufferProvider* provider) override {
102 DCHECK(!raster_buffer_);
103 raster_buffer_ = provider->AcquireBufferForRaster(
104 resource_, resource_content_id_, previous_content_id_);
105 }
106 void CompleteOnOriginThread(RasterBufferProvider* provider) override {
107 provider->ReleaseBufferForRaster(std::move(raster_buffer_));
108 reply_.Run(!state().IsFinished());
109 }
110
111 protected: 102 protected:
112 ~RasterTaskImpl() override { DCHECK(!raster_buffer_); } 103 ~RasterTaskImpl() override { DCHECK(!raster_buffer_); }
113 104
114 private: 105 // TODO(prashant.n) Move this class from unnamed namespace to
115 const Resource* resource_; 106 // tile_task_manager.cc and use friend class. crbug.com/599863.
107 public:
108 Resource* resource_;
116 scoped_refptr<RasterSource> raster_source_; 109 scoped_refptr<RasterSource> raster_source_;
117 gfx::Rect content_rect_; 110 gfx::Rect content_rect_;
118 gfx::Rect invalid_content_rect_; 111 gfx::Rect invalid_content_rect_;
119 float contents_scale_; 112 float contents_scale_;
120 RasterSource::PlaybackSettings playback_settings_; 113 RasterSource::PlaybackSettings playback_settings_;
121 TileResolution tile_resolution_; 114 TileResolution tile_resolution_;
122 int layer_id_; 115 int layer_id_;
123 uint64_t source_prepare_tiles_id_; 116 uint64_t source_prepare_tiles_id_;
124 const void* tile_; 117 Tile* tile_;
125 uint64_t new_content_id_; 118 uint64_t new_content_id_;
126 uint64_t previous_content_id_; 119 uint64_t previous_content_id_;
127 uint64_t resource_content_id_; 120 uint64_t resource_content_id_;
128 int source_frame_number_; 121 int source_frame_number_;
129 const base::Callback<void(bool)> reply_;
130 std::unique_ptr<RasterBuffer> raster_buffer_; 122 std::unique_ptr<RasterBuffer> raster_buffer_;
131 123
124 private:
132 DISALLOW_COPY_AND_ASSIGN(RasterTaskImpl); 125 DISALLOW_COPY_AND_ASSIGN(RasterTaskImpl);
133 }; 126 };
134 127
135 TaskCategory TaskCategoryForTileTask(TileTask* task, 128 TaskCategory TaskCategoryForTileTask(TileTask* task,
136 bool use_foreground_category) { 129 bool use_foreground_category) {
137 if (!task->supports_concurrent_execution()) 130 if (!task->supports_concurrent_execution())
138 return TASK_CATEGORY_NONCONCURRENT_FOREGROUND; 131 return TASK_CATEGORY_NONCONCURRENT_FOREGROUND;
139 132
140 if (use_foreground_category) 133 if (use_foreground_category)
141 return TASK_CATEGORY_FOREGROUND; 134 return TASK_CATEGORY_FOREGROUND;
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
181 } 174 }
182 175
183 void InsertNodeForDecodeTask(TaskGraph* graph, 176 void InsertNodeForDecodeTask(TaskGraph* graph,
184 TileTask* task, 177 TileTask* task,
185 bool use_foreground_category, 178 bool use_foreground_category,
186 uint16_t priority) { 179 uint16_t priority) {
187 uint32_t dependency_count = 0u; 180 uint32_t dependency_count = 0u;
188 if (task->dependencies().size()) { 181 if (task->dependencies().size()) {
189 DCHECK_EQ(task->dependencies().size(), 1u); 182 DCHECK_EQ(task->dependencies().size(), 1u);
190 auto* dependency = task->dependencies()[0].get(); 183 auto* dependency = task->dependencies()[0].get();
191 if (!dependency->HasCompleted()) { 184 if (!dependency->state().IsCompleted()) {
192 InsertNodeForDecodeTask(graph, dependency, use_foreground_category, 185 InsertNodeForDecodeTask(graph, dependency, use_foreground_category,
193 priority); 186 priority);
194 graph->edges.push_back(TaskGraph::Edge(dependency, task)); 187 graph->edges.push_back(TaskGraph::Edge(dependency, task));
195 dependency_count = 1u; 188 dependency_count = 1u;
196 } 189 }
197 } 190 }
198 InsertNodeForTask(graph, task, 191 InsertNodeForTask(graph, task,
199 TaskCategoryForTileTask(task, use_foreground_category), 192 TaskCategoryForTileTask(task, use_foreground_category),
200 priority, dependency_count); 193 priority, dependency_count);
201 } 194 }
202 195
203 void InsertNodesForRasterTask(TaskGraph* graph, 196 void InsertNodesForRasterTask(TaskGraph* graph,
204 TileTask* raster_task, 197 TileTask* raster_task,
205 const TileTask::Vector& decode_tasks, 198 const TileTask::Vector& decode_tasks,
206 size_t priority, 199 size_t priority,
207 bool use_foreground_category) { 200 bool use_foreground_category) {
208 size_t dependencies = 0u; 201 size_t dependencies = 0u;
209 202
210 // Insert image decode tasks. 203 // Insert image decode tasks.
211 for (TileTask::Vector::const_iterator it = decode_tasks.begin(); 204 for (TileTask::Vector::const_iterator it = decode_tasks.begin();
212 it != decode_tasks.end(); ++it) { 205 it != decode_tasks.end(); ++it) {
213 TileTask* decode_task = it->get(); 206 TileTask* decode_task = it->get();
214 207
215 // Skip if already decoded. 208 // Skip if already decoded.
216 if (decode_task->HasCompleted()) 209 if (decode_task->state().IsCompleted())
217 continue; 210 continue;
218 211
219 dependencies++; 212 dependencies++;
220 213
221 // Add decode task if it doesn't already exist in graph. 214 // Add decode task if it doesn't already exist in graph.
222 TaskGraph::Node::Vector::iterator decode_it = 215 TaskGraph::Node::Vector::iterator decode_it =
223 std::find_if(graph->nodes.begin(), graph->nodes.end(), 216 std::find_if(graph->nodes.begin(), graph->nodes.end(),
224 [decode_task](const TaskGraph::Node& node) { 217 [decode_task](const TaskGraph::Node& node) {
225 return node.task == decode_task; 218 return node.task == decode_task;
226 }); 219 });
(...skipping 22 matching lines...) Expand all
249 graph, raster_task, 242 graph, raster_task,
250 TaskCategoryForTileTask(raster_task, use_foreground_category), priority, 243 TaskCategoryForTileTask(raster_task, use_foreground_category), priority,
251 dependencies); 244 dependencies);
252 } 245 }
253 246
254 class TaskSetFinishedTaskImpl : public TileTask { 247 class TaskSetFinishedTaskImpl : public TileTask {
255 public: 248 public:
256 explicit TaskSetFinishedTaskImpl( 249 explicit TaskSetFinishedTaskImpl(
257 base::SequencedTaskRunner* task_runner, 250 base::SequencedTaskRunner* task_runner,
258 const base::Closure& on_task_set_finished_callback) 251 const base::Closure& on_task_set_finished_callback)
259 : TileTask(true), 252 : TileTask(TileTask::Type::DEFAULT, true),
260 task_runner_(task_runner), 253 task_runner_(task_runner),
261 on_task_set_finished_callback_(on_task_set_finished_callback) {} 254 on_task_set_finished_callback_(on_task_set_finished_callback) {}
262 255
263 // Overridden from Task: 256 // Overridden from Task:
264 void RunOnWorkerThread() override { 257 void RunOnWorkerThread() override {
265 TRACE_EVENT0("cc", "TaskSetFinishedTaskImpl::RunOnWorkerThread"); 258 TRACE_EVENT0("cc", "TaskSetFinishedTaskImpl::RunOnWorkerThread");
266 TaskSetFinished(); 259 TaskSetFinished();
267 } 260 }
268 261
269 // Overridden from TileTask:
270 void ScheduleOnOriginThread(RasterBufferProvider* provider) override {}
271 void CompleteOnOriginThread(RasterBufferProvider* provider) override {}
272
273 protected: 262 protected:
274 ~TaskSetFinishedTaskImpl() override {} 263 ~TaskSetFinishedTaskImpl() override {}
275 264
276 void TaskSetFinished() { 265 void TaskSetFinished() {
277 task_runner_->PostTask(FROM_HERE, on_task_set_finished_callback_); 266 task_runner_->PostTask(FROM_HERE, on_task_set_finished_callback_);
278 } 267 }
279 268
280 private: 269 private:
281 scoped_refptr<base::SequencedTaskRunner> task_runner_; 270 scoped_refptr<base::SequencedTaskRunner> task_runner_;
282 const base::Closure on_task_set_finished_callback_; 271 const base::Closure on_task_set_finished_callback_;
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
350 global_state_ = GlobalStateThatImpactsTilePriority(); 339 global_state_ = GlobalStateThatImpactsTilePriority();
351 340
352 // This cancels tasks if possible, finishes pending tasks, and release any 341 // This cancels tasks if possible, finishes pending tasks, and release any
353 // uninitialized resources. 342 // uninitialized resources.
354 tile_task_manager_->Shutdown(); 343 tile_task_manager_->Shutdown();
355 344
356 // Now that all tasks have been finished, we can clear any 345 // Now that all tasks have been finished, we can clear any
357 // |orphan_tasks_|. 346 // |orphan_tasks_|.
358 orphan_tasks_.clear(); 347 orphan_tasks_.clear();
359 348
360 tile_task_manager_->CheckForCompletedTasks(); 349 CheckForCompletedTasks();
361 350
362 FreeResourcesForReleasedTiles(); 351 FreeResourcesForReleasedTiles();
363 CleanUpReleasedTiles(); 352 CleanUpReleasedTiles();
364 353
365 tile_task_manager_ = nullptr; 354 tile_task_manager_ = nullptr;
366 resource_pool_ = nullptr; 355 resource_pool_ = nullptr;
367 more_tiles_need_prepare_check_notifier_.Cancel(); 356 more_tiles_need_prepare_check_notifier_.Cancel();
368 signals_check_notifier_.Cancel(); 357 signals_check_notifier_.Cancel();
369 task_set_finished_weak_ptr_factory_.InvalidateWeakPtrs(); 358 task_set_finished_weak_ptr_factory_.InvalidateWeakPtrs();
370 } 359 }
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
462 TRACE_EVENT_INSTANT0("cc", "PrepareTiles aborted", 451 TRACE_EVENT_INSTANT0("cc", "PrepareTiles aborted",
463 TRACE_EVENT_SCOPE_THREAD); 452 TRACE_EVENT_SCOPE_THREAD);
464 return false; 453 return false;
465 } 454 }
466 455
467 signals_.reset(); 456 signals_.reset();
468 global_state_ = state; 457 global_state_ = state;
469 458
470 // We need to call CheckForCompletedTasks() once in-between each call 459 // We need to call CheckForCompletedTasks() once in-between each call
471 // to ScheduleTasks() to prevent canceled tasks from being scheduled. 460 // to ScheduleTasks() to prevent canceled tasks from being scheduled.
472 if (!did_check_for_completed_tasks_since_last_schedule_tasks_) { 461 if (!did_check_for_completed_tasks_since_last_schedule_tasks_)
473 tile_task_manager_->CheckForCompletedTasks(); 462 CheckForCompletedTasks();
474 did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
475 }
476 463
477 FreeResourcesForReleasedTiles(); 464 FreeResourcesForReleasedTiles();
478 CleanUpReleasedTiles(); 465 CleanUpReleasedTiles();
479 466
480 PrioritizedTileVector tiles_that_need_to_be_rasterized; 467 PrioritizedTileVector tiles_that_need_to_be_rasterized;
481 std::unique_ptr<RasterTilePriorityQueue> raster_priority_queue( 468 std::unique_ptr<RasterTilePriorityQueue> raster_priority_queue(
482 client_->BuildRasterQueue(global_state_.tree_priority, 469 client_->BuildRasterQueue(global_state_.tree_priority,
483 RasterTilePriorityQueue::Type::ALL)); 470 RasterTilePriorityQueue::Type::ALL));
484 AssignGpuMemoryToTiles(raster_priority_queue.get(), 471 AssignGpuMemoryToTiles(raster_priority_queue.get(),
485 scheduled_raster_task_limit_, 472 scheduled_raster_task_limit_,
(...skipping 14 matching lines...) Expand all
500 } 487 }
501 488
502 void TileManager::Flush() { 489 void TileManager::Flush() {
503 TRACE_EVENT0("cc", "TileManager::Flush"); 490 TRACE_EVENT0("cc", "TileManager::Flush");
504 491
505 if (!tile_task_manager_) { 492 if (!tile_task_manager_) {
506 TRACE_EVENT_INSTANT0("cc", "Flush aborted", TRACE_EVENT_SCOPE_THREAD); 493 TRACE_EVENT_INSTANT0("cc", "Flush aborted", TRACE_EVENT_SCOPE_THREAD);
507 return; 494 return;
508 } 495 }
509 496
510 tile_task_manager_->CheckForCompletedTasks(); 497 CheckForCompletedTasks();
511
512 did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
513 498
514 TRACE_EVENT_INSTANT1("cc", "DidFlush", TRACE_EVENT_SCOPE_THREAD, "stats", 499 TRACE_EVENT_INSTANT1("cc", "DidFlush", TRACE_EVENT_SCOPE_THREAD, "stats",
515 RasterTaskCompletionStatsAsValue(flush_stats_)); 500 RasterTaskCompletionStatsAsValue(flush_stats_));
516 flush_stats_ = RasterTaskCompletionStats(); 501 flush_stats_ = RasterTaskCompletionStats();
517 } 502 }
518 503
519 std::unique_ptr<base::trace_event::ConvertableToTraceFormat> 504 std::unique_ptr<base::trace_event::ConvertableToTraceFormat>
520 TileManager::BasicStateAsValue() const { 505 TileManager::BasicStateAsValue() const {
521 std::unique_ptr<base::trace_event::TracedValue> value( 506 std::unique_ptr<base::trace_event::TracedValue> value(
522 new base::trace_event::TracedValue()); 507 new base::trace_event::TracedValue());
(...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after
788 for (auto& prioritized_tile : tiles_that_need_to_be_rasterized) { 773 for (auto& prioritized_tile : tiles_that_need_to_be_rasterized) {
789 Tile* tile = prioritized_tile.tile(); 774 Tile* tile = prioritized_tile.tile();
790 775
791 DCHECK(tile->draw_info().requires_resource()); 776 DCHECK(tile->draw_info().requires_resource());
792 DCHECK(!tile->draw_info().resource_); 777 DCHECK(!tile->draw_info().resource_);
793 778
794 if (!tile->raster_task_) 779 if (!tile->raster_task_)
795 tile->raster_task_ = CreateRasterTask(prioritized_tile); 780 tile->raster_task_ = CreateRasterTask(prioritized_tile);
796 781
797 TileTask* task = tile->raster_task_.get(); 782 TileTask* task = tile->raster_task_.get();
798 DCHECK(!task->HasCompleted()); 783 DCHECK(!task->state().IsCompleted());
799 784
800 if (tile->required_for_activation()) { 785 if (tile->required_for_activation()) {
801 required_for_activate_count++; 786 required_for_activate_count++;
802 graph_.edges.push_back( 787 graph_.edges.push_back(
803 TaskGraph::Edge(task, required_for_activation_done_task.get())); 788 TaskGraph::Edge(task, required_for_activation_done_task.get()));
804 } 789 }
805 if (tile->required_for_draw()) { 790 if (tile->required_for_draw()) {
806 required_for_draw_count++; 791 required_for_draw_count++;
807 graph_.edges.push_back( 792 graph_.edges.push_back(
808 TaskGraph::Edge(task, required_for_draw_done_task.get())); 793 TaskGraph::Edge(task, required_for_draw_done_task.get()));
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
908 if (task) 893 if (task)
909 decode_tasks.push_back(task); 894 decode_tasks.push_back(task);
910 895
911 if (need_to_unref_when_finished) 896 if (need_to_unref_when_finished)
912 ++it; 897 ++it;
913 else 898 else
914 it = images.erase(it); 899 it = images.erase(it);
915 } 900 }
916 901
917 bool supports_concurrent_execution = !use_gpu_rasterization_; 902 bool supports_concurrent_execution = !use_gpu_rasterization_;
903 std::unique_ptr<RasterBuffer> raster_buffer =
904 tile_task_manager_->GetRasterBufferProvider()->AcquireBufferForRaster(
905 resource, resource_content_id, tile->invalidated_id());
918 return make_scoped_refptr(new RasterTaskImpl( 906 return make_scoped_refptr(new RasterTaskImpl(
919 resource, prioritized_tile.raster_source(), tile->content_rect(), 907 resource, prioritized_tile.raster_source(), tile->content_rect(),
920 tile->invalidated_content_rect(), tile->contents_scale(), 908 tile->invalidated_content_rect(), tile->contents_scale(),
921 playback_settings, prioritized_tile.priority().resolution, 909 playback_settings, prioritized_tile.priority().resolution,
922 tile->layer_id(), prepare_tiles_count_, static_cast<const void*>(tile), 910 tile->layer_id(), prepare_tiles_count_, tile, tile->id(),
923 tile->id(), tile->invalidated_id(), resource_content_id, 911 tile->invalidated_id(), resource_content_id, tile->source_frame_number(),
924 tile->source_frame_number(), 912 std::move(raster_buffer), &decode_tasks, supports_concurrent_execution));
925 base::Bind(&TileManager::OnRasterTaskCompleted, base::Unretained(this),
926 tile->id(), resource),
927 &decode_tasks, supports_concurrent_execution));
928 } 913 }
929 914
930 void TileManager::OnRasterTaskCompleted( 915 void TileManager::CheckForCompletedTasks() {
931 Tile::Id tile_id, 916 Task::Vector completed_tasks;
932 Resource* resource, 917 tile_task_manager_->CollectCompletedTasks(&completed_tasks);
933 bool was_canceled) {
934 DCHECK(tiles_.find(tile_id) != tiles_.end());
935 918
936 Tile* tile = tiles_[tile_id]; 919 for (auto task : completed_tasks) {
937 TileDrawInfo& draw_info = tile->draw_info(); 920 TileTask* tile_task = static_cast<TileTask*>(task.get());
938 DCHECK(tile->raster_task_.get()); 921 switch (tile_task->type()) {
939 orphan_tasks_.push_back(tile->raster_task_); 922 case TileTask::Type::RASTER:
940 tile->raster_task_ = nullptr; 923 OnRasterTaskCompleted(tile_task);
924 break;
925 case TileTask::Type::IMAGE_DECODE:
926 image_decode_controller_->OnImageDecodeTaskCompleted(tile_task);
927 break;
928 case TileTask::Type::IMAGE_UPLOAD:
929 image_decode_controller_->OnImageUploadTaskCompleted(tile_task);
930 break;
931 case TileTask::Type::DEFAULT:
932 // Do nothing.
933 break;
934 default:
935 NOTREACHED();
936 }
937
938 task->state().DidComplete();
939 }
940
941 completed_tasks.clear();
942 did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
943 }
944
945 void TileManager::OnRasterTaskCompleted(TileTask* task) {
946 DCHECK(task);
947 RasterTaskImpl* raster_task = static_cast<RasterTaskImpl*>(task);
948 tile_task_manager_->GetRasterBufferProvider()->ReleaseBufferForRaster(
949 std::move(raster_task->raster_buffer_));
950
951 DCHECK(tiles_.find(raster_task->tile_->id()) != tiles_.end());
952 TileDrawInfo& draw_info = raster_task->tile_->draw_info();
953 DCHECK(raster_task->tile_->raster_task_.get());
954 orphan_tasks_.push_back(raster_task->tile_->raster_task_);
955 raster_task->tile_->raster_task_ = nullptr;
941 956
942 // Unref all the images. 957 // Unref all the images.
943 auto images_it = scheduled_draw_images_.find(tile->id()); 958 auto images_it = scheduled_draw_images_.find(raster_task->tile_->id());
944 const std::vector<DrawImage>& images = images_it->second; 959 const std::vector<DrawImage>& images = images_it->second;
945 for (const auto& image : images) 960 for (const auto& image : images)
946 image_decode_controller_->UnrefImage(image); 961 image_decode_controller_->UnrefImage(image);
947 scheduled_draw_images_.erase(images_it); 962 scheduled_draw_images_.erase(images_it);
948 963
949 if (was_canceled) { 964 if (raster_task->state().IsCanceled()) {
950 ++flush_stats_.canceled_count; 965 ++flush_stats_.canceled_count;
951 // TODO(ericrk): If more partial raster work is done in the future, it may 966 // TODO(ericrk): If more partial raster work is done in the future, it may
952 // be worth returning the resource to the pool with its previous ID (not 967 // be worth returning the resource to the pool with its previous ID (not
953 // currently tracked). crrev.com/1370333002/#ps40001 has a possible method 968 // currently tracked). crrev.com/1370333002/#ps40001 has a possible method
954 // of achieving this. 969 // of achieving this.
955 resource_pool_->ReleaseResource(resource, 0 /* content_id */); 970 resource_pool_->ReleaseResource(raster_task->resource_, 0 /* content_id */);
956 return; 971 return;
957 } 972 }
958 973
959 ++flush_stats_.completed_count; 974 ++flush_stats_.completed_count;
960 975
961 draw_info.set_use_resource(); 976 draw_info.set_use_resource();
962 draw_info.resource_ = resource; 977 draw_info.resource_ = raster_task->resource_;
963 draw_info.contents_swizzled_ = DetermineResourceRequiresSwizzle(tile); 978 draw_info.contents_swizzled_ =
979 DetermineResourceRequiresSwizzle(raster_task->tile_);
964 980
965 DCHECK(draw_info.IsReadyToDraw()); 981 DCHECK(draw_info.IsReadyToDraw());
966 draw_info.set_was_ever_ready_to_draw(); 982 draw_info.set_was_ever_ready_to_draw();
967 983
968 client_->NotifyTileStateChanged(tile); 984 client_->NotifyTileStateChanged(raster_task->tile_);
969 } 985 }
970 986
971 ScopedTilePtr TileManager::CreateTile(const Tile::CreateInfo& info, 987 ScopedTilePtr TileManager::CreateTile(const Tile::CreateInfo& info,
972 int layer_id, 988 int layer_id,
973 int source_frame_number, 989 int source_frame_number,
974 int flags) { 990 int flags) {
975 // We need to have a tile task worker pool to do anything meaningful with 991 // We need to have a tile task worker pool to do anything meaningful with
976 // tiles. 992 // tiles.
977 DCHECK(tile_task_manager_); 993 DCHECK(tile_task_manager_);
978 ScopedTilePtr tile( 994 ScopedTilePtr tile(
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
1021 } 1037 }
1022 1038
1023 bool TileManager::IsReadyToDraw() const { 1039 bool TileManager::IsReadyToDraw() const {
1024 TRACE_EVENT0("cc", "TileManager::IsReadyToDraw"); 1040 TRACE_EVENT0("cc", "TileManager::IsReadyToDraw");
1025 return AreRequiredTilesReadyToDraw( 1041 return AreRequiredTilesReadyToDraw(
1026 RasterTilePriorityQueue::Type::REQUIRED_FOR_DRAW); 1042 RasterTilePriorityQueue::Type::REQUIRED_FOR_DRAW);
1027 } 1043 }
1028 1044
1029 void TileManager::CheckAndIssueSignals() { 1045 void TileManager::CheckAndIssueSignals() {
1030 TRACE_EVENT0("cc", "TileManager::CheckAndIssueSignals"); 1046 TRACE_EVENT0("cc", "TileManager::CheckAndIssueSignals");
1031 tile_task_manager_->CheckForCompletedTasks(); 1047 CheckForCompletedTasks();
1032 did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
1033 1048
1034 // Ready to activate. 1049 // Ready to activate.
1035 if (signals_.ready_to_activate && !signals_.did_notify_ready_to_activate) { 1050 if (signals_.ready_to_activate && !signals_.did_notify_ready_to_activate) {
1036 signals_.ready_to_activate = false; 1051 signals_.ready_to_activate = false;
1037 if (IsReadyToActivate()) { 1052 if (IsReadyToActivate()) {
1038 TRACE_EVENT0("disabled-by-default-cc.debug", 1053 TRACE_EVENT0("disabled-by-default-cc.debug",
1039 "TileManager::CheckAndIssueSignals - ready to activate"); 1054 "TileManager::CheckAndIssueSignals - ready to activate");
1040 signals_.did_notify_ready_to_activate = true; 1055 signals_.did_notify_ready_to_activate = true;
1041 client_->NotifyReadyToActivate(); 1056 client_->NotifyReadyToActivate();
1042 } 1057 }
(...skipping 18 matching lines...) Expand all
1061 TRACE_EVENT0( 1076 TRACE_EVENT0(
1062 "disabled-by-default-cc.debug", 1077 "disabled-by-default-cc.debug",
1063 "TileManager::CheckAndIssueSignals - all tile tasks completed"); 1078 "TileManager::CheckAndIssueSignals - all tile tasks completed");
1064 signals_.did_notify_all_tile_tasks_completed = true; 1079 signals_.did_notify_all_tile_tasks_completed = true;
1065 client_->NotifyAllTileTasksCompleted(); 1080 client_->NotifyAllTileTasksCompleted();
1066 } 1081 }
1067 } 1082 }
1068 } 1083 }
1069 1084
1070 void TileManager::CheckIfMoreTilesNeedToBePrepared() { 1085 void TileManager::CheckIfMoreTilesNeedToBePrepared() {
1071 tile_task_manager_->CheckForCompletedTasks(); 1086 CheckForCompletedTasks();
1072 did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
1073 1087
1074 // When OOM, keep re-assigning memory until we reach a steady state 1088 // When OOM, keep re-assigning memory until we reach a steady state
1075 // where top-priority tiles are initialized. 1089 // where top-priority tiles are initialized.
1076 PrioritizedTileVector tiles_that_need_to_be_rasterized; 1090 PrioritizedTileVector tiles_that_need_to_be_rasterized;
1077 std::unique_ptr<RasterTilePriorityQueue> raster_priority_queue( 1091 std::unique_ptr<RasterTilePriorityQueue> raster_priority_queue(
1078 client_->BuildRasterQueue(global_state_.tree_priority, 1092 client_->BuildRasterQueue(global_state_.tree_priority,
1079 RasterTilePriorityQueue::Type::ALL)); 1093 RasterTilePriorityQueue::Type::ALL));
1080 AssignGpuMemoryToTiles(raster_priority_queue.get(), 1094 AssignGpuMemoryToTiles(raster_priority_queue.get(),
1081 scheduled_raster_task_limit_, 1095 scheduled_raster_task_limit_,
1082 &tiles_that_need_to_be_rasterized); 1096 &tiles_that_need_to_be_rasterized);
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after
1256 void TileManager::Signals::reset() { 1270 void TileManager::Signals::reset() {
1257 ready_to_activate = false; 1271 ready_to_activate = false;
1258 did_notify_ready_to_activate = false; 1272 did_notify_ready_to_activate = false;
1259 ready_to_draw = false; 1273 ready_to_draw = false;
1260 did_notify_ready_to_draw = false; 1274 did_notify_ready_to_draw = false;
1261 all_tile_tasks_completed = false; 1275 all_tile_tasks_completed = false;
1262 did_notify_all_tile_tasks_completed = false; 1276 did_notify_all_tile_tasks_completed = false;
1263 } 1277 }
1264 1278
1265 } // namespace cc 1279 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698