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

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: Fix cc_perftests compile error. 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,
173 bool use_map_image, 174 bool use_map_image,
174 size_t max_transfer_buffer_usage_bytes, 175 size_t max_transfer_buffer_usage_bytes,
175 size_t max_raster_usage_bytes, 176 size_t max_raster_usage_bytes,
176 GLenum map_image_texture_target) { 177 GLenum map_image_texture_target) {
177 return make_scoped_ptr( 178 return make_scoped_ptr(
178 new TileManager(client, 179 new TileManager(client,
179 resource_provider, 180 resource_provider,
181 context_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),
189 num_raster_threads, 191 num_raster_threads,
190 max_raster_usage_bytes, 192 max_raster_usage_bytes,
191 rendering_stats_instrumentation)); 193 rendering_stats_instrumentation));
192 } 194 }
193 195
194 TileManager::TileManager( 196 TileManager::TileManager(
195 TileManagerClient* client, 197 TileManagerClient* client,
196 ResourceProvider* resource_provider, 198 ResourceProvider* resource_provider,
199 ContextProvider* context_provider,
197 scoped_ptr<RasterWorkerPool> raster_worker_pool, 200 scoped_ptr<RasterWorkerPool> raster_worker_pool,
198 size_t num_raster_threads, 201 size_t num_raster_threads,
199 size_t max_raster_usage_bytes, 202 size_t max_raster_usage_bytes,
200 RenderingStatsInstrumentation* rendering_stats_instrumentation) 203 RenderingStatsInstrumentation* rendering_stats_instrumentation)
201 : client_(client), 204 : client_(client),
202 resource_pool_(ResourcePool::Create( 205 resource_pool_(ResourcePool::Create(
203 resource_provider, 206 resource_provider,
204 raster_worker_pool->GetResourceTarget(), 207 raster_worker_pool->GetResourceTarget(),
205 raster_worker_pool->GetResourceFormat())), 208 raster_worker_pool->GetResourceFormat())),
206 raster_worker_pool_(raster_worker_pool.Pass()), 209 raster_worker_pool_(raster_worker_pool.Pass()),
210 gpu_rasterizer_(GpuRasterizer::Create(
211 context_provider, resource_provider)),
207 prioritized_tiles_dirty_(false), 212 prioritized_tiles_dirty_(false),
208 all_tiles_that_need_to_be_rasterized_have_memory_(true), 213 all_tiles_that_need_to_be_rasterized_have_memory_(true),
209 all_tiles_required_for_activation_have_memory_(true), 214 all_tiles_required_for_activation_have_memory_(true),
210 memory_required_bytes_(0), 215 memory_required_bytes_(0),
211 memory_nice_to_have_bytes_(0), 216 memory_nice_to_have_bytes_(0),
212 bytes_releasable_(0), 217 bytes_releasable_(0),
213 resources_releasable_(0), 218 resources_releasable_(0),
214 max_raster_usage_bytes_(max_raster_usage_bytes), 219 max_raster_usage_bytes_(max_raster_usage_bytes),
215 ever_exceeded_memory_budget_(false), 220 ever_exceeded_memory_budget_(false),
216 rendering_stats_instrumentation_(rendering_stats_instrumentation), 221 rendering_stats_instrumentation_(rendering_stats_instrumentation),
217 did_initialize_visible_tile_(false), 222 did_initialize_visible_tile_(false),
218 did_check_for_completed_tasks_since_last_schedule_tasks_(true) { 223 did_check_for_completed_tasks_since_last_schedule_tasks_(true) {
219 raster_worker_pool_->SetClient(this); 224 raster_worker_pool_->SetClient(this);
225 gpu_rasterizer_->SetClient(this);
220 } 226 }
221 227
222 TileManager::~TileManager() { 228 TileManager::~TileManager() {
223 // Reset global state and manage. This should cause 229 // Reset global state and manage. This should cause
224 // our memory usage to drop to zero. 230 // our memory usage to drop to zero.
225 global_state_ = GlobalStateThatImpactsTilePriority(); 231 global_state_ = GlobalStateThatImpactsTilePriority();
226 232
227 CleanUpReleasedTiles(); 233 CleanUpReleasedTiles();
228 DCHECK_EQ(0u, tiles_.size()); 234 DCHECK_EQ(0u, tiles_.size());
229 235
(...skipping 579 matching lines...) Expand 10 before | Expand all | Expand 10 after
809 it != tiles_that_need_to_be_rasterized.end(); 815 it != tiles_that_need_to_be_rasterized.end();
810 ++it) { 816 ++it) {
811 Tile* tile = *it; 817 Tile* tile = *it;
812 ManagedTileState& mts = tile->managed_state(); 818 ManagedTileState& mts = tile->managed_state();
813 ManagedTileState::TileVersion& tile_version = 819 ManagedTileState::TileVersion& tile_version =
814 mts.tile_versions[mts.raster_mode]; 820 mts.tile_versions[mts.raster_mode];
815 821
816 DCHECK(tile_version.requires_resource()); 822 DCHECK(tile_version.requires_resource());
817 DCHECK(!tile_version.resource_); 823 DCHECK(!tile_version.resource_);
818 824
819 if (tile_version.raster_task_.is_null()) 825 if (tile->use_gpu_rasterizer()) {
820 tile_version.raster_task_ = CreateRasterTask(tile); 826 CreateGpuRasterTask(tile);
827 } else {
828 if (tile_version.raster_task_.is_null())
829 tile_version.raster_task_ = CreateRasterTask(tile);
821 830
822 tasks.Append(tile_version.raster_task_, tile->required_for_activation()); 831 tasks.Append(tile_version.raster_task_, tile->required_for_activation());
832 }
823 } 833 }
824 834
825 // We must reduce the amount of unused resoruces before calling 835 // We must reduce the amount of unused resoruces before calling
826 // ScheduleTasks to prevent usage from rising above limits. 836 // ScheduleTasks to prevent usage from rising above limits.
827 resource_pool_->ReduceResourceUsage(); 837 resource_pool_->ReduceResourceUsage();
828 838
829 // Schedule running of |tasks|. This replaces any previously 839 // Schedule running of |tasks|. This replaces any previously
830 // scheduled tasks and effectively cancels all tasks not present 840 // scheduled tasks and effectively cancels all tasks not present
831 // in |tasks|. 841 // in |tasks|.
832 raster_worker_pool_->ScheduleTasks(&tasks); 842 raster_worker_pool_->ScheduleTasks(&tasks);
833 843
834 did_check_for_completed_tasks_since_last_schedule_tasks_ = false; 844 did_check_for_completed_tasks_since_last_schedule_tasks_ = false;
845
846 gpu_rasterizer_->FlushRasterTasks(rendering_stats_instrumentation_);
835 } 847 }
836 848
837 RasterWorkerPool::Task TileManager::CreateImageDecodeTask( 849 RasterWorkerPool::Task TileManager::CreateImageDecodeTask(
838 Tile* tile, skia::LazyPixelRef* pixel_ref) { 850 Tile* tile, skia::LazyPixelRef* pixel_ref) {
839 return RasterWorkerPool::CreateImageDecodeTask( 851 return RasterWorkerPool::CreateImageDecodeTask(
840 pixel_ref, 852 pixel_ref,
841 tile->layer_id(), 853 tile->layer_id(),
842 rendering_stats_instrumentation_, 854 rendering_stats_instrumentation_,
843 base::Bind(&TileManager::OnImageDecodeTaskCompleted, 855 base::Bind(&TileManager::OnImageDecodeTaskCompleted,
844 base::Unretained(this), 856 base::Unretained(this),
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
889 tile->source_frame_number(), 901 tile->source_frame_number(),
890 rendering_stats_instrumentation_, 902 rendering_stats_instrumentation_,
891 base::Bind(&TileManager::OnRasterTaskCompleted, 903 base::Bind(&TileManager::OnRasterTaskCompleted,
892 base::Unretained(this), 904 base::Unretained(this),
893 tile->id(), 905 tile->id(),
894 base::Passed(&resource), 906 base::Passed(&resource),
895 mts.raster_mode), 907 mts.raster_mode),
896 &decode_tasks); 908 &decode_tasks);
897 } 909 }
898 910
911 void TileManager::CreateGpuRasterTask(Tile* tile) {
912 scoped_ptr<ResourcePool::Resource> resource =
913 resource_pool_->AcquireResource(tile->tile_size_.size());
914 gpu_rasterizer_->PushRasterTask(tile, resource.Pass());
915 }
916
899 void TileManager::OnImageDecodeTaskCompleted( 917 void TileManager::OnImageDecodeTaskCompleted(
900 int layer_id, 918 int layer_id,
901 skia::LazyPixelRef* pixel_ref, 919 skia::LazyPixelRef* pixel_ref,
902 bool was_canceled) { 920 bool was_canceled) {
903 // If the task was canceled, we need to clean it up 921 // If the task was canceled, we need to clean it up
904 // from |image_decode_tasks_|. 922 // from |image_decode_tasks_|.
905 if (!was_canceled) 923 if (!was_canceled)
906 return; 924 return;
907 925
908 LayerPixelRefTaskMap::iterator layer_it = 926 LayerPixelRefTaskMap::iterator layer_it =
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
957 975
958 bytes_releasable_ += BytesConsumedIfAllocated(tile); 976 bytes_releasable_ += BytesConsumedIfAllocated(tile);
959 ++resources_releasable_; 977 ++resources_releasable_;
960 } 978 }
961 979
962 FreeUnusedResourcesForTile(tile); 980 FreeUnusedResourcesForTile(tile);
963 if (tile->priority(ACTIVE_TREE).distance_to_visible_in_pixels == 0) 981 if (tile->priority(ACTIVE_TREE).distance_to_visible_in_pixels == 0)
964 did_initialize_visible_tile_ = true; 982 did_initialize_visible_tile_ = true;
965 } 983 }
966 984
985 void TileManager::OnGpuRasterTaskCompleted(
986 Tile* tile,
987 scoped_ptr<ResourcePool::Resource> resource,
988 bool was_canceled) {
989 ManagedTileState& mts = tile->managed_state();
990 ManagedTileState::TileVersion& tile_version =
991 mts.tile_versions[mts.raster_mode];
992 DCHECK(tile_version.raster_task_.is_null());
993
994 if (was_canceled) {
995 ++update_visible_tiles_stats_.canceled_count;
996 resource_pool_->ReleaseResource(resource.Pass());
997 return;
998 }
999
1000 ++update_visible_tiles_stats_.completed_count;
1001
1002 tile_version.set_use_resource();
1003 tile_version.resource_ = resource.Pass();
1004
1005 bytes_releasable_ += BytesConsumedIfAllocated(tile);
1006 ++resources_releasable_;
1007
1008 FreeUnusedResourcesForTile(tile);
1009 if (tile->priority(ACTIVE_TREE).distance_to_visible_in_pixels == 0)
1010 did_initialize_visible_tile_ = true;
1011 }
1012
967 scoped_refptr<Tile> TileManager::CreateTile(PicturePileImpl* picture_pile, 1013 scoped_refptr<Tile> TileManager::CreateTile(PicturePileImpl* picture_pile,
968 gfx::Size tile_size, 1014 gfx::Size tile_size,
969 gfx::Rect content_rect, 1015 gfx::Rect content_rect,
970 gfx::Rect opaque_rect, 1016 gfx::Rect opaque_rect,
971 float contents_scale, 1017 float contents_scale,
972 int layer_id, 1018 int layer_id,
973 int source_frame_number, 1019 int source_frame_number,
974 bool can_use_lcd_text) { 1020 bool can_use_lcd_text,
1021 bool use_gpu_rasterizer) {
975 scoped_refptr<Tile> tile = make_scoped_refptr(new Tile(this, 1022 scoped_refptr<Tile> tile = make_scoped_refptr(new Tile(this,
976 picture_pile, 1023 picture_pile,
977 tile_size, 1024 tile_size,
978 content_rect, 1025 content_rect,
979 opaque_rect, 1026 opaque_rect,
980 contents_scale, 1027 contents_scale,
981 layer_id, 1028 layer_id,
982 source_frame_number, 1029 source_frame_number,
983 can_use_lcd_text)); 1030 can_use_lcd_text,
1031 use_gpu_rasterizer));
984 DCHECK(tiles_.find(tile->id()) == tiles_.end()); 1032 DCHECK(tiles_.find(tile->id()) == tiles_.end());
985 1033
986 tiles_[tile->id()] = tile; 1034 tiles_[tile->id()] = tile;
987 used_layer_counts_[tile->layer_id()]++; 1035 used_layer_counts_[tile->layer_id()]++;
988 prioritized_tiles_dirty_ = true; 1036 prioritized_tiles_dirty_ = true;
989 return tile; 1037 return tile;
990 } 1038 }
991 1039
992 } // namespace cc 1040 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698