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

Side by Side Diff: cc/resources/tile_manager.cc

Issue 165603002: cc: Move GPU raster to DirectRasterWorkerPool. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: remove rastertaskqueue changes and refactor worker pool delegate Created 6 years, 10 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 | Annotate | Revision Log
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/resources/tile_manager.h" 5 #include "cc/resources/tile_manager.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <limits> 8 #include <limits>
9 #include <string> 9 #include <string>
10 10
11 #include "base/bind.h" 11 #include "base/bind.h"
12 #include "base/json/json_writer.h" 12 #include "base/json/json_writer.h"
13 #include "base/logging.h" 13 #include "base/logging.h"
14 #include "base/metrics/histogram.h" 14 #include "base/metrics/histogram.h"
15 #include "cc/debug/traced_value.h" 15 #include "cc/debug/traced_value.h"
16 #include "cc/resources/direct_raster_worker_pool.h"
16 #include "cc/resources/image_raster_worker_pool.h" 17 #include "cc/resources/image_raster_worker_pool.h"
17 #include "cc/resources/pixel_buffer_raster_worker_pool.h" 18 #include "cc/resources/pixel_buffer_raster_worker_pool.h"
19 #include "cc/resources/raster_worker_pool_delegate.h"
18 #include "cc/resources/tile.h" 20 #include "cc/resources/tile.h"
19 #include "third_party/skia/include/core/SkCanvas.h"
20 #include "ui/gfx/rect_conversions.h" 21 #include "ui/gfx/rect_conversions.h"
21 22
22 namespace cc { 23 namespace cc {
23
24 namespace { 24 namespace {
25 25
26 // Memory limit policy works by mapping some bin states to the NEVER bin. 26 // Memory limit policy works by mapping some bin states to the NEVER bin.
27 const ManagedTileBin kBinPolicyMap[NUM_TILE_MEMORY_LIMIT_POLICIES][NUM_BINS] = { 27 const ManagedTileBin kBinPolicyMap[NUM_TILE_MEMORY_LIMIT_POLICIES][NUM_BINS] = {
28 // [ALLOW_NOTHING] 28 // [ALLOW_NOTHING]
29 {NEVER_BIN, // [NOW_AND_READY_TO_DRAW_BIN] 29 {NEVER_BIN, // [NOW_AND_READY_TO_DRAW_BIN]
30 NEVER_BIN, // [NOW_BIN] 30 NEVER_BIN, // [NOW_BIN]
31 NEVER_BIN, // [SOON_BIN] 31 NEVER_BIN, // [SOON_BIN]
32 NEVER_BIN, // [EVENTUALLY_AND_ACTIVE_BIN] 32 NEVER_BIN, // [EVENTUALLY_AND_ACTIVE_BIN]
33 NEVER_BIN, // [EVENTUALLY_BIN] 33 NEVER_BIN, // [EVENTUALLY_BIN]
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
150 ContextProvider* context_provider, 150 ContextProvider* context_provider,
151 RenderingStatsInstrumentation* rendering_stats_instrumentation, 151 RenderingStatsInstrumentation* rendering_stats_instrumentation,
152 bool use_map_image, 152 bool use_map_image,
153 bool use_rasterize_on_demand, 153 bool use_rasterize_on_demand,
154 size_t max_transfer_buffer_usage_bytes, 154 size_t max_transfer_buffer_usage_bytes,
155 size_t max_raster_usage_bytes, 155 size_t max_raster_usage_bytes,
156 unsigned map_image_texture_target) { 156 unsigned map_image_texture_target) {
157 return make_scoped_ptr(new TileManager( 157 return make_scoped_ptr(new TileManager(
158 client, 158 client,
159 resource_provider, 159 resource_provider,
160 use_map_image 160 context_provider,
161 ? ImageRasterWorkerPool::Create( 161 use_map_image ? ImageRasterWorkerPool::Create(resource_provider,
162 resource_provider, context_provider, map_image_texture_target) 162 map_image_texture_target)
163 : PixelBufferRasterWorkerPool::Create( 163 : PixelBufferRasterWorkerPool::Create(
164 resource_provider, 164 resource_provider, max_transfer_buffer_usage_bytes),
165 context_provider, 165 DirectRasterWorkerPool::Create(resource_provider, context_provider),
166 max_transfer_buffer_usage_bytes),
167 max_raster_usage_bytes, 166 max_raster_usage_bytes,
168 rendering_stats_instrumentation, 167 rendering_stats_instrumentation,
169 use_rasterize_on_demand)); 168 use_rasterize_on_demand));
170 } 169 }
171 170
172 TileManager::TileManager( 171 TileManager::TileManager(
173 TileManagerClient* client, 172 TileManagerClient* client,
174 ResourceProvider* resource_provider, 173 ResourceProvider* resource_provider,
174 ContextProvider* context_provider,
175 scoped_ptr<RasterWorkerPool> raster_worker_pool, 175 scoped_ptr<RasterWorkerPool> raster_worker_pool,
176 scoped_ptr<RasterWorkerPool> direct_raster_worker_pool,
176 size_t max_raster_usage_bytes, 177 size_t max_raster_usage_bytes,
177 RenderingStatsInstrumentation* rendering_stats_instrumentation, 178 RenderingStatsInstrumentation* rendering_stats_instrumentation,
178 bool use_rasterize_on_demand) 179 bool use_rasterize_on_demand)
179 : client_(client), 180 : client_(client),
180 resource_pool_( 181 resource_pool_(
181 ResourcePool::Create(resource_provider, 182 ResourcePool::Create(resource_provider,
182 raster_worker_pool->GetResourceTarget(), 183 raster_worker_pool->GetResourceTarget(),
183 raster_worker_pool->GetResourceFormat())), 184 raster_worker_pool->GetResourceFormat())),
184 raster_worker_pool_(raster_worker_pool.Pass()), 185 raster_worker_pool_(raster_worker_pool.Pass()),
186 direct_raster_worker_pool_(direct_raster_worker_pool.Pass()),
185 prioritized_tiles_dirty_(false), 187 prioritized_tiles_dirty_(false),
186 all_tiles_that_need_to_be_rasterized_have_memory_(true), 188 all_tiles_that_need_to_be_rasterized_have_memory_(true),
187 all_tiles_required_for_activation_have_memory_(true), 189 all_tiles_required_for_activation_have_memory_(true),
188 memory_required_bytes_(0), 190 memory_required_bytes_(0),
189 memory_nice_to_have_bytes_(0), 191 memory_nice_to_have_bytes_(0),
190 bytes_releasable_(0), 192 bytes_releasable_(0),
191 resources_releasable_(0), 193 resources_releasable_(0),
192 max_raster_usage_bytes_(max_raster_usage_bytes), 194 max_raster_usage_bytes_(max_raster_usage_bytes),
193 ever_exceeded_memory_budget_(false), 195 ever_exceeded_memory_budget_(false),
194 rendering_stats_instrumentation_(rendering_stats_instrumentation), 196 rendering_stats_instrumentation_(rendering_stats_instrumentation),
195 did_initialize_visible_tile_(false), 197 did_initialize_visible_tile_(false),
196 did_check_for_completed_tasks_since_last_schedule_tasks_(true), 198 did_check_for_completed_tasks_since_last_schedule_tasks_(true),
197 use_rasterize_on_demand_(use_rasterize_on_demand) { 199 use_rasterize_on_demand_(use_rasterize_on_demand) {
198 raster_worker_pool_->SetClient(this); 200 RasterWorkerPool* raster_worker_pools[NUM_RASTER_WORKER_POOL_TYPES] = {
201 raster_worker_pool_.get(), direct_raster_worker_pool_.get(), };
vmpstr 2014/02/14 23:47:24 nit: No need for the trailing comma.
reveman 2014/02/15 00:02:45 Done.
202 raster_worker_pool_delegate_ = RasterWorkerPoolDelegate::Create(
203 this,
204 raster_worker_pools,
205 raster_worker_pools + arraysize(raster_worker_pools));
vmpstr 2014/02/14 23:47:24 nit: Maybe pass NUM_RASTER_WORKER_POOL_TYPES inste
reveman 2014/02/15 00:02:45 Done. Passing arraysize.
199 } 206 }
200 207
201 TileManager::~TileManager() { 208 TileManager::~TileManager() {
202 // Reset global state and manage. This should cause 209 // Reset global state and manage. This should cause
203 // our memory usage to drop to zero. 210 // our memory usage to drop to zero.
204 global_state_ = GlobalStateThatImpactsTilePriority(); 211 global_state_ = GlobalStateThatImpactsTilePriority();
205 212
206 CleanUpReleasedTiles(); 213 CleanUpReleasedTiles();
207 DCHECK_EQ(0u, tiles_.size()); 214 DCHECK_EQ(0u, tiles_.size());
208 215
209 RasterWorkerPool::RasterTask::Queue empty; 216 RasterWorkerPool::RasterTask::Queue empty[NUM_RASTER_WORKER_POOL_TYPES];
210 raster_worker_pool_->ScheduleTasks(&empty); 217 raster_worker_pool_delegate_->ScheduleTasks(empty);
211 218
212 // This should finish all pending tasks and release any uninitialized 219 // This should finish all pending tasks and release any uninitialized
213 // resources. 220 // resources.
214 raster_worker_pool_->Shutdown(); 221 raster_worker_pool_delegate_->Shutdown();
215 raster_worker_pool_->CheckForCompletedTasks(); 222 raster_worker_pool_delegate_->CheckForCompletedTasks();
216 223
217 DCHECK_EQ(0u, bytes_releasable_); 224 DCHECK_EQ(0u, bytes_releasable_);
218 DCHECK_EQ(0u, resources_releasable_); 225 DCHECK_EQ(0u, resources_releasable_);
219 } 226 }
220 227
221 void TileManager::Release(Tile* tile) { 228 void TileManager::Release(Tile* tile) {
222 prioritized_tiles_dirty_ = true; 229 prioritized_tiles_dirty_ = true;
223 released_tiles_.push_back(tile); 230 released_tiles_.push_back(tile);
224 } 231 }
225 232
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
268 } 275 }
269 276
270 void TileManager::DidFinishRunningTasks() { 277 void TileManager::DidFinishRunningTasks() {
271 TRACE_EVENT0("cc", "TileManager::DidFinishRunningTasks"); 278 TRACE_EVENT0("cc", "TileManager::DidFinishRunningTasks");
272 279
273 // When OOM, keep re-assigning memory until we reach a steady state 280 // When OOM, keep re-assigning memory until we reach a steady state
274 // where top-priority tiles are initialized. 281 // where top-priority tiles are initialized.
275 if (all_tiles_that_need_to_be_rasterized_have_memory_) 282 if (all_tiles_that_need_to_be_rasterized_have_memory_)
276 return; 283 return;
277 284
278 raster_worker_pool_->CheckForCompletedTasks(); 285 raster_worker_pool_delegate_->CheckForCompletedTasks();
279 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; 286 did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
280 287
281 TileVector tiles_that_need_to_be_rasterized; 288 TileVector tiles_that_need_to_be_rasterized;
282 AssignGpuMemoryToTiles(&prioritized_tiles_, 289 AssignGpuMemoryToTiles(&prioritized_tiles_,
283 &tiles_that_need_to_be_rasterized); 290 &tiles_that_need_to_be_rasterized);
284 291
285 // |tiles_that_need_to_be_rasterized| will be empty when we reach a 292 // |tiles_that_need_to_be_rasterized| will be empty when we reach a
286 // steady memory state. Keep scheduling tasks until we reach this state. 293 // steady memory state. Keep scheduling tasks until we reach this state.
287 if (!tiles_that_need_to_be_rasterized.empty()) { 294 if (!tiles_that_need_to_be_rasterized.empty()) {
288 ScheduleTasks(tiles_that_need_to_be_rasterized); 295 ScheduleTasks(tiles_that_need_to_be_rasterized);
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after
463 prioritized_tiles_dirty_ = true; 470 prioritized_tiles_dirty_ = true;
464 resource_pool_->SetResourceUsageLimits( 471 resource_pool_->SetResourceUsageLimits(
465 global_state_.memory_limit_in_bytes, 472 global_state_.memory_limit_in_bytes,
466 global_state_.unused_memory_limit_in_bytes, 473 global_state_.unused_memory_limit_in_bytes,
467 global_state_.num_resources_limit); 474 global_state_.num_resources_limit);
468 } 475 }
469 476
470 // We need to call CheckForCompletedTasks() once in-between each call 477 // We need to call CheckForCompletedTasks() once in-between each call
471 // to ScheduleTasks() to prevent canceled tasks from being scheduled. 478 // to ScheduleTasks() to prevent canceled tasks from being scheduled.
472 if (!did_check_for_completed_tasks_since_last_schedule_tasks_) { 479 if (!did_check_for_completed_tasks_since_last_schedule_tasks_) {
473 raster_worker_pool_->CheckForCompletedTasks(); 480 raster_worker_pool_delegate_->CheckForCompletedTasks();
474 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; 481 did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
475 } 482 }
476 483
477 UpdatePrioritizedTileSetIfNeeded(); 484 UpdatePrioritizedTileSetIfNeeded();
478 485
479 TileVector tiles_that_need_to_be_rasterized; 486 TileVector tiles_that_need_to_be_rasterized;
480 AssignGpuMemoryToTiles(&prioritized_tiles_, 487 AssignGpuMemoryToTiles(&prioritized_tiles_,
481 &tiles_that_need_to_be_rasterized); 488 &tiles_that_need_to_be_rasterized);
482 489
483 // Finally, schedule rasterizer tasks. 490 // Finally, schedule rasterizer tasks.
484 ScheduleTasks(tiles_that_need_to_be_rasterized); 491 ScheduleTasks(tiles_that_need_to_be_rasterized);
485 492
486 TRACE_EVENT_INSTANT1("cc", 493 TRACE_EVENT_INSTANT1("cc",
487 "DidManage", 494 "DidManage",
488 TRACE_EVENT_SCOPE_THREAD, 495 TRACE_EVENT_SCOPE_THREAD,
489 "state", 496 "state",
490 TracedValue::FromValue(BasicStateAsValue().release())); 497 TracedValue::FromValue(BasicStateAsValue().release()));
491 498
492 TRACE_COUNTER_ID1("cc", 499 TRACE_COUNTER_ID1("cc",
493 "unused_memory_bytes", 500 "unused_memory_bytes",
494 this, 501 this,
495 resource_pool_->total_memory_usage_bytes() - 502 resource_pool_->total_memory_usage_bytes() -
496 resource_pool_->acquired_memory_usage_bytes()); 503 resource_pool_->acquired_memory_usage_bytes());
497 } 504 }
498 505
499 bool TileManager::UpdateVisibleTiles() { 506 bool TileManager::UpdateVisibleTiles() {
500 TRACE_EVENT0("cc", "TileManager::UpdateVisibleTiles"); 507 TRACE_EVENT0("cc", "TileManager::UpdateVisibleTiles");
501 508
502 raster_worker_pool_->CheckForCompletedTasks(); 509 raster_worker_pool_delegate_->CheckForCompletedTasks();
503 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; 510 did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
504 511
505 TRACE_EVENT_INSTANT1( 512 TRACE_EVENT_INSTANT1(
506 "cc", 513 "cc",
507 "DidUpdateVisibleTiles", 514 "DidUpdateVisibleTiles",
508 TRACE_EVENT_SCOPE_THREAD, 515 TRACE_EVENT_SCOPE_THREAD,
509 "stats", 516 "stats",
510 TracedValue::FromValue(RasterTaskCompletionStatsAsValue( 517 TracedValue::FromValue(RasterTaskCompletionStatsAsValue(
511 update_visible_tiles_stats_).release())); 518 update_visible_tiles_stats_).release()));
512 update_visible_tiles_stats_ = RasterTaskCompletionStats(); 519 update_visible_tiles_stats_ = RasterTaskCompletionStats();
(...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after
769 776
770 void TileManager::ScheduleTasks( 777 void TileManager::ScheduleTasks(
771 const TileVector& tiles_that_need_to_be_rasterized) { 778 const TileVector& tiles_that_need_to_be_rasterized) {
772 TRACE_EVENT1("cc", 779 TRACE_EVENT1("cc",
773 "TileManager::ScheduleTasks", 780 "TileManager::ScheduleTasks",
774 "count", 781 "count",
775 tiles_that_need_to_be_rasterized.size()); 782 tiles_that_need_to_be_rasterized.size());
776 783
777 DCHECK(did_check_for_completed_tasks_since_last_schedule_tasks_); 784 DCHECK(did_check_for_completed_tasks_since_last_schedule_tasks_);
778 785
779 raster_tasks_.Reset(); 786 for (size_t i = 0; i < NUM_RASTER_WORKER_POOL_TYPES; ++i)
787 raster_queue_[i].Reset();
780 788
781 // Build a new task queue containing all task currently needed. Tasks 789 // Build a new task queue containing all task currently needed. Tasks
782 // are added in order of priority, highest priority task first. 790 // are added in order of priority, highest priority task first.
783 for (TileVector::const_iterator it = tiles_that_need_to_be_rasterized.begin(); 791 for (TileVector::const_iterator it = tiles_that_need_to_be_rasterized.begin();
784 it != tiles_that_need_to_be_rasterized.end(); 792 it != tiles_that_need_to_be_rasterized.end();
785 ++it) { 793 ++it) {
786 Tile* tile = *it; 794 Tile* tile = *it;
787 ManagedTileState& mts = tile->managed_state(); 795 ManagedTileState& mts = tile->managed_state();
788 ManagedTileState::TileVersion& tile_version = 796 ManagedTileState::TileVersion& tile_version =
789 mts.tile_versions[mts.raster_mode]; 797 mts.tile_versions[mts.raster_mode];
790 798
791 DCHECK(tile_version.requires_resource()); 799 DCHECK(tile_version.requires_resource());
792 DCHECK(!tile_version.resource_); 800 DCHECK(!tile_version.resource_);
793 801
794 if (tile_version.raster_task_.is_null()) 802 if (tile_version.raster_task_.is_null())
795 tile_version.raster_task_ = CreateRasterTask(tile); 803 tile_version.raster_task_ = CreateRasterTask(tile);
796 804
797 raster_tasks_.Append(tile_version.raster_task_, 805 size_t pool_type = tile->use_gpu_rasterization()
798 tile->required_for_activation()); 806 ? RASTER_WORKER_POOL_TYPE_DIRECT
807 : RASTER_WORKER_POOL_TYPE_DEFAULT;
808
809 raster_queue_[pool_type]
810 .Append(tile_version.raster_task_, tile->required_for_activation());
799 } 811 }
800 812
801 // We must reduce the amount of unused resoruces before calling 813 // We must reduce the amount of unused resoruces before calling
802 // ScheduleTasks to prevent usage from rising above limits. 814 // ScheduleTasks to prevent usage from rising above limits.
803 resource_pool_->ReduceResourceUsage(); 815 resource_pool_->ReduceResourceUsage();
804 816
805 // Schedule running of |raster_tasks_|. This replaces any previously 817 // Schedule running of |raster_tasks_|. This replaces any previously
806 // scheduled tasks and effectively cancels all tasks not present 818 // scheduled tasks and effectively cancels all tasks not present
807 // in |raster_tasks_|. 819 // in |raster_tasks_|.
808 raster_worker_pool_->ScheduleTasks(&raster_tasks_); 820 raster_worker_pool_delegate_->ScheduleTasks(raster_queue_);
809 821
810 did_check_for_completed_tasks_since_last_schedule_tasks_ = false; 822 did_check_for_completed_tasks_since_last_schedule_tasks_ = false;
811 } 823 }
812 824
813 RasterWorkerPool::Task TileManager::CreateImageDecodeTask( 825 RasterWorkerPool::Task TileManager::CreateImageDecodeTask(
814 Tile* tile, 826 Tile* tile,
815 SkPixelRef* pixel_ref) { 827 SkPixelRef* pixel_ref) {
816 return RasterWorkerPool::CreateImageDecodeTask( 828 return RasterWorkerPool::CreateImageDecodeTask(
817 pixel_ref, 829 pixel_ref,
818 tile->layer_id(), 830 tile->layer_id(),
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
856 return RasterWorkerPool::CreateRasterTask( 868 return RasterWorkerPool::CreateRasterTask(
857 const_resource, 869 const_resource,
858 tile->picture_pile(), 870 tile->picture_pile(),
859 tile->content_rect(), 871 tile->content_rect(),
860 tile->contents_scale(), 872 tile->contents_scale(),
861 mts.raster_mode, 873 mts.raster_mode,
862 mts.resolution, 874 mts.resolution,
863 tile->layer_id(), 875 tile->layer_id(),
864 static_cast<const void*>(tile), 876 static_cast<const void*>(tile),
865 tile->source_frame_number(), 877 tile->source_frame_number(),
866 tile->use_gpu_rasterization(),
867 rendering_stats_instrumentation_, 878 rendering_stats_instrumentation_,
868 base::Bind(&TileManager::OnRasterTaskCompleted, 879 base::Bind(&TileManager::OnRasterTaskCompleted,
869 base::Unretained(this), 880 base::Unretained(this),
870 tile->id(), 881 tile->id(),
871 base::Passed(&resource), 882 base::Passed(&resource),
872 mts.raster_mode), 883 mts.raster_mode),
873 &decode_tasks); 884 &decode_tasks,
885 context_provider_);
874 } 886 }
875 887
876 void TileManager::OnImageDecodeTaskCompleted(int layer_id, 888 void TileManager::OnImageDecodeTaskCompleted(int layer_id,
877 SkPixelRef* pixel_ref, 889 SkPixelRef* pixel_ref,
878 bool was_canceled) { 890 bool was_canceled) {
879 // If the task was canceled, we need to clean it up 891 // If the task was canceled, we need to clean it up
880 // from |image_decode_tasks_|. 892 // from |image_decode_tasks_|.
881 if (!was_canceled) 893 if (!was_canceled)
882 return; 894 return;
883 895
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
957 flags)); 969 flags));
958 DCHECK(tiles_.find(tile->id()) == tiles_.end()); 970 DCHECK(tiles_.find(tile->id()) == tiles_.end());
959 971
960 tiles_[tile->id()] = tile; 972 tiles_[tile->id()] = tile;
961 used_layer_counts_[tile->layer_id()]++; 973 used_layer_counts_[tile->layer_id()]++;
962 prioritized_tiles_dirty_ = true; 974 prioritized_tiles_dirty_ = true;
963 return tile; 975 return tile;
964 } 976 }
965 977
966 } // namespace cc 978 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698