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

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

Issue 69343005: Added preliminary support for tile rasterization with Ganesh (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Reveman's comments. Created 7 years 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/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
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after
161 scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue()); 161 scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue());
162 state->SetInteger("completed_count", stats.completed_count); 162 state->SetInteger("completed_count", stats.completed_count);
163 state->SetInteger("canceled_count", stats.canceled_count); 163 state->SetInteger("canceled_count", stats.canceled_count);
164 return state.PassAs<base::Value>(); 164 return state.PassAs<base::Value>();
165 } 165 }
166 166
167 // static 167 // static
168 scoped_ptr<TileManager> TileManager::Create( 168 scoped_ptr<TileManager> TileManager::Create(
169 TileManagerClient* client, 169 TileManagerClient* client,
170 ResourceProvider* resource_provider, 170 ResourceProvider* resource_provider,
171 ContextProvider* context_provider,
171 size_t num_raster_threads, 172 size_t num_raster_threads,
172 RenderingStatsInstrumentation* rendering_stats_instrumentation, 173 RenderingStatsInstrumentation* rendering_stats_instrumentation,
174 bool use_gpu_rasterizing,
173 bool use_map_image, 175 bool use_map_image,
174 size_t max_transfer_buffer_usage_bytes, 176 size_t max_transfer_buffer_usage_bytes,
175 size_t max_raster_usage_bytes, 177 size_t max_raster_usage_bytes,
176 GLenum map_image_texture_target) { 178 GLenum map_image_texture_target) {
177 return make_scoped_ptr( 179 return make_scoped_ptr(
178 new TileManager(client, 180 new TileManager(client,
179 resource_provider, 181 resource_provider,
180 use_map_image ? 182 use_map_image ?
181 ImageRasterWorkerPool::Create( 183 ImageRasterWorkerPool::Create(
182 resource_provider, 184 resource_provider,
183 num_raster_threads, 185 num_raster_threads,
184 map_image_texture_target) : 186 map_image_texture_target) :
185 PixelBufferRasterWorkerPool::Create( 187 PixelBufferRasterWorkerPool::Create(
186 resource_provider, 188 resource_provider,
187 num_raster_threads, 189 num_raster_threads,
188 max_transfer_buffer_usage_bytes), 190 max_transfer_buffer_usage_bytes),
191 use_gpu_rasterizing ?
192 GpuRasterizer::Create(
193 context_provider, resource_provider) :
194 scoped_ptr<GpuRasterizer>(),
189 num_raster_threads, 195 num_raster_threads,
190 max_raster_usage_bytes, 196 max_raster_usage_bytes,
191 rendering_stats_instrumentation)); 197 rendering_stats_instrumentation));
192 } 198 }
193 199
194 TileManager::TileManager( 200 TileManager::TileManager(
195 TileManagerClient* client, 201 TileManagerClient* client,
196 ResourceProvider* resource_provider, 202 ResourceProvider* resource_provider,
197 scoped_ptr<RasterWorkerPool> raster_worker_pool, 203 scoped_ptr<RasterWorkerPool> raster_worker_pool,
204 scoped_ptr<GpuRasterizer> gpu_rasterizer,
198 size_t num_raster_threads, 205 size_t num_raster_threads,
199 size_t max_raster_usage_bytes, 206 size_t max_raster_usage_bytes,
200 RenderingStatsInstrumentation* rendering_stats_instrumentation) 207 RenderingStatsInstrumentation* rendering_stats_instrumentation)
201 : client_(client), 208 : client_(client),
202 resource_pool_(ResourcePool::Create( 209 resource_pool_(ResourcePool::Create(
203 resource_provider, 210 resource_provider,
204 raster_worker_pool->GetResourceTarget(), 211 raster_worker_pool->GetResourceTarget(),
205 raster_worker_pool->GetResourceFormat())), 212 raster_worker_pool->GetResourceFormat())),
206 raster_worker_pool_(raster_worker_pool.Pass()), 213 raster_worker_pool_(raster_worker_pool.Pass()),
214 gpu_rasterizer_(gpu_rasterizer.Pass()),
207 prioritized_tiles_dirty_(false), 215 prioritized_tiles_dirty_(false),
208 all_tiles_that_need_to_be_rasterized_have_memory_(true), 216 all_tiles_that_need_to_be_rasterized_have_memory_(true),
209 all_tiles_required_for_activation_have_memory_(true), 217 all_tiles_required_for_activation_have_memory_(true),
210 memory_required_bytes_(0), 218 memory_required_bytes_(0),
211 memory_nice_to_have_bytes_(0), 219 memory_nice_to_have_bytes_(0),
212 bytes_releasable_(0), 220 bytes_releasable_(0),
213 resources_releasable_(0), 221 resources_releasable_(0),
214 max_raster_usage_bytes_(max_raster_usage_bytes), 222 max_raster_usage_bytes_(max_raster_usage_bytes),
215 ever_exceeded_memory_budget_(false), 223 ever_exceeded_memory_budget_(false),
216 rendering_stats_instrumentation_(rendering_stats_instrumentation), 224 rendering_stats_instrumentation_(rendering_stats_instrumentation),
217 did_initialize_visible_tile_(false), 225 did_initialize_visible_tile_(false),
218 did_check_for_completed_tasks_since_last_schedule_tasks_(true) { 226 did_check_for_completed_tasks_since_last_schedule_tasks_(true) {
219 raster_worker_pool_->SetClient(this); 227 raster_worker_pool_->SetClient(this);
228 if (gpu_rasterizer_)
229 gpu_rasterizer_->SetClient(this);
220 } 230 }
221 231
222 TileManager::~TileManager() { 232 TileManager::~TileManager() {
223 // Reset global state and manage. This should cause 233 // Reset global state and manage. This should cause
224 // our memory usage to drop to zero. 234 // our memory usage to drop to zero.
225 global_state_ = GlobalStateThatImpactsTilePriority(); 235 global_state_ = GlobalStateThatImpactsTilePriority();
226 236
227 CleanUpReleasedTiles(); 237 CleanUpReleasedTiles();
228 DCHECK_EQ(0u, tiles_.size()); 238 DCHECK_EQ(0u, tiles_.size());
229 239
(...skipping 357 matching lines...) Expand 10 before | Expand all | Expand 10 after
587 return requirements.PassAs<base::Value>(); 597 return requirements.PassAs<base::Value>();
588 } 598 }
589 599
590 RasterMode TileManager::DetermineRasterMode(const Tile* tile) const { 600 RasterMode TileManager::DetermineRasterMode(const Tile* tile) const {
591 DCHECK(tile); 601 DCHECK(tile);
592 DCHECK(tile->picture_pile()); 602 DCHECK(tile->picture_pile());
593 603
594 const ManagedTileState& mts = tile->managed_state(); 604 const ManagedTileState& mts = tile->managed_state();
595 RasterMode current_mode = mts.raster_mode; 605 RasterMode current_mode = mts.raster_mode;
596 606
607 // TODO(skaslev): Add proper a heuristic whether a tile
608 // should go for software or GPU rasterizing.
609 if (gpu_rasterizer_)
610 return GPU_RASTER_MODE;
597 RasterMode raster_mode = HIGH_QUALITY_RASTER_MODE; 611 RasterMode raster_mode = HIGH_QUALITY_RASTER_MODE;
598 if (tile->managed_state().resolution == LOW_RESOLUTION) 612 if (tile->managed_state().resolution == LOW_RESOLUTION)
599 raster_mode = LOW_QUALITY_RASTER_MODE; 613 raster_mode = LOW_QUALITY_RASTER_MODE;
600 else if (tile->can_use_lcd_text()) 614 else if (tile->can_use_lcd_text())
601 raster_mode = HIGH_QUALITY_RASTER_MODE; 615 raster_mode = HIGH_QUALITY_RASTER_MODE;
602 else if (mts.tile_versions[current_mode].has_text_ || 616 else if (mts.tile_versions[current_mode].has_text_ ||
603 !mts.tile_versions[current_mode].IsReadyToDraw()) 617 !mts.tile_versions[current_mode].IsReadyToDraw())
604 raster_mode = HIGH_QUALITY_NO_LCD_RASTER_MODE; 618 raster_mode = HIGH_QUALITY_NO_LCD_RASTER_MODE;
605 619
606 return std::min(raster_mode, current_mode); 620 return std::min(raster_mode, current_mode);
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after
809 it != tiles_that_need_to_be_rasterized.end(); 823 it != tiles_that_need_to_be_rasterized.end();
810 ++it) { 824 ++it) {
811 Tile* tile = *it; 825 Tile* tile = *it;
812 ManagedTileState& mts = tile->managed_state(); 826 ManagedTileState& mts = tile->managed_state();
813 ManagedTileState::TileVersion& tile_version = 827 ManagedTileState::TileVersion& tile_version =
814 mts.tile_versions[mts.raster_mode]; 828 mts.tile_versions[mts.raster_mode];
815 829
816 DCHECK(tile_version.requires_resource()); 830 DCHECK(tile_version.requires_resource());
817 DCHECK(!tile_version.resource_); 831 DCHECK(!tile_version.resource_);
818 832
819 if (tile_version.raster_task_.is_null()) 833 if (mts.raster_mode == GPU_RASTER_MODE) {
820 tile_version.raster_task_ = CreateRasterTask(tile); 834 CreateGpuRasterTask(tile);
835 } else {
836 if (tile_version.raster_task_.is_null())
837 tile_version.raster_task_ = CreateRasterTask(tile);
821 838
822 tasks.Append(tile_version.raster_task_, tile->required_for_activation()); 839 tasks.Append(tile_version.raster_task_, tile->required_for_activation());
840 }
823 } 841 }
824 842
825 // We must reduce the amount of unused resoruces before calling 843 // We must reduce the amount of unused resoruces before calling
826 // ScheduleTasks to prevent usage from rising above limits. 844 // ScheduleTasks to prevent usage from rising above limits.
827 resource_pool_->ReduceResourceUsage(); 845 resource_pool_->ReduceResourceUsage();
828 846
829 // Schedule running of |tasks|. This replaces any previously 847 // Schedule running of |tasks|. This replaces any previously
830 // scheduled tasks and effectively cancels all tasks not present 848 // scheduled tasks and effectively cancels all tasks not present
831 // in |tasks|. 849 // in |tasks|.
832 raster_worker_pool_->ScheduleTasks(&tasks); 850 raster_worker_pool_->ScheduleTasks(&tasks);
833 851
834 did_check_for_completed_tasks_since_last_schedule_tasks_ = false; 852 did_check_for_completed_tasks_since_last_schedule_tasks_ = false;
853
854 if (gpu_rasterizer_)
855 gpu_rasterizer_->FlushRasterTasks(rendering_stats_instrumentation_);
835 } 856 }
836 857
837 RasterWorkerPool::Task TileManager::CreateImageDecodeTask( 858 RasterWorkerPool::Task TileManager::CreateImageDecodeTask(
838 Tile* tile, skia::LazyPixelRef* pixel_ref) { 859 Tile* tile, skia::LazyPixelRef* pixel_ref) {
839 return RasterWorkerPool::CreateImageDecodeTask( 860 return RasterWorkerPool::CreateImageDecodeTask(
840 pixel_ref, 861 pixel_ref,
841 tile->layer_id(), 862 tile->layer_id(),
842 rendering_stats_instrumentation_, 863 rendering_stats_instrumentation_,
843 base::Bind(&TileManager::OnImageDecodeTaskCompleted, 864 base::Bind(&TileManager::OnImageDecodeTaskCompleted,
844 base::Unretained(this), 865 base::Unretained(this),
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
889 tile->source_frame_number(), 910 tile->source_frame_number(),
890 rendering_stats_instrumentation_, 911 rendering_stats_instrumentation_,
891 base::Bind(&TileManager::OnRasterTaskCompleted, 912 base::Bind(&TileManager::OnRasterTaskCompleted,
892 base::Unretained(this), 913 base::Unretained(this),
893 tile->id(), 914 tile->id(),
894 base::Passed(&resource), 915 base::Passed(&resource),
895 mts.raster_mode), 916 mts.raster_mode),
896 &decode_tasks); 917 &decode_tasks);
897 } 918 }
898 919
920 void TileManager::CreateGpuRasterTask(Tile* tile) {
921 DCHECK(gpu_rasterizer_);
922
923 scoped_ptr<ResourcePool::Resource> resource =
924 resource_pool_->AcquireResource(tile->tile_size_.size());
925 gpu_rasterizer_->PushRasterTask(tile, resource.Pass());
926 }
927
899 void TileManager::OnImageDecodeTaskCompleted( 928 void TileManager::OnImageDecodeTaskCompleted(
900 int layer_id, 929 int layer_id,
901 skia::LazyPixelRef* pixel_ref, 930 skia::LazyPixelRef* pixel_ref,
902 bool was_canceled) { 931 bool was_canceled) {
903 // If the task was canceled, we need to clean it up 932 // If the task was canceled, we need to clean it up
904 // from |image_decode_tasks_|. 933 // from |image_decode_tasks_|.
905 if (!was_canceled) 934 if (!was_canceled)
906 return; 935 return;
907 936
908 LayerPixelRefTaskMap::iterator layer_it = 937 LayerPixelRefTaskMap::iterator layer_it =
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
957 986
958 bytes_releasable_ += BytesConsumedIfAllocated(tile); 987 bytes_releasable_ += BytesConsumedIfAllocated(tile);
959 ++resources_releasable_; 988 ++resources_releasable_;
960 } 989 }
961 990
962 FreeUnusedResourcesForTile(tile); 991 FreeUnusedResourcesForTile(tile);
963 if (tile->priority(ACTIVE_TREE).distance_to_visible_in_pixels == 0) 992 if (tile->priority(ACTIVE_TREE).distance_to_visible_in_pixels == 0)
964 did_initialize_visible_tile_ = true; 993 did_initialize_visible_tile_ = true;
965 } 994 }
966 995
996 void TileManager::OnGpuRasterTaskCompleted(
997 Tile* tile,
998 scoped_ptr<ResourcePool::Resource> resource,
999 bool was_canceled) {
1000 ManagedTileState& mts = tile->managed_state();
1001 ManagedTileState::TileVersion& tile_version =
1002 mts.tile_versions[GPU_RASTER_MODE];
1003 DCHECK(tile_version.raster_task_.is_null());
1004
1005 if (was_canceled) {
1006 ++update_visible_tiles_stats_.canceled_count;
1007 resource_pool_->ReleaseResource(resource.Pass());
1008 return;
1009 }
1010
1011 ++update_visible_tiles_stats_.completed_count;
1012
1013 tile_version.set_use_resource();
1014 tile_version.resource_ = resource.Pass();
1015
1016 bytes_releasable_ += BytesConsumedIfAllocated(tile);
1017 ++resources_releasable_;
1018
1019 FreeUnusedResourcesForTile(tile);
1020 if (tile->priority(ACTIVE_TREE).distance_to_visible_in_pixels == 0)
1021 did_initialize_visible_tile_ = true;
1022 }
1023
967 scoped_refptr<Tile> TileManager::CreateTile(PicturePileImpl* picture_pile, 1024 scoped_refptr<Tile> TileManager::CreateTile(PicturePileImpl* picture_pile,
968 gfx::Size tile_size, 1025 gfx::Size tile_size,
969 gfx::Rect content_rect, 1026 gfx::Rect content_rect,
970 gfx::Rect opaque_rect, 1027 gfx::Rect opaque_rect,
971 float contents_scale, 1028 float contents_scale,
972 int layer_id, 1029 int layer_id,
973 int source_frame_number, 1030 int source_frame_number,
974 bool can_use_lcd_text) { 1031 bool can_use_lcd_text) {
975 scoped_refptr<Tile> tile = make_scoped_refptr(new Tile(this, 1032 scoped_refptr<Tile> tile = make_scoped_refptr(new Tile(this,
976 picture_pile, 1033 picture_pile,
977 tile_size, 1034 tile_size,
978 content_rect, 1035 content_rect,
979 opaque_rect, 1036 opaque_rect,
980 contents_scale, 1037 contents_scale,
981 layer_id, 1038 layer_id,
982 source_frame_number, 1039 source_frame_number,
983 can_use_lcd_text)); 1040 can_use_lcd_text));
984 DCHECK(tiles_.find(tile->id()) == tiles_.end()); 1041 DCHECK(tiles_.find(tile->id()) == tiles_.end());
985 1042
986 tiles_[tile->id()] = tile; 1043 tiles_[tile->id()] = tile;
987 used_layer_counts_[tile->layer_id()]++; 1044 used_layer_counts_[tile->layer_id()]++;
988 prioritized_tiles_dirty_ = true; 1045 prioritized_tiles_dirty_ = true;
989 return tile; 1046 return tile;
990 } 1047 }
991 1048
992 } // namespace cc 1049 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698